Amazon S3 のリクエスタ支払い設定でスイッチロール先の AWS アカウントから S3 バケットへアクセスする際の S3 のバケットポリシーを考える機会がありました。
- データが保存されている S3 バケットは別アカウントにある
- データ転送費用はスイッチロール先の AWS アカウントが支払う
データが保存されている S3 バケットで必要な S3 バケットポリシーの設定例を紹介します。
S3 リクエスタ支払い設定
リクエスタ支払い設定は簡単で設定を有効化するだけです。S3 バケットのプロパティタブから
リクエスタ支払いの設定を有効にします。
その他注意事項は以下のブログを参照ください。当記事では S3 バケットのバケットポリシーについて触れます。
S3 バケットポリシーの設定
引き続きリクエスタ支払いを有効化した S3 バケットの設定を行います。S3 バケットのアクセス許可タブから
バケットポリシーを編集します。
バケットポリシーの例
以下の要件のバケットポリシー例を紹介します。
- スイッチロールした AWS アカウントのIAM ロールからS3 バケットへのアクセスが発生する
- ファイルのダウンロードのみを行い、アップロードは行わない
Principal
でスイッチロール先の AWS アカウントの IAM ロール名を指定してください- スイッチロール先にある IAM ロールの ARN が必要
Resource
は設定する S3 バケットの名前に置き換えてください
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/ohmura-yasutaka"
},
"Action": [
"s3:ListBucket",
"s3:ListBucketVersions",
"s3:GetObject",
"s3:GetObjectVersion"
],
"Resource": [
"arn:aws:s3:::test-requester-private",
"arn:aws:s3:::test-requester-private/*"
]
}
]
}
Principal 指定する値
スイッチロール先の S3 バケットにログインできる権限があれば、IAM ロールの ARN をコピーするのが手っ取り早いです。
リクエスタ支払いの設定するケースですので、ご自身で管理されていないことも多いでしょう。その際はアクセス元の AWS アカウントの管理者の方にご確認ください。
アクセステスト
リクエスタ支払いの設定ですので引数に--request-payer
の指定が必要です。明示的に指定することでデータへアクセスする側(リクエスタ側)がデータアクセスに対して費用を負担することを了承したことを意味します。
ファイルのダウンロードできることが目的ですが、保存されているファイル名(オブジェクト)は確認したいと思うのでList
の権限を与えています。
$ aws s3 ls s3://test-requester-private --request-payer
2023-03-24 10:33:38 61 sample.json
aws s3 cp
コマンドでダウンロードできることも確認できました。
$ aws s3 cp s3://test-requester-private/sample.json . --request-payer
download: s3://test-requester-private/sample.json to ./sample.json
Principal
で指定された AWS アカウントの IAM ロール以外ですとアクセスができません。
$ aws s3 ls s3://test-requester-private --request-payer
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied
おわりに
スイッチロールした先の AWS アカウントにデータ転送費用が発生することはドキュメントから読み取れ、設定自体は可能なことがわかりました。ですが、アクセス制限をかける際のバケットポリシーの設定例が見当たらなかったため検証した内容をまとめました。
リクエスタがリクエストを送る前に AWS Identity and Access Management (IAM) ロールを引き受ける際に、ロールが属するアカウントにリクエストの料金が発生します。IAM ロールの詳細については、IAM ユーザーガイド の「IAM ロール」を参照してください。 ストレージ転送と使用量のリクエスタ支払いバケットの使用 - Amazon Simple Storage Service