AWS Glue データカタログへのクロスアカウントアクセスを試してみた


# 背景・目的
提供側のアカウントのデータカタログ（データベース、テーブル）を、利用者側のアカウントからAthenaでアクセスさせます。
Glueのデータカタログについて、クロスアカウントアクセスさせるための設定をメモしておきます。

今回試してみた構成は下記のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0bec215e-a74b-7ba2-a626-3bcbd7757650.png)

# まとめ
データカタログの共有には、下記の対応が必要です。

- 提供側
    - Glueデータカタログのポリシーの修正
    - S3バケットポリシーの修正
- 利用者側
    - Athenaのデータソース追加

# 実践
## 提供側の設定
### S３バケットとデータの作成
提供側（アカウントA）でS3バケットとデータを作成します。

1. 下記のデータをS3にアップロードします。
    ```
    {"process_date":"20230419","value":1}
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/73891e4f-e100-c777-7261-a43826644dd3.png)


### Glueデータベースとテーブルの作成
1. Glueデータベースを作成します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/abfd5160-75f1-03e2-4563-4e8fe3ff07d8.png)

1. 下記を入力し、Nextをクリックします。
    - Table名
    - S3パス
    - フォーマット（ここではJSON）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/41420b52-d652-417a-669c-441cd5afeb0e.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/12d400a6-1077-1ad9-e1d6-ac46efd1d0f7.png)
1. 下記を入力し、Nextをクリックします。
    - スキーマ（カラム名、型）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/acd99c01-665b-ca7f-f954-2cb190fc2e90.png)

1. 最後に内容を確認し、Createをクリックします。
1. パーティションキーを追加します。（忘れていたのでスキーマを編集しました。）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/b10484a5-22b4-8242-7eef-74d37437f6a1.png)

### Athenaで確認します。
提供側のアカウントでデータを確認できるか確認します。

1. Athenaのクエリエディタでパーティションを作成します。
    ```
    MSCK REPAIR TABLE `test_table`;
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d8efad65-a4c1-6464-357d-d811807af8df.png)

1. データを確認します。（確認できました。）
    ```
    SELECT * FROM "crossaccount_access_db"."test_table" limit 10;
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/4d2739e8-4717-6bd9-7bc8-5546b1d66c17.png)

### Glueデータカタログの設定
利用者側からアクセス可能なように、データカタログのポリシーを修正します。
1. GlueのナビゲーションペインでCatalog settingsをクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9c0c53dd-11f1-60aa-c13a-28b3ce05e75d.png)

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::XXXXXXXX:XXXXXXXXX/XXXXXXXX"
                ]
            },
            "Action": [
                "glue:List*",
                "glue:Get*"
            ],
            "Resource": [
                "arn:aws:glue:XXXXXX:XXXXXXXX:catalog",
                "arn:aws:glue:XXXXXX:XXXXXXXX:database/crossaccount_access_db",
                "arn:aws:glue:XXXXXX:XXXXXXXX:table/crossaccount_access_db/test_table"
            ]
        }
    ]
}
```

### S3バケットポリシーの設定
1. Athenaからアクセスされるテーブルに紐付いているS3バケットのポリシーを修正します。Principalには利用者アカウントのIAMロールを追加します。
    ```
    {
    	"Version": "2012-10-17",
    	"Statement": [
    		{
    			"Sid": "Statement1",
    			"Principal": {
                    "AWS": [
                        "arn:aws:iam::XXXXXXX:XXXXX/XXXXX/XXXXXX"
                    ]
    			},
    			"Effect": "Allow",
    			"Action":[
                    "s3:GetObject",
                    "s3:ListBucket"
                 ],
    			"Resource": 
    			    [
    			        "arn:aws:s3:::XXXX",
    			        "arn:aws:s3:::XXXX/*"
    			    ]
    		}
    	]
    }
    ```


## 利用者側の設定
### データソースの作成
1. Athenaのナビゲーションペインでデータソースをクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3d799e7c-ae87-0a56-85f3-1786e0ac6ee0.png)

1. 右上の「データソースの作成」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/50568093-b3a7-8f66-05b7-975649ecb020.png)

1. S3 - AWS Glueデータカタログを選択し、次へをクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ca495e0e-b61f-9bbb-9abe-e14331a6a369.png)

1. 下記を入力し、「次へ」をクリックします。
    - AWS Glueデータカタログを選択で、「別のアカウントのAWS Glueデータカタログ」
    - データソース名：任意
    - カタログID：提供側のアカウントID12桁
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9b6fa513-f15f-da02-3cd9-2d06c0fa0e17.png)

1. 内容を確認し、「データソースの作成」を　クリックします。

### Athenaで確認
1. Athenaのクエリエディタを開き、データソースに作成した[account_a_catalog」を選択します。提供側アカウントで作成したデータベースとテーブルが表示されました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/bb4d1956-77cf-2169-95ab-53e7f4daa5fe.png)

1. 下記のクエリを実行します。結果が返ってきました。
    ```
    SELECT * FROM account_a_catalog.crossaccount_access_db.test_table
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f26f3456-be93-0c67-d586-dc3a3db060d5.png)

# 考察
今回、データカタログを、別アカウントに共有する方法を試してみました。
データレイクで作成したデータを利用者側に連携せずに、直接参照させるユースケース場合などに利用ができそうです。


# 参考
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/security-iam-cross-account-glue-catalog-access.html