Amazon S3 バケットにあるオブジェクトに対するクロスアカウントアクセス許可を付与するにはどうすればよいですか?
Amazon Simple Storage Service (Amazon S3) バケットにあるオブジェクトに対するアクセス許可を自分以外の AWS アカウントに付与したいと考えています。
簡単な説明
アカウント管理者であるユーザーは、アカウント内に所有しているオブジェクトへのクロスアカウントアクセス許可を、他のアカウントに属するユーザーに付与できます。
特定の、完全な管理アクセスを必要としない S3 リソースに対するアクセス許可を付与できます。
次のいずれかの方法でオブジェクトへのクロスアカウントアクセスを許可します。
- S3 バケットオブジェクトに対する、プログラムのみによるアクセス許可を付与するAWS Identity and Access Management (IAM) ポリシーとリソースベースのバケットポリシー。
- S3 バケットオブジェクトに対するプログラムによるアクセス許可のみのIAM ポリシーとリソースベースのアクセスコントロールリスト (ACL)。
注: バケット所有者の強制設定を有効にすると、Amazon S3 はすべてのバケットとオブジェクトに対する 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」を参照してください。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
次の一連の手順では、アカウント A は自身のアカウントを示し、アカウント B はオブジェクトへのアクセスを許可する対象のアカウントを示します。
IAM ポリシーとリソースベースのバケットポリシー
クロスアカウントアクセスを管理し、S3 オブジェクトのアクセス許可を監査するには、リソースベースのバケットポリシーを使用します。
プリンシパル、リソース、アクション要素を定義するバケットポリシーを、バケットレベルで適用します。バケットポリシーをバケットレベルで適用する際、バケット内の複数のオブジェクトに対するアクセス許可を定義できます。どのユーザーが S3 バケット内のオブジェクトにアクセスできるかについて、バケットポリシーで確認することもできます。
バケットポリシーで S3 バケットに対するアクセス許可を管理するには、次の手順を実行します。
-
アカウント 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 バケット内の特定のフォルダに対するアクセス許可を、ユーザーに付与する方法を教えてください」を参照してください。 AWS CLI コマンド create-policy を実行しても、IAM ID ベースのポリシーを作成できます。 -
アカウント 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/*" ] } ] }AWS CLI コマンド put-bucket-policy を実行しても、S3 バケットポリシーを作成できます。
特定のバケットフォルダに対するアクセスを制限するには、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_CONTROLAmazon S3 ACL のアクセス許可を付与されるユーザーとしては、1 つのアカウント、または事前定義された Amazon S3 グループの 1 つのみを使用できます。アカウントのメールアドレスまたは正規ユーザー ID を指定すると、ACL はアクセス許可を付与されるユーザーのアカウントにあるすべてのアイデンティティに適用されます。したがって、たとえば、個々の IAM ユーザーまたはロールに対するアクセスを ACL で制限することはできません。なお、同じプレフィックスを共有する異なるオブジェクトに ACL を適用することはできません。
注: ACL は、ACL が承認する S3 操作に対する条件をサポートしません。したがって、バケット所有者は、ACL で許可されるユーザーがアップロードしたオブジェクトを完全に制御できない場合があります。
バケットとオブジェクト ACL で S3 バケットへのアクセスを管理するには、次の手順を実行します。
-
アカウント B で IAM ユーザーまたはロールを作成します。
-
必要な Amazon S3 オペレーションを実行するアクセス許可をそのユーザーまたはロールに付与します。PutObject と GetObject を呼び出すユーザーには、「リソースベースのポリシーと IAM ポリシー」セクションに示したアクセス許可が必要です。
-
バケット ACL の設定では、アカウント B に最低限、WRITE 許可を付与してください。WRITE 許可が付与されていると、アカウント 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 を特定する」を参照してください。
-
オブジェクト ACL の設定では、アカウント B に最低限、READ 許可を付与してください。READ 許可が付与されていると、アカウント 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 コンソールを使用してオブジェクトをプログラムでダウンロードしたりアップロードしたりできます。プログラムでのアクセスのみが必要な場合は、このポリシーから最初の 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/*" } ] }詳細については、「Amazon S3 バケット内の特定のフォルダへのアクセスをユーザーに付与する方法を教えてください」を参照してください。 AWS CLI コマンド create-policy を実行しても、IAM ID ベースのポリシーを作成できます。
-
アカウント B の IAM ロールまたはユーザーが、アカウント A で作成した IAM ロールを引き受けるためのアクセス許可を付与します。IAM ユーザーまたはロールには、アクセス許可ポリシーとして、次のポリシーを追加する必要があります。
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::AccountA:role/AccountARole" } }AWS CLI コマンド create-policy を実行しても、IAM ID ベースのポリシーを作成できます。
-
アカウント B の IAM ID が必須の S3 操作を実行できるようにするために、アカウント B のロールでアカウント A のロールを引き受けます。
注: アカウント A 内の IAM ロールを引き受ける際、Amazon S3 は、アクセスポリシーに基づき、操作を決定します。IAM ロールは、アカウント A のローカル IAM アイデンティティが呼び出した API コールとして機能します。クロスアカウントアクセス許可用のバケットポリシーまたは ACL は必要ありません。詳細については、「Amazon S3 のポリシーアクション」を参照してください。

