ablog

不器用で落着きのない技術者のメモ

STS のエンドポイントを .aws/config で指定する方法

STSのエンドポイントを .aws/config で指定する方法。

  • .~/aws/config
[profile dev]
services = custom-endpoint

[services custom-endpoint]
s3 = endpoint_url = 
sts = endpoint_url = 

DX->VPC->S3 への接続がタイムアウトした時の切り分けと対処

事象

  • オンプレのデータセンターにある Linux サーバから Direct Connect -> VPC -> VPC Endpoint -> S3 にアクセスしようとするとタイムアウトする。
$ aws s3 ls --profile s3_access --endpoint-url https://bucket.vpce-********.s3.ap-northeast-1.vpce.amazonaws.com s3://s3-data-prod-********-ap-northeast-1 --debug

...

  File "/usr/lib/python3.9/site-packages/urllib3/connection.py", line 174, in _new_conn
    raise ConnectTimeoutError(
urllib3.exceptions.ConnectTimeoutError: (<botocore.awsrequest.AWSHTTPSConnection object at 0x7f9469a838b0>, 'Connection to sts.amazonaws.com timed out. (connect timeout=60)')

確認ポイント

  • S3 の VPC エンドポイント(Interface型)が作成されているか。
  • STSVPC エンドポイント(Interface型)が作成されているか。
  • AWS CLI で S3 の --endpoint-url で VPC エンドポイントを指定しているか。

切り分け方法

$ aws ... --debug
  • S3 の VPCE エンドポイントにTCP接続を確立できているか
$ telnet https://bucket.vpce-********.s3.ap-northeast-1.vpce.amazonaws.com 443
  • STS の VPCE エンドポイントにTCP接続を確立できているか
$ telnet https://vpce-********-********.sts.ap-northeast-1.vpce.amazonaws.com 443
  • STSVPC エンドポイント経由でアクセスできるか
$ aws sts get-caller-identity --endpoint-url https://vpce-********-********.sts.ap-northeast-1.vpce.amazonaws.com --debug

...

2024-08-01 16:03:40,713 - MainThread - urllib3.connectionpool - DEBUG - Starting new HTTPS connection (3): vpce-********-********.sts.ap-northeast-1.vpce.amazonaws.com:443

...

Connect timeout on endpoint URL: "https://vpce-********-********.sts.ap-northeast-1.vpce.amazonaws.com/"

IAMユーザーのクレデンシャルで認証後、スイッチロールして S3 にアクセスする設定

AWS CLI で IAM ユーザーのクレデンシャルで認証して、スイッチロールして S3 にアクセスする設定。

実行コマンド
$ aws s3 ls  --profile s3_access --endpoint-url https://bucket.vpce-********-********.s3.ap-northeast-1.vpce.amazonaws.com
  • IAMロールで認証後にスイッチロールするので、STSVPC エンドポイントがないと失敗する。
2024-07-31 05:05:46,977 - MainThread - urllib3.connectionpool - DEBUG - Starting new HTTPS connection (2): sts.ap-northeast-1.amazonaws.com:443

AWS 側の設定

IAM ユーザー: s3-upload-user
  • アタッチする IAM ポリシー
    • AmazonS3ReadOnlyAccess(AWS管理)
    • s3-upload-policy(カスタマー管理)
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole"
            ],
            "Resource": [
                "arn:aws:iam::123456789012:role/s3-upload-role"
            ]
        }
    ]
}
  • クレデンシャルを発行して、AWS CLI 側で設定する
IAMロール: s3-upload-role
  • アタッチする IAM ポリシー
    • AmazonS3FullAccess(AWS管理)
  • 信頼関係
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/s3-upload-user"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
VPCエンドポイント
  • com.amazonaws.ap-northeast-1.s3(Interface型)
  • com.amazonaws.ap-northeast-1.sts(Interface型)

クライアント側設定

  • ~/.aws/config
