はじめに
Amazon Quickでは、2026/5/8のアップデートにより、Quickとは別のAWSアカウントにあるAthenaをデータソースとして利用できるようになっています。
今回は以下の記事を参考に実装してみた際にはまったポイントについて書きたいと思います。
最初にまとめ
トラブルシューティングの結果わかったことは下記のとおりです。
QuickでクロスアカウントのAthenaデータソースを作成する場合、カスタムデータベースを利用する場合であっても、Quickからの接続テストのために、Consumerロールでdefaultデータベースに対するアクセス権限が必要
以降では上記に気づくまでの過程を書いていきます。
試した構成
今回試した構成はこちらです。先述の参考記事から図を引用しています。
以降では、QuickアカウントのIDを111111111111、ConsumerアカウントのIDを999999999999と仮定して話します。
Quickデータソース作成時にエラー発生
Quickアカウント上で、RunAsロールとQuickデータソースをまとめてCloudFormationでデプロイする際、Quickデータソース作成において下記のエラーが発生しました ![]()
Failed to assume your role. Verify the trust relationships of the role in the IAM console.
Consumerロールにスイッチする部分で、信頼関係に問題がありそうな感じです。
ロールの信頼関係を見直し
スイッチする部分の設定は参考記事と同じ記述にしており、特に問題は無さそうに見えました。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sts:AssumeRole"
],
"Resource": "arn:aws:iam::999999999999:role/quick-consumer-role",
"Condition": {
"StringLike": {
"sts:ExternalId": "arn:aws:quicksight:*:111111111111:datasource/*"
}
}
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111111111111:root"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringLike": {
"sts:ExternalId": "arn:aws:quicksight:*:111111111111:datasource/*"
}
}
}
]
}
切り分け
切り分けとしてQuickデータソース無しでデプロイしてみたところデプロイに成功しました。RunAsロール自体は問題なく作成できるようです ![]()
次に同じCloudFormationスタックにQuickデータソースを追加してみたところ、デプロイに失敗しました ![]()
しかし、ロールとQuickデータソースをまとめてデプロイしたときと比べて、エラーメッセージが変わりました ![]()
Connection test failed: Could not get query execution ID: You are not authorized to perform: athena:StartQueryExecution on the resource. After your AWS administrator or you have updated your permissions, please try again.
このエラーメッセージはより具体的で、以下のことが読み取れます。
- 接続テストに失敗したこと
-
athena:StartQueryExecutionを実行する権限が無いこと
athena:StartQueryExecutionはConsumerロールの許可ポリシーで下記のように許可していました。
{
"Action": [
"athena:BatchGetQueryExecution",
"athena:CancelQueryExecution",
"athena:GetQueryExecution",
"athena:GetQueryExecutions",
"athena:GetQueryResults",
"athena:GetQueryResultsStream",
"athena:GetWorkGroup",
"athena:ListQueryExecutions",
"athena:StartQueryExecution",
"athena:StopQueryExecution"
],
"Resource": "arn:aws:athena:ap-northeast-1:999999999999:workgroup/quick-workgroup",
"Effect": "Allow",
"Sid": "AthenaWorkgroupActions"
}
参考記事との差異としては、Resourceの指定を具体化(workgroup/*でなくワークグループ名まで記述)していました。ただし、ワークグループ名に記述ミスは無いようでした。
デプロイ時の依存関係
原因がわからないため、再度デプロイを試してCloudFormationタイムラインを眺めていたところ、IAMポリシー作成とデータソース作成が並行していたことに気づきました ![]()
Quickデータソースを作成するには、RunAsロールとポリシーが既に存在している必要があるため、CloudFormationテンプレートで依存関係を明示的に書きました。(参考記事との差異としては、ポリシーも依存関係に含めました)
QsDataSource:
Type: AWS::QuickSight::DataSource
DependsOn:
- QsAthenaCrossAccountRole
+ - QsAthenaCrossAccountPolicy
上記修正により、CloudFormationタイムライン上は特に問題無さそうな感じになりましたが、それでも同様のエラーが発生しました。
Consumerロール見直し
そこで、あらためてConsumerロールの許可ポリシーで参考記事から変更を加えていた部分を確認しました。
Glue操作部分のResourceを厳密に絞っていたところを、参考記事と同様のワイルドカード指定に戻してみました。
{
"Effect": "Allow",
"Action": [
"glue:BatchGetPartition",
"glue:GetCatalog",
"glue:GetCatalogs",
"glue:GetDatabase",
"glue:GetDatabases",
"glue:GetPartition",
"glue:GetPartitions",
"glue:GetTable",
"glue:GetTables"
],
"Resource": [
- "arn:aws:glue:ap-northeast-1:999999999999:catalog",
- "arn:aws:glue:ap-northeast-1:999999999999:database/test-db",
- "arn:aws:glue:ap-northeast-1:999999999999:table/test-db/test-table"
+ "arn:aws:glue:ap-northeast-1:999999999999:catalog",
+ "arn:aws:glue:ap-northeast-1:999999999999:database/*",
+ "arn:aws:glue:ap-northeast-1:999999999999:table/*"
]
}
これで再度デプロイしてみたところ、見事成功しました ![]()
ただ直接的な原因はいまひとつわかりません・・・
CloudTrailから原因判明
Consumerアカウント側のCloudTrailでイベント名StartQueryExecutionのイベントを探してみたところ、下記のイベントが記録されていました。
{
"requestParameters": {
"queryString": "***OMITTED***",
"clientRequestToken": "6da07a63-b66e-47ea-8908-a35af971a093",
"queryExecutionContext": {
"database": "default",
"catalog": "AwsDataCatalog"
},
"workGroup": "quick-workgroup",
"resultReuseConfiguration": {
"resultReuseByAgeConfiguration": {
"enabled": false
}
}
},
"responseElements": {
"queryExecutionId": "5159f1de-eb55-457d-a731-f257fc187030"
}
}
queryExecutionIdを基に実際のクエリの内容を確認したところ、JDBCドライバの接続テストをdefaultデータベースに対して実施していることがわかりました。
$ aws athena get-query-execution --query-execution-id 5159f1de-eb55-457d-a731-f257fc187030
{
"QueryExecution": {
"QueryExecutionId": "5159f1de-eb55-457d-a731-f257fc187030",
"Query": "-- Athena JDBC driver connection test\nSELECT 1",
"StatementType": "DML",
"QueryExecutionContext": {
"Database": "default",
"Catalog": "awsdatacatalog"
}
~ 省略 ~
}
}
JDBCドライバのDatabaseパラメータはオプションかつデフォルト値がdefaultになっており、明示的なデータベース指定無しの接続テスト用クエリを実行するためdefaultデータベースに接続しに行く、ということなのかもしれません。
ということで、defaultデータベースに対するアクセス権限が無いことが原因だと判明しました。
先ほどワイルドカードにした許可ポリシーを下記のように修正したところ、問題なくデプロイすることができました ![]()
{
"Effect": "Allow",
"Action": [
"glue:BatchGetPartition",
"glue:GetCatalog",
"glue:GetCatalogs",
"glue:GetDatabase",
"glue:GetDatabases",
"glue:GetPartition",
"glue:GetPartitions",
"glue:GetTable",
"glue:GetTables"
],
"Resource": [
"arn:aws:glue:ap-northeast-1:999999999999:catalog",
+ "arn:aws:glue:ap-northeast-1:999999999999:database/default",
"arn:aws:glue:ap-northeast-1:999999999999:database/test-db",
"arn:aws:glue:ap-northeast-1:999999999999:table/test-db/test-table"
]
}
なお、上記アクションのうち、defaultデータベースに対して必要なアクションを検証することもできますが、今回はそこまで試せていません。
失敗時にCloudTrailに記録されない
なお、RunAsロールとQuickデータソースを段階的にデプロイして下記エラーメッセージになった際も、CloudTrailは確認していました。
Connection test failed: Could not get query execution ID: You are not authorized to perform: athena:StartQueryExecution on the resource. After your AWS administrator or you have updated your permissions, please try again.
ただその際はStartQueryExecutionイベントが記録されていませんでした。失敗した時もイベントに記録されていれば、もう少し早く原因にたどり着けたかもしれません。
さいごに
今回はQuickでクロスアカウントのAthenaデータソースを作成する際にはまったポイントを紹介しました。
どなたかの参考になれば幸いです。
弊社では一緒に働く仲間を募集中です!
現在、様々な職種を募集しております。
カジュアル面談も可能ですので、ご連絡お待ちしております!
募集内容等詳細は、是非採用サイトをご確認ください。
