目次

【重要】AWS S3 : クロスアカウント(他のアカウント)のS3にアクセスする方法(スイッチロールなど)



クロスアカウント(他のアカウント)のS3にアクセスする方法の比較

方法 説明
バケットポリシーで制御する方法
IAMユーザを利用する方法
スイッチロール(sts:AssumeRole)を利用する方法


バケットポリシーで制御する方法

  1. アクセス先で、アクセス元からのアクセスを許可するバケットポリシーを作成する
  2. アクセス元からアクセス先のS3へアクセスする

aws:s3:s3-other1.png

[接続先]接続元からのアクセスを許可するバケットポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "GetObject",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::接続元アカウント:root"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucketname/*"
        },
        {
            "Sid": "ListBucket",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::接続元アカウント:root"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::bucketname"
        }
    ]
}


IAMユーザを利用する方法

AWS CLI やプログラムによるアクセスが想定されたもの

  1. アクセス先でIAMユーザを作成する
  2. アクセス先のBucketポリシーで、作成したIAMユーザからのアクセスを許可
  3. アクセス元がAWSであれば、IAMポリシーで、アクセス先のS3へのアクセスを許可
  4. サーバでクレデンシャルを設定する
  5. アクセス元のEC2からアクセス先のS3へアクセスする
    • ユーザかEC2に作成したIAMポリシーが適用さえている必要がある

aws:s3:s3-other2.png

IAMユーザを利用する方法の設定手順

[接続先] S3バケットへの許可するポリシーを作成

テストなら、AmazonS3FullAccessでもよい

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::your-bucketname"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::your-bucketname/*"
        }
    ]
}

[接続先]IAM ユーザ作成

接続先アカウントで、IAM ユーザ作成し、作成したS3へのアクセスを許可するポリシーを割り当てる
作成されるアクセスキーとシークレットキーを接続元に渡す。

[接続先] 接続元を許可するS3バケットポリシー

{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Sid": "Example permissions",
         "Effect": "Allow",
         "Principal": {
            "AWS": "arn:aws:iam::接続元:root"
         },
         "Action": [
            "s3:GetLifecycleConfiguration",
            "s3:ListBucket"
         ],
         "Resource": [
            "arn:aws:s3:::s3-crossaccount-bucket01"
         ]
      }
   ]
}


[接続元]EC2のプロファイルにクレデンシャルを設定する

~/.aws/configの設定
[profile crossaccount]
aws_access_key_id = access-key
aws_secret_access_key = secret-access-key
region = ap-northeast-1


[接続元]アクセス先のS3バケットポリシーへのアクセスを許可

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::xxxxxxxxxxxxx:user/cliuser"
            },
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::s3-crossaccount-bucket01",
                "arn:aws:s3:::s3-crossaccount-bucket01/*"
            ]
        }
    ]
}


[接続元]クロスアカウントの接続確認

接続元から接続先にS3にアクセス

aws s3 ls s3://s3-crossaccount-bucket01 --profile crossaccount




スイッチロール(sts:AssumeRole)を利用する方法

  1. アクセス先で、S3にアクセス可能なIAMポリシーを含んだIAMロールを作成する
  2. アクセス元で、アクセス先のIAMロールにスイッチする
  3. アクセス元からアクセス先のS3へアクセスする

aws:s3:s3-other3.png

スイッチロール(sts:AssumeRole)で、他のアカウントのS3を利用する設定

[接続先]S3にアクセスできるポリシーを作成する

テストなら、AmazonS3FullAccessでもよい

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::your-bucketname"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::your-bucketname/*"
        }
    ]
}

[接続先]接続元アカウント用のロールを作成する

以下の信頼関係のロールができます。
“arn:aws:iam::<スイッチ元アカウントのAWSアカウントID>:root”は、ユーザを限定しないで、すべてのユーザを許可する設定

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<スイッチ元アカウントのAWSアカウントID>:root"
            },
            "Action": "sts:AssumeRole",
            "Condition": {}
        }
    ]
}

[接続先]接続元を許可するS3バケットポリシーを作成する

{
   "Version": "2012-10-17",
   "Id": "Policy1415115909152",
   "Statement": [
     {
       "Sid": "Access-to-specific-VPCE-only",
       "Principal": "*",
       "Action": "s3:*",
       "Effect": "Deny",
       "Resource": ["arn:aws:s3:::S3バケット名",
                    "arn:aws:s3:::S3バケット名/*"],
       "Condition": {
         "StringNotEquals": {
           "aws:SourceVpce": "VPCエンドポイントID"
         }
       }
     }
   ]
}


[接続元]接続先S3にアクセスするポリシーを作成

接続元のS3のポリシーは不要。
スイッチロールした先に割り与えられたポリシーになるため。

接続先にスイッチロールできるポリシー
{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::[接続先のAWSアカウントID]:role/RoleA"
  }
}

[接続元]接続先S3にアクセスするロールを作成

ユースケースで [EC2] を選択する




スイッチロールのアクセス手順

方法1:サーバのプロファイルにロールを割り与える方法

ロールをEC2に与える
EC2のクレデンシャル設定

./aws/credentials

[role-a-profile]
role_arn = arn:aws:iam::スイッチ先アカウントID:role/Role-A
credential_source=Ec2InstanceMetadata
aws s3 ls s3://{バケット名}/


方法2:AWS CLIのConfigを使って、スイッチロールする方法

~/.aws/configの設定
[profile default]
region = ap-northeast-1
output = json

[profile test]
role_arn = arn:aws:iam::スイッチ先アカウントID:role/TestSwitchRole
source_profile = default
アクセス確認
aws s3 ls --profile test


方法3:AWS CLIコマンドで、スイッチロールする方法

#aws sts assume-roleコマンドでアカウントBのAccountB_roleのアクセスキー・シークレットアクセスキーなどのクレデンシャル情報を表示し、
#変数role_credentialsに格納する
role_credentials=$(aws sts assume-role \
  --role-arn "arn:aws:iam::アカウントBのアカウントID:role/AccountB_role" \
  --role-session-name session-name)

#AccountB_roleのアクセスキーを環境変数AWS_ACCESS_KEY_IDに格納する
export AWS_ACCESS_KEY_ID=$(echo $role_credentials | jq -r '.Credentials.AccessKeyId')

#AccountB_roleのシークレットアクセスキーを環境変数AWS_SECRET_ACCESS_KEYに格納する
export AWS_SECRET_ACCESS_KEY=$(echo $role_credentials | jq -r '.Credentials.SecretAccessKey')

#セッショントークンを環境変数AWS_SESSION_TOKENに格納する
export AWS_SESSION_TOKEN=$(echo $role_credentials | jq -r '.Credentials.SessionToken')

#現在の権限(スイッチしたロールの情報)を確認する
aws sts get-caller-identity
aws s3 ls
#環境変数の削除
unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN

#現在の権限(スイッチしたロールが何か)を確認する
aws sts get-caller-identity




参考