

# Athena で Amazon S3 バケットへのクロスアカウント アクセスを構成する
<a name="cross-account-permissions"></a>

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

**注記**  
Athena からの AWS Glue データカタログへのクロスアカウントアクセスの詳細については、「[AWS Glue データカタログへのクロスアカウントアクセスを構成する](security-iam-cross-account-glue-catalog-access.md)」を参照してください。

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

------
#### [ JSON ]

****  

```
{
   "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:::amzn-s3-demo-bucket",
             "arn:aws:s3:::amzn-s3-demo-bucket/*"
          ]
       }
    ]
 }
```

------

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

## カスタム AWS KMS キーで暗号化されたバケットへのクロスアカウントアクセスを構成する
<a name="cross-account-permissions-kms"></a>

カスタム 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 バケットポリシーを確認](https://docs.aws.amazon.com/AmazonS3/latest/userguide/add-bucket-policy.html)し、アカウント B のアカウント ID からのアクセスを許可するステートメントがあることを確認します。

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

------
#### [ JSON ]

****  

  ```
  {
    "Id": "ExamplePolicy1",
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Sid": "ExampleStmt1",
        "Action": [
          "s3:GetObject"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::amzn-s3-demo-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 ロールのみにキーへのアクセス許可を付与します。

------
#### [ JSON ]

****  

   ```
   {
       "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": "*"
           }
       ]
   }
   ```

------

1. アカウント A から、[AWS マネジメントコンソール のポリシービューを使用して](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html#key-policy-modifying-how-to-console-policy-view)キーポリシーを確認します。

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

   ```
   "Sid": "Allow use of the key" 
   ```

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

   1. [コンソールのデフォルトビューを使用](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html#key-policy-modifying-how-to-console-default-view)してキーポリシーを表示するように切り替えます。

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

**アカウント B によって推定される IAM ロールからアカウント A のバケットとキーへのアクセスを許可するには**

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

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

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

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

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

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "ExampleStmt2",
         "Action": [
           "s3:GetObject",
           "s3:PutObject"
         ],
         "Effect": "Allow",
         "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
       }
     ]
   }
   ```

------

1. キーへのアクセスを許可するポリシーが適用されていることを確認します。
**注記**  
アカウント B によって推定される IAM ロールが[管理者アクセス許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started_create-admin-group.html)を既に持っている場合は、ユーザーの IAM ポリシーからキーへのアクセス許可を付与する必要はありません。

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

------
#### [ JSON ]

****  

   ```
   {
     "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 name="cross-account-permissions-objects"></a>

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