1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Quickデータソース作成ではまった話 ~クロスアカウントAthenaアクセス~

1
Posted at

はじめに

Amazon Quickでは、2026/5/8のアップデートにより、Quickとは別のAWSアカウントにあるAthenaをデータソースとして利用できるようになっています。

今回は以下の記事を参考に実装してみた際にはまったポイントについて書きたいと思います。

最初にまとめ

トラブルシューティングの結果わかったことは下記のとおりです。

QuickでクロスアカウントのAthenaデータソースを作成する場合、カスタムデータベースを利用する場合であっても、Quickからの接続テストのために、Consumerロールでdefaultデータベースに対するアクセス権限が必要

以降では上記に気づくまでの過程を書いていきます。

試した構成

今回試した構成はこちらです。先述の参考記事から図を引用しています。

image.png

以降では、QuickアカウントのIDを111111111111、ConsumerアカウントのIDを999999999999と仮定して話します。

Quickデータソース作成時にエラー発生

Quickアカウント上で、RunAsロールとQuickデータソースをまとめてCloudFormationでデプロイする際、Quickデータソース作成において下記のエラーが発生しました :no_entry:

Failed to assume your role. Verify the trust relationships of the role in the IAM console.

Consumerロールにスイッチする部分で、信頼関係に問題がありそうな感じです。

ロールの信頼関係を見直し

スイッチする部分の設定は参考記事と同じ記述にしており、特に問題は無さそうに見えました。

RunAsロールの許可ポリシー
{
    "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/*"
                }
            }
        }
    ]
}
Consumerロールの信頼ポリシー
{
    "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ロール自体は問題なく作成できるようです :white_check_mark:

次に同じCloudFormationスタックにQuickデータソースを追加してみたところ、デプロイに失敗しました :no_entry:

しかし、ロールとQuickデータソースをまとめてデプロイしたときと比べて、エラーメッセージが変わりました :bulb:

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ロールの許可ポリシーで下記のように許可していました。

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ポリシー作成とデータソース作成が並行していたことに気づきました :bulb:

Quickデータソースを作成するには、RunAsロールとポリシーが既に存在している必要があるため、CloudFormationテンプレートで依存関係を明示的に書きました。(参考記事との差異としては、ポリシーも依存関係に含めました)

Quickアカウント側で実行するCloudFormationテンプレート(一部抜粋)
  QsDataSource:
    Type: AWS::QuickSight::DataSource
    DependsOn:
      - QsAthenaCrossAccountRole
+     - QsAthenaCrossAccountPolicy

上記修正により、CloudFormationタイムライン上は特に問題無さそうな感じになりましたが、それでも同様のエラーが発生しました。

Consumerロール見直し

そこで、あらためてConsumerロールの許可ポリシーで参考記事から変更を加えていた部分を確認しました。
Glue操作部分のResourceを厳密に絞っていたところを、参考記事と同様のワイルドカード指定に戻してみました。

Consumerロールの許可ポリシー(一部抜粋)
    {
      "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/*"
      ]
    }

これで再度デプロイしてみたところ、見事成功しました :white_check_mark:

ただ直接的な原因はいまひとつわかりません・・・

CloudTrailから原因判明

Consumerアカウント側のCloudTrailでイベント名StartQueryExecutionのイベントを探してみたところ、下記のイベントが記録されていました。

CloudTrailイベント(一部抜粋)
{
    "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データベースに対するアクセス権限が無いことが原因だと判明しました。

先ほどワイルドカードにした許可ポリシーを下記のように修正したところ、問題なくデプロイすることができました :white_check_mark:

Consumerロールの許可ポリシー(一部抜粋)
    {
      "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データソースを作成する際にはまったポイントを紹介しました。
どなたかの参考になれば幸いです。

弊社では一緒に働く仲間を募集中です!

現在、様々な職種を募集しております。
カジュアル面談も可能ですので、ご連絡お待ちしております!

募集内容等詳細は、是非採用サイトをご確認ください。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?