🏁 はじめに
「信頼ポリシーがふんたら~AssumeRoleによるクロスアカウントアクセスでかんたら~」
AWS の 資格取得の学習中に、ちょいちょい遭遇した問題。
いつも、見て見ぬふりして、なんとなく解いてました。
いつも、なるほどわからんのよねー。と、心の中でつぶやいては、なにもしていませんでした。(←
今回、ようやく、実際に手を動かして、2つのAWSアカウントを使って実験してみました
🎭 そもそも、AWS STS って? AssumeRoleってなんなの?
AWS STS(Security Token Service):
一時的な認証情報を発行するサービス
AssumeRole:
STSの機能。
この機能を利用することで、本来、自分がつかえないIAMロール(別アカウントのIAMロールなど)を使えるようになる。
⚙️ それぞれの役割
「 貸す側 がやること」
- 🏷️ 「誰に貸すか」を決める: 信頼ポリシーで貸出先を指定
- 📋 「何ができるか」を決める: 許可ポリシーで操作権限を定義
- 🎭 「貸し出し用ロール」を作る: 上記2つをまとめたIAMロールを作成
「 借りる側 がやること」
- 🎫 許可セットを作成・割り当て: 企業ロールを借りる権限を設定し、ユーザーにアサイン
- 🔄 ロールを借用: STS APIで一時認証情報を取得
- 🔓 借りた権限で作業: 企業のリソースにアクセス
※今回は IAMユーザーではなく、IAM Identity Center を利用
🎯 実験シナリオ
企業AとベンダーB 間でデータ共有する
- 🏢 アカウントA(企業側): S3バケットにデータを保存
- 🏪 アカウントB(ベンダー側): 企業のS3バケットに読み取り専用でアクセス
🛠️ 手順
📋 Step 1: アカウントA(企業側)の設定
🪣 事前準備:S3バケットと参照用データの作成
aws s3 mb s3://company-shared-data-bucket-XXXXX
echo "confidential data" > test-data.txt
aws s3 cp test-data.txt s3://company-shared-data-bucket-XXXXX/
🔒 Trust Policy作成(trust-policy.json)
ベンダーアカウントからのAssumeRoleを許可する設定です。「VENDOR-ACCOUNT-IDのアカウントなら、このロールを引き受けてもいいよ」という信頼関係を定義します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowVendorAccountAssumeRole",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::VENDOR-ACCOUNT-ID:root"
},
"Action": "sts:AssumeRole"
}
]
}
📝 S3アクセス権限ポリシー作成(s3-policy.json)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowS3BucketListAccess",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::company-shared-data-bucket-XXXXX"
},
{
"Sid": "AllowS3ObjectReadAccess",
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::company-shared-data-bucket-XXXXX/*"
}
]
}
🎨 IAMロール作成とポリシーアタッチ
AssumeRoleで引き受けられるロールを作成し、S3アクセス権限を付与します。ベンダーアカウントのユーザーは、このロールを引き受けることで、S3アクセス権限ポリシーで許可された操作(バケット一覧表示・オブジェクト読み取り)を実行できるようになります。
# ロール作成
aws iam create-role \
--role-name VendorAccessRole \
--assume-role-policy-document file://trust-policy.json
# S3権限ポリシー作成
aws iam create-policy \
--policy-name VendorS3AccessPolicy \
--policy-document file://s3-policy.json
# ロールに権限ポリシーをアタッチ
aws iam attach-role-policy \
--role-name VendorAccessRole \
--policy-arn arn:aws:iam::COMPANY-ACCOUNT-ID:policy/VendorS3AccessPolicy
📋 Step 2: アカウントB(ベンダー側)の設定
🆔 IAM Identity Center Permission Set作成
- IAM Identity Center → 許可セット → 許可セットを作成
- カスタム許可セット を選択
-
インラインポリシー にJSONを貼り付け
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAssumeCompanyRole", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::COMPANY-ACCOUNT-ID:role/VendorAccessRole" } ] } - 許可セット名:
AllowAssumeCompanyRole - AWSアカウント タブで対象ユーザーに割り当て
✅ 動作確認
ベンダーアカウントから企業アカウントのS3バケットにアクセスしてみます。AssumeRoleで企業のロールを引き受けて、クロスアカウントアクセスが正しく動作するかを確認します。
💻 CLI経由での確認
# AssumeRole実行
aws sts assume-role \
--role-arn "arn:aws:iam::COMPANY-ACCOUNT-ID:role/VendorAccessRole" \
--role-session-name "VendorTestSession"
📊 実行結果例
{
"Credentials": {
"AccessKeyId": "***************",
"SecretAccessKey": "********************************",
"SessionToken": "XXXXXXXXXXXX//////////... (省略)",
"Expiration": "XXXX-XX-XXTXX:XX:XX+00:00"
},
"AssumedRoleUser": {
"AssumedRoleId": "ARO***************:VendorTestSession",
"Arn": "arn:aws:sts::COMPANY-ACCOUNT-ID:assumed-role/VendorAccessRole/VendorTestSession"
}
}
🔍 レスポンス解説
| 項目 | 説明 |
|---|---|
| AccessKeyId | 一時的なアクセスキーID |
| SecretAccessKey | 一時的なシークレットアクセスキー |
| SessionToken | セッショントークン(一時認証情報の証明) |
| Expiration | 認証情報の有効期限(1時間後) |
| AssumedRoleUser | 引き受けたロールの情報 |
| Arn | 現在の身元を示すARN(assumed-role形式) |
💡 重要ポイント
- SessionToken: 通常のアクセスキーとは異なり、トークンが必須
-
assumed-role: ARNが
assumed-role形式に変わっている
一時認証情報を環境変数に設定
export AWS_ACCESS_KEY_ID="xxx..."
export AWS_SECRET_ACCESS_KEY="xxx..."
export AWS_SESSION_TOKEN="xxx..."
🔍S3アクセステスト
企業側のS3バケットの中身が確認できることを確認します
aws s3 ls s3://company-shared-data-bucket-XXXXX/
aws s3 cp s3://company-shared-data-bucket-XXXXX/test-data.txt ./
🌐 マネジメントコンソール経由での確認
🔄 Switch Role機能を使用してブラウザからアクセス&確認
- 右上のユーザー名 → Switch Role
- アカウントID:
COMPANY-ACCOUNT-ID - ロール:
VendorAccessRole - 表示名:
CompanyDataAccess - 権限的にバケットリストでないので、直接アクセス。
「https://s3.console.aws.amazon.com/s3/buckets/company-shared-data-bucket-XXXXX」
🎯 まとめ
ぜったいまたわすれちゃう。
そんなときは、この記事をみたいと思います。
どなたかのお役にも立ててたらうれしいです。