Amazon S3 バケットにあるオブジェクトに対するクロスアカウントアクセスを与える方法を教えてください。
別の AWS アカウントに、Amazon Simple Storage Service (Amazon S3) バケットにあるオブジェクトに対するアクセス権限を与えたいと考えています。
簡単な説明
Amazon S3 では、別の AWS アカウントのユーザーに、自分のアカウントが所有するオブジェクトに対する詳細なクロスアカウントアクセス権限を与えることができます。
与えるアクセス権限のタイプに応じて、以下のいずれかのソリューションを使用して、オブジェクトに対するクロスアカウントアクセス権限を与えます:
- S3 バケットオブジェクトに対するプログラムによるアクセス権限のみの AWS Identity and Access Management (IAM) ポリシーとリソースベースのバケットポリシー
- S3 バケットオブジェクトに対するプログラムによるアクセス権限のみのIAM ポリシーとリソースベースのアクセスコントロールリスト (ACL)
注: [バケット所有者強制] 設定を有効にすると、すべてのバケットとオブジェクトの ACL が無効になります。したがって、ACL でクロスアカウントアクセス権限を与えることはできません。デフォルトでは、新しく作成したすべてのバケットでは、[バケット所有者強制] 設定が有効になります。また、(ACL ではなく) IAM ポリシーとバケットポリシーで、バケットとオブジェクトに対するクロスアカウントアクセス権限を管理することもベストプラクティスです。詳細については、「オブジェクトの所有権の制御とバケットの ACL の無効化」を参照してください。 - S3 バケットオブジェクトに対するプログラムによるアクセスとコンソールアクセスのためのクロスアカウント IAM ロール
リクエスタが IAM プリンシパルの場合、そのプリンシパルを所有するアカウントは IAM ポリシーによって S3 アクセス権限を与える必要があります。あなたのユースケースに基づいて、バケット所有者もバケットポリシーまたは ACL によってアクセス権限を与える必要があります。アクセス権限が認められると、クロスアカウントのバケットに対するプログラムによるアクセス権限は、そのアカウントバケットに対するアクセス権限と等しくなります。
Amazon S3 アクセスポイントまたは AWS Key Management Service (AWS KMS) によるクロスアカウントアクセスについては、「クロスアカウントユーザーがカスタム AWS KMS キーで暗号化された S3 オブジェクトにアクセスしようとするときに Access Denied エラーが発生するのはなぜですか?」を参照してください。
クロスアカウントオブジェクトとしてアクセスする必要がある大規模なデータセットの場合は、S3 アクセスポイントを使用するのがベストプラクティスです。詳細については、「Simplify and scale access management to shared datasets with cross-account Amazon S3 Access Points」を参照してください。
解決策
IAM ポリシーとリソースベースのバケットポリシー
**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、使用している AWS CLI が最新バージョンであることを確認してください。
リソースベースのバケットポリシーで、クロスアカウントアクセスコントロールを管理し、S3 オブジェクトのアクセス権限を監査します。バケットレベルでバケットポリシーを適用して、以下の値を定義します:
- プリンシパル要素: 誰がバケット内のオブジェクトにアクセスできるか
- リソース要素: アクセスできるオブジェクト
- アクション要素: バケット内のオブジェクトにアクセスする方法
バケットポリシーをバケットレベルで適用すると、バケット内のさまざまなオブジェクトに対する詳細なアクセスを定義できます。S3 バケット内のオブジェクトにアクセスできるユーザーは、バケットポリシーで確認することもできます。
バケットポリシーで S3 バケットに対するアクセス権限を管理するには、次の手順を実行します:
**注:**次の手順で、アカウント A は自分のアカウントで、アカウント B はオブジェクトアクセス権限を認めるアカウントです。
-
アカウント A で S3 バケットを作成します。
-
アカウント B で IAM ロールまたはユーザーを作成します。
-
アカウント B の IAM ロールに、特定のバケットに対してオブジェクトをダウンロードし (GetObject) し、アップロードする (PutObject) アクセス権限を与えます。次の IAM ポリシーを使用して、アカウント B アクセス権限の IAM ロールに、バケット所有者にオブジェクトのアクセス権限を認める PutObjectAcl を呼び出すアクセス権限を認めます:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:PutObjectAcl" ], "Resource": "arn:aws:s3:::AccountABucketName/*" } ] }
注:ユーザー変数を含めるようにポリシーを更新します。また、アカウント A にある特定のバケットフォルダに対するアクセスを制限することもできます。特定のバケットフォルダに対するアクセスを制限するには、"arn:aws:s3:::AccountABucketName/FolderName/*" のように、リソーズ要素にフォルダ名を定義します。詳細については、「Amazon S3 バケットにある特定のフォルダに対するアクセス権限をユーザーに与えるにはどうすればいいですか?」を参照してください。AWS CLI コマンドの create-policy で、IAM アイデンティティベースのポリシーを作成することもできます。
-
アカウント 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 バケットポリシーを作成することもできます。
注:特定のバケットフォルダに対するアクセスを制限するには、arn:aws:s3:::AccountABucketName/FolderName/* などのリソース要素でフォルダ名を定義します。条件付きの s3:PutObject アクセス権限を使用すると、他のアカウントでアップロードされたオブジェクトをバケット所有者は完全に制御できます。PutObject APIコールは、特定のヘッダーを使用して ACL を適用します。
IAM ポリシーとリソースベースの ACL
オブジェクト ACL を使用して、特定のシナリオでのアクセス権限を管理することもできます。詳細については、「ACL ベースのアクセスポリシー (バケットおよびオブジェクト ACL) の使用が適する場合 」を参照してください。
Amazon S3 ACL でユーザーが定義できるのは、READ、WRITE、READ_ACP、WRITE_ACP、および FULL_CONTROL のアクセス権限セットのみです。Amazon S3 ACL のアクセス権限を与えられるユーザーには、アカウントまたは事前定義された Amazon S3 グループのうちから 1 つのみ使用できます。アカウントのメールアドレスまたは正規ユーザー ID を指定すると、ACL はアクセス権限を与えられるユーザーのアカウントにあるすべてのアイデンティティに適用されます。したがって、たとえば、個々の IAM ユーザーまたはロールに対するアクセスを ACL で制限することはできません。また、同じプレフィックスを共有する異なるオブジェクトに ACL を適用することもできません。
**注:**バケット所有者は、ACL のアクセス権限を与えられるユーザーがアップロードしたオブジェクトは完全に制御できない場合があります。これは、ACL が承認する S3 オペレーションの条件を ACL がサポートしていないためです。
バケットとオブジェクト ACL で S3 バケットに対するアクセス権限を管理するには、以下の手順を実行します:
- アカウント B で IAM ロールまたはユーザーを作成します。
- 次に、必要な Amazon S3 オペレーションを実行するアクセス権限をそのロールまたはユーザーに与えます。PutObject と GetObject を呼び出すユーザーには、リソースベースのポリシーと IAM ポリシーセクションにリストされているアクセス権限が必要です。
- 少なくともアカウント B の WRITE アクセス権限を含めるようにバケット ACL を設定します。これにより、アカウント B の IAM ロールまたはユーザーは、アカウント A が所有するバケットにオブジェクトをアップロードできます:
**注:**CanonicalUserID の検索方法については、「AWS アカウントの正規ユーザー ID の検索」を参照してください。...<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>
- オブジェクト ACL は、少なくともアカウント B の READ アクセス権限を含めるように設定します。これにより、アカウント B の IAM ロールまたはユーザーが、アカウント A が所有するバケットからオブジェクトをダウンロードできます:
ACL のアクセス権限は、ACL が適用される S3 リソース、バケット、オブジェクトによって異なります。詳細については、「アクセスコントロールリスト (ACL) の概要」を参照してください。バケットを作成するとき、または既存のバケットにオブジェクトをアップロードするときに、バケット ACL とオブジェクト ACL を設定します。詳細については、「ACL の設定」を参照してください。...<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>
クロスアカウント IAM ロール
すべての AWS サービスがリソースベースのポリシーをサポートしているわけではありません。そのため、複数のサービスに対するクロスアカウントアクセス権限を与えるときに、クロスアカウントの IAM ロールを使用してアクセス権限の管理を一元化します。この方法では、別のアカウントまたは AWS サービスが所有しているか、アップロードしたオブジェクトに対するクロスアカウントアクセスができます。クロスアカウント IAM ロールを使用しない場合は、オブジェクト ACL を変更する必要があります。詳細については、「Amazon S3 がオブジェクトオペレーションのリクエストを許可する仕組み」を参照してください。
クロスアカウントの IAM ロールで S3 バケットに対するアクセス権限を管理するには、以下の手順を実行します:
- アカウント A で IAM ロールを作成します。
- 次に、必要な S3 オペレーションを実行するアクセス権限をロールに与えます。ロールの信頼ポリシーで、アカウント B のロールまたはユーザーに、アカウント A のロールを引き受けるアクセス権限を与えます:
**注:**IAM ロールには、ロールを引き受けることができるプリンシパルとそのロールがそれらをいつ引き受けることができるかを定義する信頼ポリシーが必要です。IAM ロールには、ロールを引き受けるプリンシパルが実行できるアクセス権限と彼らが使用するリソースを定義する複数のアクセス権限ポリシーを設定することができます。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB:user/AccountBUserName" }, "Action": "sts:AssumeRole" } ] }
AWS CLI コマンドの create-role を実行して、信頼ポリシーを含むロールを作成することもできます。
次のアクセスポリシーでは、このロールを引き受けたユーザーは、Amazon S3 コンソールからオブジェクトをプログラムでダウンロードやアップロードすることができます。詳細については、「Amazon S3 バケットにある特定のフォルダに対するアクセス権限をユーザーに与えるにはどうすればいいですか?」を参照してください。
**注:**プログラムによるアクセスのみが必要な場合は、次のポリシーから最初の 2 つのステートメントを削除できます:
または、create-policy AWS CLI コマンドを実行して、IAM アイデンティティベースのポリシーを作成します。{ "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/*" } ] }
- アカウント B の IAM ロールまたはユーザーに、アカウント A で作成した IAM ロールを引き受けるアクセス権限を与えます。IAM ユーザーまたはロールのアクセス権限ポリシーとして、次のサンプルポリシーを追加する必要があります:
または、create-policy AWS CLI コマンドを実行して、 IAM アイデンティティベースのポリシーを作成します。{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::AccountA:role/AccountARole" } }
- アカウント B の IAM アイデンティティで必要な S3 オペレーションを実行できるように、アカウント B のロールから、アカウント A のロールを引き受けます。詳細については、「ロールに対する切り替え (コンソール)」を参照してください。
**注:**アカウント A の IAM ロールを引き受けると、Amazon S3 では、アクセスポリシーによってオペレーションが決まります。IAM ロールは、アカウント A のローカル IAM アイデンティティが呼び出した API コールとして機能します。クロスアカウントアクセス用のバケットポリシーまたは ACL は必要ありません。詳細については、「Amazon S3 アクション」を参照してください。
関連情報
Amazon RDS for Microsoft SQL Server で、クロスアカウントのネイティブバックアップおよびリストアを設定する
関連するコンテンツ
- 質問済み 5年前lg...
- 質問済み 1年前lg...
- 質問済み 6年前lg...
- AWS公式更新しました 6ヶ月前