QuickSight で DynamoDB のデータを可視化するためのフェデレーテッドクエリ用 Lambda を選択できない

発生している事象

QuickSight の管理画面で Athena への権限付与の際、フェデレーテッドクエリ用の Lambda を選択することができません。

やりたいこと

QuickSight で DynamoDB のデータを可視化したいです。

実施・調査したこと

以下のブログとドキュメントを参考に、QuickSight で DynamoDB のデータを可視化しようとしています。

Athena ⇒ DynamoDB へのフェデレーテッドクエリは成功し、Athena で DynamoDB のデータをクエリできるようになりました。
しかし、QuickSight の管理画面で Athena への権限付与の際、フェデレーテッドクエリ用の Lambda を選択することができません。

ブログからダウンロードできる手順や Web 検索して出てきた情報では、Athena でデータソースを作成する際に Lambda 関数を作成する手順があるのですが、画面が大きく変わっており、同様の手順が実施できません。(Lambda 関数を作成する画面が出てこない)

それでも DynamoDB のデータソースは作成でき、以下のように DynamoDB への Lambda 関数が作成され、フェデレーテッドクエリは成功しました。

Amazon Athena DynamoDB コネクタ - Amazon Athena を見ると、DynamoDB コネクタの設定は二種類あるようです。

  • Glue connections (recommended)
  • Legacy connections

どうも検索して出てくる情報は、Legacy connections の設定を前提にしているようです。
以下の注記がありました。

2024 年 12 月 3 日以降に作成された Athena データソースコネクタは、AWS Glue 接続を使用します。

DynamoDB、S3 バケット、Lambda 関数、Athena、Glue、QuickSight はすべて東京リージョンで作成しています。QuickSight の有効化リージョンも東京リージョンです。

Lambda 関数 athenafederatedcatalog_athena_dynamodb には以下を設定しています。

  • 環境変数

    • key: glue_connection
    • value: athenafederatedcatalog_athena_dynamodb(Glue Connections の名前)
  • 実行ロール athenafederatedcatalog-athena-dynamodb-FunctionRole-5mWjCq7XXXXX

    • AWSLambdaBasicExecutionRole
    • FunctionExecutionPolicy
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": [
                    "dynamodb:DescribeTable",
                    "dynamodb:ListSchemas",
                    "dynamodb:ListTables",
                    "dynamodb:Query",
                    "dynamodb:Scan",
                    "dynamodb:PartiQLSelect",
                    "glue:GetTableVersions",
                    "glue:GetPartitions",
                    "glue:GetTables",
                    "glue:GetTableVersion",
                    "glue:GetDatabases",
                    "glue:GetTable",
                    "glue:GetPartition",
                    "glue:GetDatabase",
                    "athena:GetQueryExecution"
                ],
                "Resource": "*",
                "Effect": "Allow"
            },
            {
                "Action": [
                    "s3:GetObject",
                    "s3:ListBucket",
                    "s3:GetBucketLocation",
                    "s3:GetObjectVersion",
                    "s3:PutObject",
                    "s3:PutObjectAcl",
                    "s3:GetLifecycleConfiguration",
                    "s3:PutLifecycleConfiguration",
                    "s3:DeleteObject"
                ],
                "Resource": [
                    "arn:aws:s3:::federated-spill-123456789012-ap-northeast-1",
                    "arn:aws:s3:::federated-spill-123456789012-ap-northeast-1/*"
                ],
                "Effect": "Allow"
            },
            {
                "Action": [
                    "glue:GetConnection"
                ],
                "Resource": [
                    "arn:aws:glue:ap-northeast-1:123456789012:connection/athenafederatedcatalog_athena_dynamodb",
                    "arn:aws:glue:ap-northeast-1:123456789012:catalog"
                ],
                "Effect": "Allow"
            }
        ]
    }
    
  • リソースベースのポリシーステートメント

{
  "Version": "2012-10-17",
  "Id": "default",
  "Statement": [
    {
      "Sid": "AllowQuickSightInvoke",
      "Effect": "Allow",
      "Principal": {
        "Service": "quicksight.amazonaws.com"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:ap-northeast-1:123456789012:function:athenafederatedcatalog_athena_dynamodb",
      "Condition": {
        "StringEquals": {
          "AWS:SourceAccount": "123456789012"
        }
      }
    }
  ]
}

DynamoDB のフェデレーテッドクエリ用 Athena を選択してデータソース作成を進めると以下のようなエラーになりました。


sourceErrorMessage

[Simba][AthenaJDBC](100071) An error has been thrown from the AWS Athena client. Failed to invoke lambda function due to com.amazonaws.services.lambda.model.AWSLambdaException: User: arn:aws:sts::123456789012:assumed-role/aws-quicksight-service-role-v0/QuickSight-RoleSession-1743610945436 is not authorized to perform: lambda:InvokeFunction on resource: arn:aws:lambda:ap-northeast-1:123456789012:function:athenafederatedcatalog_athena_dynamodb because no identity-based policy allows the lambda:InvokeFunction action (Service: AWSLambda; Status Code: 403; Error Code: AccessDeniedException; Request ID: c83fbe4d-c2b9-4eec-8d82-12cdbb2081b3; Proxy: null) [Execution ID not available]

ワークアラウンド的ですが、QuickSight のロールをデフォルトの aws-quicksight-service-role-v0 ではなくユーザー独自作成のロールにして強めの権限を付与したところ、DynamoDB をフェデレーテッドクエリしている Athena をデータソースに QuickSight データセットを作成することができました。

一旦こちらで対応します。

1 Like

ご質問とソリューションは発見いただき、ありがとうございます。

ご確認いただいた通り、QuickSightのUIは、Glueコネクタで作成されたLambda functionを現在検出できません。今のところ、対処方法はお試したいただいた通り、QuickSight提供のサービスロールを使用するのではなく、該当のLambdaへの権限などを付与した独自のIAMロールを作成し、そのロールをご利用いただくことで対応可能かと思います。

当内容は、Feature Requestとして、タグ付けさせていただきます。