Amazon S3 バケット内のオブジェクトへのクロスアカウントアクセスを提供するにはどうすればよいですか?
最終更新日: 2021 年 2 月 26 日
別の AWS アカウントに対して、Amazon Simple Storage Service (Amazon S3) バケットに保存されているオブジェクトへのアクセスを付与したいと考えています。Amazon S3 バケットへのクロスアカウントアクセスを提供するにはどうすればよいですか?
簡単な説明
S3 バケットに保存されているオブジェクトへのクロスアカウントアクセスを許可するには、以下のいずれかの方法を使用します。
- S3 バケットオブジェクトへのプログラムによるアクセスのみのリソースベースのポリシーと AWS Identity and Access Management (IAM) ポリシー
- S3 バケットオブジェクトへのプログラムによるアクセスのみのリソースベースのアクセスコントロールリスト (ACL) と IAM ポリシー
- S3 バケットオブジェクトへのプログラムによるアクセスとコンソールアクセスのためのクロスアカウント IAM ロール
提供するアクセスのタイプに応じて、以下のいずれかのソリューションを使用して、S3 バケットに保存されているオブジェクトへの詳細なクロスアカウントアクセスを付与します。次の例では、別の AWS アカウント (アカウント B) のユーザーにアクセス権限を付与して、アカウント (アカウント A) が所有する S3 バケット内のオブジェクトをユーザーが管理できるようにします。
注意: アカウント ID、バケット名、ARN などを含めるようにポリシーを更新してください。
解決方法
リソースベースのポリシーと IAM ポリシー
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
バケットポリシーを使用して、クロスアカウントコントロールを管理し、S3 オブジェクトのアクセス権限を監査します。バケットレベルでバケットポリシーを適用する場合、アクセスできるユーザー (Principal 要素)、アクセスできるオブジェクト (Resource 要素)、アクセス方法 (Action 要素) を定義できます。バケットポリシーをバケットレベルで適用すると、複数のポリシーを使用してアクセスを制御することで、バケット内のさまざまなオブジェクトへの詳細なアクセスを定義できます。バケットポリシーを確認して、S3 バケット内のオブジェクトにアクセスできるユーザーを確認することもできます。
バケットポリシーを使用して S3 バケットへのアクセスを管理するには、以下のステップに従います。
注: Account 変数をアカウントに置き換えてください。
1. アカウント A で S3 バケットを作成します。
2. アカウント B で IAM ロールまたはユーザーを作成します。
3. アカウント B の IAM ロールまたはユーザーに、この IAM ポリシーを使って特定の S3 バケットに対してオブジェクトのダウンロード (GET Object) およびアップロード (PUT Object) を行うアクセス権限を付与します。このポリシーでは、アカウント B の IAM ロールまたはユーザーに対して、PUT Object acl を呼び出すためのアクセス権限も付与することで、バケット所有者にオブジェクトへのアクセス権限を許可します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::AccountABucketName/*"
}
]
}
AWS CLI コマンド例の create-policy を使用して、IAM アイデンティティベースのポリシーを作成することもできます。
注: "arn:aws:s3:::AccountABucketName/FolderName/*" など、リソース要素にフォルダ名を定義することで、アカウント A の特定のバケットフォルダへのアクセスを制限できます。詳細については、IAM ポリシーを使用して特定のフォルダへのユーザー固有のアクセスを許可するにはどうしたらよいですか? を参照してください。
4. アカウント A のバケットポリシーを設定して、アカウント B で作成した IAM ロールまたはユーザーにアクセス権限を付与します。このバケットポリシーを使用して、アカウント A が所有するバケット内のオブジェクトに対する GetObject および PutObject へのアクセス権限をユーザーに付与します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::AccountB:user/AccountBUserName"
},
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::AccountABucketName/*"
]
}
]
}
AWS CLI コマンド例の put-bucket-policy を使用して、Amazon S3 バケットポリシーを作成することもできます。
注: "Resource": "arn:aws:s3:::AccountABucketName/FolderName/*" など、リソース要素で特定の S3 バケットフォルダを定義して、より制限されたアクセスを許可できます。条件を指定して s3:PutObject アクセス許可を使用することで、バケット所有者は他のアカウントによってアップロードされたオブジェクトを完全に制御できます。その後、特定のヘッダーで ACL を適用すると、PutObject API 呼び出し内で渡されます。詳細については、バケット所有者にフルコントロールを与えることを条件として s3:PutObject のアクセス許可を付与するを参照してください。
リソースベースのアクセスコントロールリスト (ACL) と IAM ポリシー
オブジェクト ACL を使用して、特定のシナリオでのみ、および ACL が IAM および S3 バケットポリシーよりもニーズを満たしている場合にのみ、アクセス許可を管理します。詳細については、ACL ベースのアクセスポリシー (バケットおよびオブジェクト ACL) の使用が適する場合を参照してください。Amazon S3 ACL では、READ、WRITE、READ_ACP、WRITE_ACP、および FULL_CONTROL のアクセス権限セットのみを定義できます。Amazon S3 ACL のアクセス許可を与えられるユーザーは、AWS アカウントまたは事前定義された Amazon S3 グループのうちから 1 つのみを使用できます。AWS アカウントの E メールアドレスまたは正規ユーザー ID を指定する場合、ACL はアクセス許可を与えられるユーザーの AWS アカウントにあるすべてのエンティティに適用されます。ACL を使用して、個々の IAM ユーザーまたはロールへのアクセスを制限することはできません。同じプレフィックスを共有する異なるオブジェクトに ACL を適用することはできません。
注意: バケット所有者は、ACL アクセス許可を与えられるユーザーがアップロードしたオブジェクトを完全に制御できない場合があります。これは、ACL が承認する S3 オペレーションの条件を ACL がサポートしていないことに起因します。
バケットとオブジェクト ACL を使用して S3 バケットへのアクセスを管理するには、以下の手順通りに実行します。
1. アカウント B で IAM ロールまたはユーザーを作成します。次に、必要な Amazon S3 オペレーションを実行するアクセス許可をそのロールまたはユーザーに付与します。PutObject と GetObject を呼び出すユーザーには、リソースベースのポリシーと IAM ポリシーセクションにリストされているアクセス許可が必要です。
2. 少なくともアカウント B の WRITE アクセス権限を含めるようにバケット ACL を設定します。これにより、アカウント B の IAM ロールまたはユーザーは、アカウント A が所有するバケットにオブジェクトをアップロード (PutObject API を呼び出す) ことができるようになります。
...
<AccessControlPolicy>
<Owner>
<ID> AccountACanonicalUserID </ID>
<DisplayName> AccountADisplayName </DisplayName>
</Owner>
<AccessControlList>
...
<Grant>
<Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
<ID> AccountBCanonicalUserID </ID>
<DisplayName> AccountBDisplayName </DisplayName>
</Grantee>
<Permission> WRITE </Permission>
</Grant>
...
</AccessControlList>
</AccessControlPolicy>
注: CanonicalUserID を確認するには、「AWS アカウントの正規ユーザー ID を知る方法」をご参照ください。
3. 少なくともアカウント B の READ アクセス許可を含めるようにオブジェクト ACL を設定します。これにより、アカウント B の IAM ロールまたはユーザーが、アカウント A が所有するバケットからオブジェクトをダウンロード (GetObject API を呼び出す) できます。
...
<AccessControlPolicy>
<Owner>
<ID> AccountACanonicalUserID </ID>
<DisplayName> AccountADisplayName </DisplayName>
</Owner>
<AccessControlList>
...
<Grant>
<Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
<ID> AccountBCanonicalUserID </ID>
<DisplayName> AccountBDisplayName </DisplayName>
</Grantee>
<Permission> READ </Permission>
</Grant>
...
</AccessControlList>
</AccessControlPolicy>
ACL のアクセス許可は、ACL が適用される S3 リソース、バケット、オブジェクトによって異なります。詳細については、アクセスコントロールリスト (ACL) の概要を参照してください。バケットを作成するとき、または既存のバケットにオブジェクトをアップロードするときに、バケットとオブジェクト ACL を設定できます。詳細については、ACL の管理を参照してください。
クロスアカウント IAM ロール
すべての AWS サービスがリソースベースのポリシーをサポートしているわけではありません。つまり、複数のサービスへのクロスアカウントアクセスを提供するときに、クロスアカウントの IAM ロールを使用してアクセス許可の管理を一元化できます。クロスアカウント IAM ロールを使用すると、複数の S3 バケットに保存されている S3 オブジェクトへのクロスアカウントアクセスのプロビジョニングが簡素化され、S3 バケットの複数のポリシーを管理する必要がなくなります。この方法で、別の AWS アカウントまたは AWS のサービスによって所有またはアップロードされたオブジェクトへのクロスアカウントアクセスを許可します。クロスアカウント IAM ロールを使用しない場合は、オブジェクト ACL を変更する必要があります。詳細については、「Amazon S3 がオブジェクトオペレーションのリクエストを許可する方法」をご参照ください。
クロスアカウント IAM ロールを使用して S3 バケットへのアクセスを管理するには、以下のステップに従います。
1. アカウント A で IAM ロールを作成します。次に、必要な S3 オペレーションを実行するアクセス許可をロールに付与します。ロールの信頼ポリシーで、アカウント B のロールまたはユーザーに、アカウント A のロールを引き受けるアクセス権限を付与します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::AccountB:user/AccountBUserName"
},
"Action": "sts:AssumeRole"
}
]
}
AWS CLI コマンド例の create-role を使用して、信頼ポリシーを使用してロールを作成することもできます。
次のアクセスポリシーでは、このロールを引き受けたユーザーが、プログラムで Amazon S3 コンソールを使用してオブジェクトのダウンロードとアップロードを許可します。詳細については、IAM ポリシーを使用して特定のフォルダへのユーザー固有のアクセスを許可するにはどうしたらよいですか? を参照してください。
注: プログラムによるアクセスのみが必要な場合は、次のポリシーのステートメントから最初の 2 つを削除できます。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:ListAllMyBuckets"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::*"
]
},
{
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::AccountABucketName"
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::AccountABucketName/*"
}
]
}
AWS CLI コマンド例の create-policy を使用して、IAM アイデンティティベースのポリシーを作成することもできます。
2. アカウント B の IAM ロールまたはユーザーに、アカウント A で作成した IAM ロールを引き受けるアクセス権限を付与します。
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::AccountA:role/AccountARole"
}
}
AWS CLI コマンド例の create-policy を使用して、IAM アイデンティティベースのポリシーを作成することもできます。
3. アカウント B のロールまたはユーザーから、アカウント A のロールをプログラムで引き受けることで、アカウント B の IAM エンティティが必要な S3 オペレーションを実行できるようにします。詳細については、ロールの切り替え (コンソール) を参照してください。
注意: アカウント A の IAM ロールを引き受けると、Amazon S3 オペレーションはアクセスポリシーによって決まります。IAM ロールは、アカウント A のローカル IAM エンティティによって行われた API 呼び出しと見なされます。クロスアカウントアクセス用のバケットポリシーまたは ACL は必要ありません。詳細については、Amazon S3 アクションをご参照ください。