4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🔐 AWS STS AssumeRoleでクロスアカウントアクセス実験してみた

Last updated at Posted at 2025-07-12

🏁 はじめに

「信頼ポリシーがふんたら~AssumeRoleによるクロスアカウントアクセスでかんたら~」

AWS の 資格取得の学習中に、ちょいちょい遭遇した問題。
いつも、見て見ぬふりして、なんとなく解いてました。
いつも、なるほどわからんのよねー。と、心の中でつぶやいては、なにもしていませんでした。(←

今回、ようやく、実際に手を動かして、2つのAWSアカウントを使って実験してみました

🎭 そもそも、AWS STS って? AssumeRoleってなんなの?

AWS STS(Security Token Service):
一時的な認証情報を発行するサービス

AssumeRole:
STSの機能。
この機能を利用することで、本来、自分がつかえないIAMロール(別アカウントのIAMロールなど)を使えるようになる。

⚙️ それぞれの役割

貸す側 がやること」

  1. 🏷️ 「誰に貸すか」を決める: 信頼ポリシーで貸出先を指定
  2. 📋 「何ができるか」を決める: 許可ポリシーで操作権限を定義
  3. 🎭 「貸し出し用ロール」を作る: 上記2つをまとめたIAMロールを作成

借りる側 がやること」

  1. 🎫 許可セットを作成・割り当て: 企業ロールを借りる権限を設定し、ユーザーにアサイン
  2. 🔄 ロールを借用: STS APIで一時認証情報を取得
  3. 🔓 借りた権限で作業: 企業のリソースにアクセス

※今回は 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作成

  1. IAM Identity Center許可セット許可セットを作成
  2. カスタム許可セット を選択
  3. インラインポリシー にJSONを貼り付け
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "AllowAssumeCompanyRole",
          "Effect": "Allow", 
          "Action": "sts:AssumeRole",
          "Resource": "arn:aws:iam::COMPANY-ACCOUNT-ID:role/VendorAccessRole"
        }
      ]
    }
    
  4. 許可セット名: AllowAssumeCompanyRole
  5. 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機能を使用してブラウザからアクセス&確認

  1. 右上のユーザー名 → Switch Role
  2. アカウントID: COMPANY-ACCOUNT-ID
  3. ロール: VendorAccessRole
  4. 表示名: CompanyDataAccess
  5. 権限的にバケットリストでないので、直接アクセス。
    https://s3.console.aws.amazon.com/s3/buckets/company-shared-data-bucket-XXXXX」

🎯 まとめ

ぜったいまたわすれちゃう。
そんなときは、この記事をみたいと思います。
どなたかのお役にも立ててたらうれしいです。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?