Amazon S3 バケットのリクエスタ支払いをスイッチロール先のアカウントから受け付ける方法

S3バケットからのデータ転送料は他アカウントにお支払いいただきたいときの設定のスイッチロール編です。
2023.03.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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

参考