Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
Amazon S3 バケットにあるオブジェクトに対するクロスアカウントアクセス許可を付与するにはどうすればよいですか?
Amazon Simple Storage Service (Amazon S3) バケットにあるオブジェクトに対するアクセス許可を自分以外の AWS アカウントに付与したいと考えています。
簡単な説明
Amazon S3 では、あなたのアカウントに所有されているオブジェクトへのクロスアカウントアクセス許可をあなた以外のアカウントのユーザーに付与することができます。
オブジェクトに対するクロスアカウントアクセス許可を付与するには、付与するアクセス許可のタイプに応じて以下のいずれかのメソッドを使用します:
- 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 オブジェクトにアクセスしようとすると、アクセス拒否エラーが表示されるのはなぜですか?」を参照してください。
クロスアカウントオブジェクトとしてアクセスする必要がある大規模なデータセットの場合は、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 アクセス許可を付与します。また、バケット所有者にオブジェクトへのアクセス許可を付与する PutObjectAcl を呼び出すアクセス許可を、IAM ユーザーまたはロールに付与します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:PutObjectAcl" ], "Resource": "arn:aws:s3:::AccountABucketName/*" } ] }
注: 上記のポリシーで、値の例をあなたのユーザー値に置き換えてください。
また、アカウント A にある特定のバケットフォルダに対するアクセスを制限することもできます。アクセスを制限するには、Resource 要素にフォルダ名を定義します (上記の例では "arn:aws:s3:::AccountABucketName/FolderName/*")。詳細については、「Amazon S3 バケットにある特定のフォルダへのアクセス許可をユーザーに付与するにはどうすればよいですか?」を参照してください。また、IAM アイデンティティベースのポリシーを作成する create-policy AWS CLI コマンドを実行するという方法もあります。 -
アカウント B で作成した IAM ユーザーまたはロールに GetObject および PutObject アクセス許可を付与するバケットポリシーを、アカウント A で設定します。
{ "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/*" ] } ] }
S3 バケットポリシーを作成する AWS CLI コマンド put-bucket-policy を実行するという方法もあります。
特定のバケットフォルダに対するアクセスを制限するには、Resource 要素にフォルダ名を定義します (前述の例では "arn:aws:s3:::AccountABucketName/FolderName/*")。バケット所有者は、条件キーを使用した s3:PutObject アクセス許可を使用すると、自分以外のアカウントでアップロードされたオブジェクトを完全に制御できます。PutObject API API コールは、特定のヘッダーを使用して ACL を適用します。
IAM ポリシーとリソースベースの ACL
オブジェクト ACL を使用して、特定のシナリオでのアクセス許可を管理することもできます。
Amazon S3 ACL でユーザーが定義できるのは、READ、WRITE、READ_ACP、WRITE_ACP、および FULL_CONTROL のアクセス許可セットのみです。Amazon S3 ACL のアクセス許可を付与されるユーザーとしては、1 つのアカウント、または事前定義された 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 が所有するバケットにオブジェクトをアップロードできます:
...<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 の検索」を参照してください。
-
少なくともアカウント B の READ アクセス許可を含めるようにオブジェクト ACL を設定します。これにより、アカウント B の IAM ロールまたはユーザーが、アカウント A が所有するバケットからオブジェクトをダウンロードできるようになります。設定方法は次のとおりです。
...<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 ロールを使用してアクセス権限の管理を一元化します。この方法では、別のアカウントまたは AWS サービスが所有しているか、アップロードしたオブジェクトに対するクロスアカウントアクセスができます。クロスアカウント IAM ロールを使用しない場合は、オブジェクト ACL を変更する必要があります。詳細については、「Amazon S3 がオブジェクトオペレーションのリクエストを許可する仕組み」を参照してください。
クロスアカウントの IAM ロールで S3 バケットに対するアクセス権限を管理するには、以下の手順を実行します:
-
アカウント A で IAM ロールを作成します。
-
必要な S3 オペレーションを実行するアクセス許可をロールに付与します。ロールの信頼ポリシーで、アカウント B のユーザーまたはロールに、アカウント A のロールを引き受けるアクセス許可を付与します:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB:user/AccountBUserName" }, "Action": "sts:AssumeRole" } ] }
**注:**IAM ロールには、ロールを引き受けることができるプリンシパルとそのロールがそれらをいつ引き受けることができるかを定義する信頼ポリシーが必要です。IAM ロールには、ロールを引き受けるプリンシパルが実行できるアクセス許可と彼らが使用するリソースを定義する、複数のアクセス許可ポリシーを設定することができます。信頼ポリシーを含むロールを作成する AWS CLI コマンドの create-role を実行するという方法もあります。
次のアクセスポリシーでは、このロールを引き受けたユーザーが、Amazon S3 コンソールからオブジェクトをプログラムでダウンロードしたりアップロードしたりすることを許可しています。詳細については、「Amazon S3 バケットにある特定のフォルダへのアクセス許可をユーザーに付与するにはどうすればよいですか?」を参照してください。
**注:**プログラムのみによるアクセスが必要な場合は、次のポリシーから最初の 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/*" } ] }
また、IAM アイデンティティベースのポリシーを作成する create-policy AWS CLI コマンドを実行するという方法もあります。
-
アカウント B の IAM ロールまたはユーザーに、アカウント A で作成した IAM ロールを引き受けるアクセス許可を付与すます。IAM ユーザーまたはロールにアクセス許可ポリシーとして次のサンプルポリシーを追加する必要があります:
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::AccountA:role/AccountARole" } }
また、IAM アイデンティティベースのポリシーを作成する create-policy AWS CLI コマンドを実行するという方法もあります。
-
アカウント B の IAM アイデンティティで必要な S3 オペレーションを実行できるように、アカウント B のロールから、アカウント A のロールを引き受けます。
注: アカウント A の IAM ロールを引き受けると、Amazon S3 では当該のアクセスポリシーによってオペレーションが決定されるようになります。IAM ロールは、アカウント A のローカル IAM アイデンティティが呼び出した API コールとして機能します。クロスアカウントアクセス許可用のバケットポリシーまたは ACL は必要ありません。詳細については、「Amazon S3 のポリシーアクション」を参照してください。
関連情報

関連するコンテンツ
- 質問済み 5ヶ月前lg...
- 質問済み 7ヶ月前lg...
- 質問済み 2年前lg...