[profile s3_access]
region = ap-northeast-1
role_arn = arn:aws:iam::123456789012:role/s3-upload-role
source_profile=s3_access
  • ~/.aws/credential
[s3_access]
aws_access_key_id = ********
aws_secret_access_key = ********

筋トレ分割法

ここ数年自重トレーニングしてたけど、久しぶりにジムを再開したので、分割法をメモ。

  • 分割する部位
    • 肩・胸・腕
      • ダンベル(肩)
      • ダンベル(腕)
      • チェストプレス
      • ショルダープレス
      • アシストディップ
      • アシストチン
    • 腹筋・背筋
      • アブドミナル
      • トーソ・ローテーション
      • プルダウン
      • バックエクステンション
    • 背中
      • ラットプルダウン
      • ダンベル(背中)
  • 回数とセット数
    • 10回 x 3 セット(1セット目で10回が限界の重量にして、2セット以降は回数減らしてOK)
  • インターバル
    • 同一部位は中4〜5日空ける(追込んで筋肉痛になって完全回復してから次回同じ部位をトレーニング)
  • 意識すること
    • 1セット目10回で限界の重量、効かせること、フォーム、TUT(Time Under Tension)を意識する。
  • 食事
    • タンパク質と一緒に炭水化物、ビタミンを摂取するよう心がける
    • 筋トレ前に炭水化物を摂る、タンパク質は筋トレ前に肉、筋トレ後に魚
    • 無塩ナッツ、ゆで卵、サラダ(きゅうり・トマト・シーチキン・オリーブオイル)、鶏肉、青魚(サバの煮付け等)、めかぶと納豆の
    • メニュー例
      • 朝:無塩ミックスナッツ、ゆで卵(3個)、サラダ
      • 昼:親子丼、味噌汁(豆腐、薄揚げ、しめじ、ネギ)
      • 夜:めかぶと納豆のネバネバ混ぜ、サバの煮付け、白米、味噌汁

AWS クラウドプラクティショナー

責任共有モデル


  • 継承される統制
    • 物理統制
    • 環境統制
  • 共有統制
  • お客様固有
    • お客様が特定のセキュリティ環境内でデータをルーティングまたは区分する必要がある、サービスおよび通信の保護またはゾーンセキュリティ。
AWS Well-Architected Framework
  • 運用上の優秀性
    • 運用上の優秀性は、開発をサポートし、ワークロードを効率的に実行し、運用に関する洞察を得て、ビジネス価値をもたらすためのサポートプロセスと手順を継続的に改善する能力のことです。
  • セキュリティ
    • セキュリティは、クラウドテクノロジーを活用し、セキュリティ体制の向上を可能にするやり方でデータ、システム、資産を保護する能力のことです。
  • 信頼性
    • 信頼性は、意図した機能を期待どおりに正しく一貫して実行するワークロードの能力のことです。これには、ワークロードのライフサイクル全体を通じてワークロードを運用およびテストする能力が含まれます。
  • パフォーマンス効率
    • パフォーマンス効率は、コンピューティングリソースを効率的に使ってシステム要件を満たし、需要の変化と技術の進化に合わせてこの効率性を維持する能力のことです。
  • コスト最適化
    • コスト最適化は、最も低い価格でシステムを運用してビジネス価値を実現する能力のことです。
  • サステナビリティ
    • サステナビリティの柱は持続可能性が高いリソース利用を推進します。これはプロビジョニングされたリソースのメリットを最大化し、必要な合計リソースを最小化することにより、エネルギー消費を削減し、ワークロードのすべてのコンポーネントにおいて効率を向上させ、持続可能性への影響を継続的に改善する能力のことです。
AWSサポートで提供されるもの
AWS CAF


ゾーン

  • Wavelengthは、標準の AWS コンピューティングおよびストレージサービスを通信事業者の 5G ネットワークのエッジにデプロイします
