別の AWS アカウントの AWS Identity and Access Management (IAM) ユーザーに、自分の Amazon Simple Storage Service (Amazon S3) バケットへのアクセス権を付与したいです。また、ユーザーが Amazon S3 バケットにオブジェクトをアップロードできるように、クロスアカウントアクセス権を付与したいと考えています。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI のエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
自分の S3 バケットにオブジェクトをアップロードするためのアクセス権を別のアカウントのユーザーに付与するには、そのユーザーまたはアカウントの IAM ポリシーを更新します。バケット所有者の強制によるオブジェクト所有権を使用することで、アカウントを通じてアクセスを制御するのがベストプラクティスです。
バケットで、バケット所有者の強制による所有権の代わりにアクセスコントロールリスト (ACL) を使用している場合は、ACL を無効にする Amazon S3 設定の BucketOwnerEnforced を検討してください。次の get-bucket-ownership-controls コマンドを使用して、バケットが ACL を使用しているかどうかを確認します。
aws s3api get-bucket-ownership-controls --bucket DOC-EXAMPLE-BUCKET
注: DOC-EXAMPLE-BUCKET は、実際のバケット名に置き換えてください。
出力に BucketOwnerEnforced ではなく、BucketOwnerPreferred または ObjectWriter と表示されている場合、バケットは ACL を使用しています。この場合、クロスアカウントでアップロードされたオブジェクトは、バケット所有者ではなくアップローダーが所有することになります。
バケット所有者の強制によるオブジェクト所有権
アカウントレベルでバケットへのアクセス権を付与するには、バケット所有者の強制によるオブジェクト所有権を使用します。次の手順に従って、アカウント A の IAM ユーザーに、アカウント B の S3 バケットにオブジェクトをアップロードするためのアクセス権を付与します。
-
アカウント A で、アカウント B のバケットにアクセスする必要があるユーザー用の IAM ポリシーを作成します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::DOC-EXAMPLE-BUCKET",
"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
]
}
]
}
注: DOC-EXAMPLE-BUCKET は、実際のバケット名に置き換えてください。
-
アカウント A から、IAM ユーザーの Amazon リソースネーム (ARN) を取得します。
-
アカウント B から、クロスアカウントユーザーにオブジェクトをアップロードするアクセス許可を付与するためのバケットポリシーを作成します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "CrossAccountUploadAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:user/UploadData"
},
"Action": [
"s3:PutObject"
],
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
},
{
"Sid": "CrossAccountListAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:user/UploadData"
},
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET"
}
]
}
注: Principal の値には、必ずアカウント A の IAM ユーザーの ARN を入力してください。DOC-EXAMPLE-BUCKET は、実際のバケット名に置き換えてください。
ACL の強制によるオブジェクト所有権
ACL の強制によるオブジェクト所有権を使用するバケットへのアクセス権を付与するには、バケットポリシーと IAM ユーザーポリシーで PutObjectAcl アクセス許可を付与します。
-
アカウント A から、IAM ユーザーにポリシーをアタッチします。このポリシーでは、ユーザーがアカウント B のバケットで PutObject アクションと PutObjectAcl アクションを実行できるようにする必要があります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::DOC-EXAMPLE-BUCKET",
"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
]
}
]
}
注: アップロードに ACL を指定する前に、s3:PutObjectAcl アクセス許可を持っている必要があります。このアクセス許可がないと、バケット所有者のフルコントロール ACL などの ACL を含むオブジェクトをアップロードするときに、Access Denied エラーが発生します。
-
アカウント B から、アカウント A の IAM ユーザーに対して、s3:PutObject と s3:PutObjectAcl アクションを実行するためのアクセス許可を付与するバケットポリシーをアタッチします。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DelegateS3ObjectAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::999999999999:user/UploadData"
},
"Action": [
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
},
{
"Sid": "DelegateS3BucketAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:user/UploadData"
},
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET"
}
]
}
関連情報
例 2: バケット所有者がクロスアカウントのバケットのアクセス許可を付与する