背景・目的
提供側のアカウントのデータカタログ(データベース、テーブル)を、利用者側のアカウントからAthenaでアクセスさせます。
Glueのデータカタログについて、クロスアカウントアクセスさせるための設定をメモしておきます。
今回試してみた構成は下記のとおりです。
まとめ
データカタログの共有には、下記の対応が必要です。
- 提供側
- Glueデータカタログのポリシーの修正
- S3バケットポリシーの修正
- 利用者側
- Athenaのデータソース追加
実践
提供側の設定
S3バケットとデータの作成
提供側(アカウントA)でS3バケットとデータを作成します。
Glueデータベースとテーブルの作成
-
下記を入力し、Nextをクリックします。
-
下記を入力し、Nextをクリックします。
-
最後に内容を確認し、Createをクリックします。
Athenaで確認します。
提供側のアカウントでデータを確認できるか確認します。
-
Athenaのクエリエディタでパーティションを作成します。
MSCK REPAIR TABLE `test_table`;
-
データを確認します。(確認できました。)
SELECT * FROM "crossaccount_access_db"."test_table" limit 10;
Glueデータカタログの設定
利用者側からアクセス可能なように、データカタログのポリシーを修正します。
{
"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バケットポリシーの設定
- 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/*" ] } ] }
利用者側の設定
データソースの作成
-
下記を入力し、「次へ」をクリックします。
-
内容を確認し、「データソースの作成」を クリックします。
Athenaで確認
-
Athenaのクエリエディタを開き、データソースに作成した[account_a_catalog」を選択します。提供側アカウントで作成したデータベースとテーブルが表示されました。
-
下記のクエリを実行します。結果が返ってきました。
SELECT * FROM account_a_catalog.crossaccount_access_db.test_table
考察
今回、データカタログを、別アカウントに共有する方法を試してみました。
データレイクで作成したデータを利用者側に連携せずに、直接参照させるユースケース場合などに利用ができそうです。
参考