例 3: バケット所有者が自分の所有していないオブジェクトに対するアクセス許可を付与する
重要
アクセス許可は、個々のユーザーではなく、IAM ロールに付与することをお勧めします。これを行う方法については、「背景: クロスアカウントのアクセス許可と IAM ロールの使用」を参照してください。
トピック
この例のシナリオでは、バケット所有者がオブジェクトへのアクセス許可を付与しますが、バケット内のオブジェクトの一部がバケット所有者によって所有されていません。この例では、バケット所有者は、自分のアカウントのユーザーにアクセス許可を付与しようとしています。
バケット所有者は、他の AWS アカウントにオブジェクトのアップロードを許可できます。デフォルトでは、バケット所有者は別の AWS アカウント によってバケットに書き込まれたオブジェクトを所有しません。オブジェクトは、S3 バケットに書き込むアカウントによって所有されています。バケット所有者がバケット内のオブジェクトを所有していない場合、オブジェクト所有者は最初にオブジェクト ACL を使用してバケット所有者に権限を付与する必要があります。その後、バケット所有者は所有していないオブジェクトに許可を付与できます。詳細については、Amazon S3 のバケットとオブジェクトの所有権 を参照してください。
バケット所有者がバケットの S3 オブジェクト所有権にバケット所有者強制設定を適用すると、バケット所有者は、別の AWS アカウント によって書き込まれたオブジェクトを含む、バケット内のすべてのオブジェクトを所有します。これにより、オブジェクトがバケット所有者によって所有されていないという問題が解決されます。次に、自分のアカウントまたは他の AWS アカウント アカウントのユーザーにアクセス許可を委任できます。
注記
S3 オブジェクト所有権は、Amazon S3 バケットレベルの設定で、バケットにアップロードされる新しいオブジェクト所有権を制御し、ACL を無効にするのに使用できます。デフォルトでは、オブジェクト所有権はバケット所有者強制設定に設定されており、ALC はすべて無効になっています。ACL を無効にすると、バケット所有者はバケット内のすべてのオブジェクトを所有し、アクセス管理ポリシーのみを使用してデータへのアクセスを管理します。
Amazon S3 の最新のユースケースの大部分では ACL を使用する必要がなくなっています。オブジェクトごとに個別に制御する必要がある通常ではない状況を除き、ACL は無効にしておくことをお勧めします。ACL を無効にすると、誰がオブジェクトをバケットにアップロードしたかに関係なく、ポリシーを使用してバケット内のすべてのオブジェクトへのアクセスを制御できます。詳細については、「オブジェクトの所有権の制御とバケットの ACL の無効化。」を参照してください。
この例では、バケット所有者がオブジェクト所有権のバケット所有者強制設定を適用していないと仮定します。バケット所有者は、自分のアカウントのユーザーに許可を委任します。この手順の概要を以下に示します。

