はじめに
アカウントAのGlue Data CatalogにアカウントBのS3バケットのテーブルを登録後、アカウントAのAthenaからクエリを実行を試みました。
しかし権限エラーでうまくいかず、結果的に3つの構成を検討しました。特に検討したがNGだった構成②:AssumeRoleを利用した構成(失敗)では、Athenaの権限設定の考え方について苦労しました。
備忘として、クロスアカウントでAthenaからS3バケットにアクセスする際にNGだった構成と実際に問題を解消できた構成を紹介します。
目次
前提
-
環境
- アカウントA⇒Athena、Glueデータカタログがある環境
- アカウントB⇒データソース(S3)がある環境
- AWS Glue Data Catalogは作成済み
検討したがNGだった構成①:IAMユーザーを直接バケットポリシーに指定
-
概要
AthenaクエリをアカウントAの各IAMユーザーの権限で実行し、アカウントBのS3バケットポリシーのPrincipalに各IAMユーザーを直接記載してアクセス権限を付与する方法を検討しました。
Athenaクエリ実行自体は成功しましたが、運用負荷の観点から採用しませんでした。

-
権限設定
-
アカウントA(Athena実行側)
- IAMユーザーにAthena実行権限を付与
-
アカウントB(S3バケット側)
- S3バケットポリシーのPrincipalにAthenaクエリを実行するIAMユーザーを記載
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::<accountA-id>:user/example-athena-user-001",
"arn:aws:iam::<accountA-id>:user/example-athena-user-002",
"arn:aws:iam::<accountA-id>:user/example-athena-user-003"
]
},
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::example-data-source-bucket-001",
"arn:aws:s3:::example-data-source-bucket-001/*"
]
}
]
}
-
この構成の課題
この方法でAthenaクエリ実行可能です。ただし、S3バケットポリシーにIAMユーザー名を直接記載してしまうと下記のような課題があります。- IAMユーザーの追加/削除のたびにS3バケットポリシーの更新が必要になる
- S3バケットポリシーが長くなりすぎる恐れがあり、20KBの文字サイズ制限に達しやすくなる
上記の理由から、S3バケットポリシーにIAMユーザーを直接記載するのではなく、IAMロールの権限でアクセスする方法に切り替えました。
検討したがNGだった構成②:AssumeRoleを利用した構成(失敗)
-
概要
アカウントAのユーザーにAssumeRoleするポリシーをアタッチし、アカウントBのバケットポリシーでIAMロールを許可する方法を検討しました。
そうすることでS3バケットへのバケットポリシー記述をシンプルにできると考えました。

-
権限設定
-
アカウントB(S3バケット側)
- アカウントBでAssumeRoleできるロールを作成する。
- バケットポリシーのPrincipalでロールを許可する。
-
アカウントA(Athena実行側)
- アカウントAのユーザーにアカウントBのロールをAssumeRoleするポリシーをアタッチする。
-
この構成が失敗した原因
- Athenaの仕様として暗黙のAssumeRoleを使用できないため。具体的に言うと、Athenaはクエリ実行時に実行するユーザーの権限を参照するが、別AWSアカウント上に存在するIAMロールへのAssumeRoleを利用したアカウント間S3アクセスはできないと考えられる
- AssumeRoleできるロールの信頼関係は最小権限とするためIAMユーザーをPrincipalに指定していたが、アカウント全体を指定するなど広い権限であれば成功した可能性がある
今回設定した構成
-
概要
IAMロールベースでのAthenaアクセスをしたいため、Athenaクエリを実行する時のみセルフスイッチロールで権限を切り替える方法としました。
IAMロールを利用したセルフスイッチロールを利用することで、一時的な権限でAthenaクエリを実行できます。
1. 権限設定
①IAMポリシー
Athenaクエリを実行するIAMポリシー(athena-access-policy)を作成します。
作成する環境はアカウントAです。
IAMポリシー権限の概要は下記の通りです。
- Athenaクエリ実行とGlueデータカタログ参照
- 実際のデータが保存されているS3バケット(別アカウント)からデータを読み取るための権限
- Athenaのクエリ結果をバケットに保存・取得するための権限
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AthenaAndGlueAccess",
"Effect": "Allow",
"Action": [
"athena:*",
"glue:Get*",
"glue:List*",
"glue:SearchTables*"
],
"Resource": "*"
},
{
"Sid": "DataSourceS3Access",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::example-data-source-bucket-001",
"arn:aws:s3:::example-data-source-bucket-001/*",
"arn:aws:s3:::example-data-source-bucket-002",
"arn:aws:s3:::example-data-source-bucket-002/*"
]
},
{
"Sid": "AthenaResultsS3Access",
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:PutObject",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::aws-athena-query-results-<accountA-id>-ap-northeast-1",
"arn:aws:s3:::aws-athena-query-results-<accountA-id>-ap-northeast-1/*"
]
}
]
}
②IAMロール
Athenaクエリ実行用IAMロール(athena-access-role)を作成します。
-
アタッチするポリシー
上記で作成したIAMポリシー(athena-access-policy)をアタッチします。 -
信頼関係
Athenaクエリ実行前にセルフスイッチロールするため、信頼関係にAthena実行するユーザーを指定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::<accountA-id>:user/example-athena-user-001",
"arn:aws:iam::<accountA-id>:user/example-athena-user-002",
"arn:aws:iam::<accountA-id>:user/example-athena-user-003"
]
},
"Action": "sts:AssumeRole"
}
]
}
③S3バケットポリシー
データソースアカウントのS3バケットポリシーに設定します。
Principalに記載のアカウントIDは、アカウントAのアカウントIDを記載します。
※クロスアカウントでのAthenaクエリ実行がメインのため、Glueクローラー用ロールの詳細は省略
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AthenaReadAccess",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::<accountA-id>:role/athena-access-role",
"arn:aws:iam::<accountA-id>:role/glue-crawler-role"
]
},
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::example-data-source-bucket-001",
"arn:aws:s3:::example-data-source-bucket-001/*"
]
}
]
}
2. Glueクローラー実行
Glueクローラーを実行し、「テーブル」メニューからテーブルが作成されていることを確認する。
※クロスアカウントでのAthenaクエリ実行がメインのため、Glueクローラーの権限設定・作成・実行手順は省略
3. Athenaクエリ実行
クロスアカウントアクセスが必要な場合、適切な権限を持つロールに切り替えてからAthenaクエリ実行します。
①ロール切り替え(セルフスイッチロール)
- 対象アカウントにログイン
- データカタログが配置されているアカウントAにログイン
- AWSコンソール右上のIAMユーザー名をクリック
- 「ロールの切り替え」を選択
- 以下の情報を入力:
- アカウントID
- IAMロール名: athena-access-role
- 表示名: Athena実行ロール
- 「ロールの切り替え」をクリック
②Athena実行
- Glueコンソールの「テーブル」で対象テーブルを選択
- 「Action」メニューから「View data」をクリック
- Athenaのクエリページに遷移
- テストクエリの実行と実行結果の確認
-- クエリページに遷移するとデータ確認クエリが実行される
SELECT * FROM example_database.example_table LIMIT 10;
まとめ
本記事では、クロスアカウント環境でAthenaを実行するためのIAMロールベースの権限を設定しました。
実装のポイントは下記のとおりです。
- Athenaの仕様として暗黙のAssumeRoleを使用できない
- IAMユーザーを直接S3バケットポリシーに記載するのではなく、IAMロールをPrincipalに指定することで管理性などを向上できる
- 必要な時のみロールに切り替えることで、一時的な権限でアクセスできる

