Athena での Amazon S3 バケットへのクロスアカウントアクセス - Amazon Athena

Athena での Amazon S3 バケットへのクロスアカウントアクセス

一般的な Amazon Athena シナリオでは、バケット所有者とは異なるアカウント内のユーザーにアクセス権を付与して、ユーザーがクエリを実行できるようにします。この場合は、アクセス権の付与にバケットポリシーを使用します。

注記

Athena からの AWS Glue データカタログへのクロスアカウントアクセスの詳細については、「データカタログへのクロスアカウントアクセス」を参照してください。

以下のバケットポリシー例は、バケット所有者によって作成されてバケット s3://my-athena-data-bucket に適用されており、異なるアカウントであるアカウント 123456789123 内のすべてのユーザーにアクセス権を付与します。

{ "Version": "2012-10-17", "Id": "MyPolicyID", "Statement": [ { "Sid": "MyStatementSid", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789123:root" }, "Action": [ "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:ListMultipartUploadParts", "s3:AbortMultipartUpload", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::my-athena-data-bucket", "arn:aws:s3:::my-athena-data-bucket/*" ] } ] }

アカウントの特定のユーザーにアクセス権を付与するには、Principal キーを root から特定のユーザーを指定するキーに置き換えます。たとえば、ユーザープロファイル Dave にアクセス許可を付与するには、arn:aws:iam::123456789123:user/Dave に置き換えます。

カスタム AWS KMS キーで暗号化されたバケットへのクロスアカウントアクセス

カスタム AWS Key Management Service (AWS KMS) キーで暗号化された Amazon S3 バケットがある場合は、別の Amazon Web Services アカウントのユーザーに対してそのバケットへのアクセスを許可する必要がある場合があります。

アカウント A の AWS KMS暗号化されたバケットへのアクセスをアカウント B のユーザーに付与するには、次のアクセス許可が必要です。

  • アカウント A のバケットポリシーが、アカウント B へのアクセス権を付与する必要があります。

  • アカウント A の AWS KMS キーポリシーは、アカウント B のユーザーにアクセスを許可する必要があります。

  • アカウント B の AWS Identity and Access Management (IAM) ユーザーポリシーで、アカウント A のバケットとキーの両方へのアクセスをユーザーに許可する必要があります。

以下の手順では、これらのアクセス許可をそれぞれ付与する方法を示します。

アカウント A のバケットへのアクセスをアカウント B のユーザーに許可するには

  • アカウント A で S3 バケットポリシーを確認し、アカウント B のアカウント ID からのアクセスを許可するステートメントがあることを確認します。

    たとえば、次のバケットポリシーは、アカウント ID 111122223333 に対して s3:GetObject へのアクセスを許可します。

    { "Id": "ExamplePolicy1", "Version": "2012-10-17", "Statement": [ { "Sid": "ExampleStmt1", "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": "arn:aws:s3:::awsexamplebucket/*", "Principal": { "AWS": [ "111122223333" ] } } ] }

アカウント A の AWS KMS キーポリシーからアカウント B のユーザーに対してアクセスを許可するには

  1. アカウント A の AWS KMS キーポリシーで、アカウント B のユーザーに以下のアクションに対するアクセス許可を付与します。

    • kms:Encrypt

    • kms:Decrypt

    • kms:ReEncrypt*

    • kms:GenerateDataKey*

    • kms:DescribeKey

    以下の例では、1 つの IAM ユーザーまたはロールのみにキーへのアクセス権を付与します。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowUseOfTheKey", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/role_name" }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*" } ] }
  2. アカウント A から、AWS Management Console のポリシービューを使用してキーポリシーを確認します。

  3. キーポリシーで、次のステートメントによってアカウント B がプリンシパルとしてリストされていることを確認します。

    "Sid": "Allow use of the key"
  4. "Sid": "Allow use of the key" ステートメントが存在しない場合は、以下のステップを実行します。

    1. コンソールのデフォルトビューを使用してキーポリシーを表示するように切り替えます。

    2. アカウント B のアカウント ID を、キーにアクセスできる外部アカウントとして追加します。

アカウント B の IAM ユーザーポリシーからアカウント A のバケットとキーへのアクセス権を付与する

  1. アカウント B から、IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

  2. アカウント B のユーザーに関連付けられている IAM ユーザーまたはロールを開きます。

  3. IAM ユーザーまたはロールに適用されている許可ポリシーのリストを確認します。

  4. バケットへのアクセスを許可するポリシーが適用されていることを確認します。

    以下のステートメント例は、バケット awsexamplebucket での s3:GetObject オペレーションと s3:PutObject オペレーションに対するアクセス権を IAM ユーザーに付与します。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "ExampleStmt2", "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": "arn:aws:s3:::awsexamplebucket/*" } ] }
  5. キーへのアクセスを許可するポリシーが適用されていることを確認します。

    注記

    アカウント B の IAM ユーザーまたはロールが管理者アクセス権を既に持っている場合は、ユーザーの IAM ポリシーからキーへのアクセス権を付与する必要はありません。

    以下のステートメント例は、arn:aws:kms:us-west-2:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd キーを使用するためのアクセス権を IAM ユーザーに付与します。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "ExampleStmt3", "Action": [ "kms:Decrypt", "kms:DescribeKey", "kms:Encrypt", "kms:GenerateDataKey", "kms:ReEncrypt*" ], "Effect": "Allow", "Resource": "arn:aws:kms:us-west-2:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd" } ] }

IAM ユーザーの許可を追加または修正する方法に関する手順については、「IAM ユーザーのアクセス権限の変更」を参照してください。

バケットオブジェクトへのクロスアカウントアクセス

バケットの所有アカウント (アカウント A) 以外のアカウント (アカウント C) によってアップロードされたオブジェクトには、クエリを実行するアカウント (アカウント B) への読み取りアクセスを許可する明示的なオブジェクトレベルの ACL が必要になる場合があります。この要件を回避するには、アカウント C がアカウント A のバケットにオブジェクトを配置する前に、アカウント A のロールを引き受ける必要があります。詳細については、「Amazon S3 バケット内のオブジェクトへのクロスアカウントアクセスを提供するには、どうしたらいいですか?」を参照してください。