-
アカウント A の管理者ユーザーが、2 つのステートメントを持つバケットポリシーをアタッチします。
-
オブジェクトをアップロードするクロスアカウントアクセスをアカウント B に許可します。
自分のアカウントのユーザーにバケット内のオブジェクトへのアクセスを許可します。
-
-
アカウント B の管理者ユーザーは、アカウント A が所有するバケットにオブジェクトをアップロードします。
-
アカウント B の管理者は、オブジェクト ACL を更新して、オブジェクトに対するフルコントロールアクセス許可をバケット所有者に付与します。
-
アカウント A のユーザーは、所有者に関わりなくバケット内のオブジェクトにアクセスできることを確認します。
この例では、2 個のアカウントが必要です。次の表に、これらのアカウントの呼び方とそれぞれの管理者ユーザーを示します。このチュートリアルでは、推奨される IAM ガイドラインに従って、アカウントのルートユーザー認証情報を使用しません。詳細については、「管理者ユーザーを使用したリソースの作成とアクセス許可の付与について」を参照してください。その代わりに、各アカウントに管理者を作成し、その認証情報を使用してリソースを作成し、アクセス許可を付与します。
AWS アカウント ID | アカウントの呼び方 | アカウントの管理者 |
---|---|---|
|
アカウント A |
AccountAadmin |
|
アカウント B |
AccountBadmin |
ユーザーを作成し、アクセス許可を付与するためのすべてのタスクは、AWS Management Console で実行します。このチュートリアルでは、許可を検証するために、コマンドラインツールの AWS Command Line Interface (AWS CLI) と AWS Tools for Windows PowerShell を使用するので、コードを記述する必要はありません。
ステップ 0: チュートリアルの準備をする
-
前のセクションの表に示したように、2 個の AWS アカウントがあり、各アカウントに 1 人ずつの管理者が存在することを確認します。
-
必要な場合、AWS アカウントにサインアップします。
-
アカウント A の認証情報を使用して、IAM コンソール
にサインインし、次の操作を行って管理者ユーザーを作成します。 -
ユーザー AccountAadmin を作成し、セキュリティ認証情報を記録します。ユーザーの追加の詳細については、IAM ユーザーガイドAWS アカウントの での IAM ユーザーの作成 を参照してください。
-
AccountAadmin にフルアクセスを許可するユーザーポリシーをアタッチして、管理者権限を付与します。手順については、IAM ユーザーガイドのIAM ポリシーの管理を参照してください。
-
IAM コンソールの [Dashboard (ダッシュボード)] で、[IAM User Sign−In URL (IAM ユーザーのサインイン URL)] を記録します。このアカウントのユーザーは、この URL を使用して AWS Management Console にサインインします。詳細については、IAM ユーザーガイドのユーザーがお客様のアカウントにサインインする方法 を参照してください。
-
-
前述のステップを、アカウント B の認証情報を使用してもう一度実行し、管理者ユーザー AccountBadmin を作成します。
-
-
AWS CLI または Tools for Windows PowerShell をセットアップします。管理者認証情報を必ず次のように保存してください。
-
AWS CLI を使用する場合は、設定ファイルに
AccountAadmin
とAccountBadmin
の 2 つのプロファイルを作成します。 Tools for Windows PowerShell を使用する場合、セッションの認証情報を
AccountAadmin
およびAccountBadmin
として保存します。
手順については、チュートリアル例のツールのセットアップ を参照してください。
-
ステップ 1: アカウント A のタスクを実行する
アカウント A に対して、次の手順を実行します。
ステップ 1.1: コンソールにサインインする
アカウント A の IAM ユーザーのサインイン URL を使用して、AccountAadmin ユーザーとして AWS Management Consoleにサインインします。このユーザーはバケットを作成し、ポリシーをアタッチします。
ステップ 1.2: バケットとユーザーを作成し、ユーザーにアクセス許可を付与するバケットポリシーを追加する
-
Amazon S3 コンソールでバケットを作成します。この演習では、バケットを米国東部 (バージニア北部) リージョンに
という名前で作成することを前提とします。DOC-EXAMPLE-BUCKET1
手順については、バケットの作成 を参照してください。
-
IAM コンソールで、ユーザー Dave を作成します。
手順については、IAM ユーザーガイドのIAM ユーザーの作成 (コンソール) を参照してください。
-
Dave の認証情報を書き留めます。
-
Amazon S3 コンソールで、次のバケットポリシーを
バケットにアタッチします。手順については、Amazon S3 コンソールを使用したバケットポリシーの追加 を参照してください。バケットポリシーを追加するには、このステップに従います。アカウント ID を確認する方法については、AWS アカウント ID の検索 を参照してください。DOC-EXAMPLE-BUCKET1
このポリシーは、アカウント B に
s3:PutObject
およびs3:ListBucket
アクセス許可を付与します。このポリシーはまた、ユーザー Dave にs3:GetObject
アクセス許可を付与します。{ "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
AccountB-ID
:root" }, "Action": [ "s3:PutObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET1
/*", "arn:aws:s3:::DOC-EXAMPLE-BUCKET1
" ] }, { "Sid": "Statement3", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountA-ID
:user/Dave" }, "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET1
/*" ] } ] }
ステップ 2: アカウント B のタスクを実行する
これでアカウント B はアカウント A のバケットに対するオペレーション実行のアクセス許可を得ましたので、管理者は次の作業を行います。
-
アカウント A のバケットにオブジェクトをアップロードします。
バケット所有者であるアカウント A にそのバケットへのフルコントロールをオブジェクトの ACL で付与します。
AWS CLI を使用する場合
-
put-object
CLI コマンドを使用して、オブジェクトをアップロードします。アップロードするソースファイルは、コマンドの −-body
パラメータで指定します。例えば、ファイルが Windows マシンのC:
ドライブにある場合、c:\HappyFace.jpg
のように指定します。--key
パラメータは、オブジェクトのキー名を指定します。aws s3api put-object --bucket
DOC-EXAMPLE-BUCKET1
--key HappyFace.jpg --body HappyFace.jpg --profile AccountBadmin -
バケット所有者に対するオブジェクトのフルコントロールの許可をオブジェクト ACL に追加します。正規ユーザー ID を検索する方法については、AWS アカウントの正規ユーザー ID を検索するには を参照してください。
aws s3api put-object-acl --bucket
DOC-EXAMPLE-BUCKET1
--key HappyFace.jpg --grant-full-control id="AccountA-CanonicalUserID" --profile AccountBadmin
Tools for Windows PowerShell の使用
-
Write-S3Object
Tools for Windows PowerShell のコマンドを使用して、オブジェクトをアップロードします。Write-S3Object -BucketName
DOC-EXAMPLE-BUCKET1
-key HappyFace.jpg -file HappyFace.jpg -StoredCredentials AccountBadmin -
バケット所有者に対するオブジェクトのフルコントロールの許可をオブジェクト ACL に追加します。
Set-S3ACL -BucketName
DOC-EXAMPLE-BUCKET1
-Key HappyFace.jpg -CannedACLName "bucket-owner-full-control" -StoredCreden
ステップ 3: アクセス許可をテストする
アカウント A のユーザー Dave が、アカウント B が所有するオブジェクトにアクセスできることを確認します。
AWS CLI を使用する場合
-
ユーザー Dave の認証情報を AWS CLI の設定ファイルに追加して、新しいプロファイル
UserDaveAccountA
を作成します。詳細については、チュートリアル例のツールのセットアップ を参照してください。[profile UserDaveAccountA] aws_access_key_id =
access-key
aws_secret_access_key =secret-access-key
region =us-east-1
-
get-object
CLI コマンドを実行してHappyFace.jpg
をダウンロードし、ローカルに保存します。--profile
パラメータを追加して、ユーザー Dave の認証情報を指定します。aws s3api get-object --bucket
DOC-EXAMPLE-BUCKET1
--key HappyFace.jpgOutputfile.jpg
--profile UserDaveAccountA
Tools for Windows PowerShell の使用
-
ユーザー Dave の AWS 認証情報を、
UserDaveAccountA
という名前で永続的ストアに保存します。Set-AWSCredentials -AccessKey
UserDave-AccessKey
-SecretKeyUserDave-SecretAccessKey
-storeas UserDaveAccountA -
Read-S3Object
コマンドを実行してHappyFace.jpg
オブジェクトをダウンロードし、ローカルに保存します。-StoredCredentials
パラメータを追加して、ユーザー Dave の認証情報を指定します。Read-S3Object -BucketName
DOC-EXAMPLE-BUCKET1
-Key HappyFace.jpg -file HappyFace.jpg -StoredCredentials UserDaveAccountA
ステップ 4: クリーンアップする
-
テストが終了したら、次の手順でクリーンアップを行います。
-
アカウント A の認証情報を使用して AWS Management Console
にサインインし、次の操作を行います。 -
Amazon S3 コンソールで、
DOC−EXAMPLE−BUCKET1
にアタッチされているバケットポリシーを削除します。バケットの [Properties (プロパティ)] で、[Permissions (アクセス許可)] セクションのポリシーを削除します。 -
バケットをこの演習のために作成した場合は、Amazon S3 コンソールでオブジェクトを削除してから、バケットを削除します。
-
IAM コンソールで、AccountAadmin ユーザーを削除します。
-
-
-
アカウント B の認証情報を使用して AWS Management Console
にサインインします。IAM コンソールで、ユーザー AccountBadmin を削除します。