コスト
  • 総コスト計算ツール
  • AWS のコストと使用状況レポート
  • AWS Budgets
    • 予め予算を設定して、支出が予算額を上回った場合にアラート通知を設定することができる。
マイグレーションサービス
  • AWS Application Migration Service
    • アプリケーションとサーバーの移行を支援するサービス
その他
      • すべてのAWSアカウントにおける高優先度のセキュリティアラートおよびコンプライアンス状況を包括的に確認するサービス。
    • Amazon Detective
      • CloudTrail、VPC Flow Logs、GuardDutyのログや結果を自動的に収集し、潜在的なセキュリティの問題を調査・分析するサービス。
  • Marketplace で購入できるもの
    • ソフトウェア
    • サービス
  • Savings Plans の対象
    • EC2
    • Lambda
    • Fargate
  • AWS WAF を適用できるサービス
  • ユーザーアクティビティの記録
    • IAMアクセスアナライザー
      • 外部エンティティと共有されているS3バケットやIAMロールなどを分析し、セキュリティ上のリスクであるリソースとデータへの意図しないアクセスを特定
    • Access Advisor の Service Last Accessed Data
      • IAM エンティティが最後にAWSサービスにアクセスした日時を表示
  • リソースのシェア
    • Organizations のメンバーアカウント間で [Resource Access Manager:title=Resource Access Manager] と連携してリソースを共有できる。

Redshift で WLM のワークロードキューとアクセス権限を別のグルーピングで設定する

やりたいこと

  • Redshift のユーザーについて、WLM とアクセス権限を別々のグルーピングを行いたい。
  • WLM のワークロードキューで管理したいユーザー群とアクセス権限が同じユーザー群が異なるグルーピングになるため。

実装方法

  • WLM(Workload Mangagement)のワークロードキューはユーザーグループで設定し、アクセス権限制御はロールで設定する。
  • RBAC(Role Based Access Control)のアクセス権限機能(階層構造と継承など)を利用できるため、アクセス権限制御はロールを用いる。
  • WLM 以下の理由でグループを使用する
    • ロールはアクセス権限制御を行うための機能のため。例えば、
      GRANT ROLE ロール名 TO ユーザー名
      で設定するが、グループは
      create user ユーザー名 ... in group グループ名
      で設定する。
    • アクセス権限とWLMの管理を人間が見てわかりやすいようグループを使用する。いずれもロールで設定すると、ユーザーが GRANT されているロールのどれがアクセス権限制御用ロールでどれがWLMのワークロードキュー用ロールか判断できない(ロール名の命名規則やロールの定義を見ればわかるが)。

検証ポイント

  • ロールで設定通りのアクセス制御が行われること
  • グループでWLM制御が行われること
構成要素(グループ・ユーザー・ロール・スキーマ・テーブル)
  • ユーザーグループ
    • batch_group
      • batch_user_01
      • batch_user_02
    • adhoc_user_group
      • individual_user_01
      • individual_user_02
  • ロール
    • system_role
      • batch_user_01
      • batch_user_02
    • individual_role
      • individual_user_01
      • individual_user_02
  • スキーマ
    • system_schema
    • individual_schema
  • テーブル
    • system_role がアクセスできるテーブル
      • system_schema.stg_tbl_01
      • system_schema.dwh_tbl_01
    • individual_role がアクセスできるテーブル
      • individual_schema.wrk_tbl_01
      • individual_schema.wrk_tbl_02

DDL

  • グループ
CREATE GROUP batch_group;
CREATE GROUP adhoc_user_group;
  • ユーザー
# バッチユーザー
CREATE USER batch_user_01 PASSWORD 'Password123!' IN GROUP batch_group;
CREATE USER batch_user_02 PASSWORD 'Password123!' IN GROUP batch_group;
# 個人ユーザー
CREATE USER individual_user_01 PASSWORD 'Password123!' IN GROUP adhoc_user_group;
CREATE USER individual_user_02 PASSWORD 'Password123!' IN GROUP adhoc_user_group;
create schema system_schema;
create schema individual_schema;
  • テーブル
