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

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

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

注記

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

以下のバケットポリシー例は、バケット所有者によって作成されてバケット s3://DOC-EXAMPLE-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" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET", "arn:aws:s3:::DOC-EXAMPLE-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:::DOC-EXAMPLE-BUCKET/*", "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. バケットへのアクセスを許可するポリシーが適用されていることを確認します。

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

    { "Version": "2012-10-17", "Statement": [ { "Sid": "ExampleStmt2", "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" } ] }
  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" } ] }

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

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