CREATE TABLE system_schema.stg_tbl_01 (col1 VARCHAR(20)); # stg_tbl_01
CREATE TABLE system_schema.dwh_tbl_01 (col1 VARCHAR(20)); # dwh_tbl_01
CREATE TABLE individual_schema.wrk_tbl_01 (col1 VARCHAR(20)); # wrk_tbl_01
CREATE TABLE individual_schema.wrk_tbl_02 (col1 VARCHAR(20)); # wrk_tbl_02
  • ロール
# ロールを作成
CREATE ROLE system_role;
CREATE ROLE individual_role;
  • 権限付与
# ロールからスキーマへの権限を付与
GRANT USAGE ON SCHEMA system_schema TO ROLE system_role;
GRANT USAGE ON SCHEMA individual_schema TO ROLE individual_role;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA system_schema TO ROLE system_role;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA individual_schema TO ROLE individual_role;
# ユーザーにロール単位でアクセス権限を付与
GRANT ROLE system_role TO batch_user_01, batch_user_02;
GRANT ROLE individual_role TO individual_user_01, individual_user_02;
  • システムビューで設定を確認する
dev=# SELECT * FROM svv_user_grants;
 user_id |                     user_name                      | role_id |    role_name    | admin_option 
---------+----------------------------------------------------+---------+-----------------+--------------
     181 | dm_admin_user                                      |  372701 | dm_admin_role   | f
     189 | ds:central_db_nsp_b77f35248f9446f9bc61b7d8a3026df5 |  871650 | ds:central_db   | f
     190 | batch_user_01                                      | 1157704 | system_role     | f
     191 | batch_user_02                                      | 1157704 | system_role     | f
     190 | batch_user_01                                      | 1157705 | individual_role | f
     192 | individual_user_01                                 | 1157705 | individual_role | f
     193 | individual_user_02                                 | 1157705 | individual_role | f
(7 rows)

WLM設定

検証結果
  • サービスの機能検証をするわけではないので、網羅的なテストは実施していない。
[ec2-user@ip-172-31-0-101 ~]$ psql "host=redshift-cluster-poc-central.********.ap-northeast-1.redshift.amazonaws.com user=individual_user_01 dbname=dev port=5439" 
Password for user individual_user_01: 
psql (13.7, server 8.0.2)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

dev=> select * from system_schema.stg_tbl_01;
ERROR:  permission denied for schema system_schema
dev=> select * from individual_schema.wrk_tbl_01;
 col1 
------
(0 rows)

dev=> 

参考

ロール・グループ・ユーザーの属性
CREATE ROLE role_name
[ EXTERNALID external_id ]
CREATE GROUP group_name
[ [ WITH ] [ USER username ] [, ...] ]
CREATE USER name [ WITH ]
PASSWORD { 'password' | 'md5hash' | 'sha256hash' | DISABLE }
[ option [ ... ] ]

where option can be:

CREATEDB | NOCREATEDB
| CREATEUSER | NOCREATEUSER
| SYSLOG ACCESS { RESTRICTED | UNRESTRICTED }
| IN GROUP groupname [, ... ]
| VALID UNTIL 'abstime'
| CONNECTION LIMIT { limit | UNLIMITED }
| SESSION TIMEOUT limit
| EXTERNALID external_id
システムビュー
GRANT ROLE role1 TO reguser;
GRANT ROLE role2 TO reguser;
GRANT ROLE role1 TO superuser;
GRANT ROLE role2 TO superuser;

SELECT user_name,role_name,admin_option FROM svv_user_grants;

 user_name | role_name | admin_option
-----------+-----------+--------------
 superuser |  role1    | False
 reguser   |  role1    | False
 superuser |  role2    | False
  reguser  |  role2    | False