継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

【Athena の躓きシリーズ】Athena 専用ユーザーを払い出してクエリを叩けるまでにハマったこと

タダです.

業務でいろんな部署の人に Athena の実行ユーザーを提供して分析業務を行ってもらっているのですが,そのために IAM ポリシーと Athena 側での設定でハマったことをまとめておきます.

IAM ポリシーでハマったこと

分析業務は AthenaとS3, KMS で暗号化しているのでそのあたりを気をつけて IAM ポリシーを検証しました.なお,デフォルトユーザーには ReadOnlyAccess が権限が振られており,データは Aurora からエクスポートしたデータなので KMS が暗号化されています.

sadayoshi-tada.hatenablog.com

ベースポリシーを AmazonAthenaFullAccess を参考に使って検証した時に,primary ワークグループへのアクセス権限が不足しているメッセージが出力されました.調べていくとドキュメントにあるように特定のワークグループを指定する必要がありました.また,Aurora でエクスポートしたデータの暗号化しているのを復号化しなきゃいけなかったので KMS の権限も足す必要がありました.

AmazonAthenaFullAccess の IAM ポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:*"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "glue:CreateDatabase",
                "glue:DeleteDatabase",
                "glue:GetDatabase",
                "glue:GetDatabases",
                "glue:UpdateDatabase",
                "glue:CreateTable",
                "glue:DeleteTable",
                "glue:BatchDeleteTable",
                "glue:UpdateTable",
                "glue:GetTable",
                "glue:GetTables",
                "glue:BatchCreatePartition",
                "glue:CreatePartition",
                "glue:DeletePartition",
                "glue:BatchDeletePartition",
                "glue:UpdatePartition",
                "glue:GetPartition",
                "glue:GetPartitions",
                "glue:BatchGetPartition"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload",
                "s3:CreateBucket",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::aws-athena-query-results-*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::athena-examples*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation",
                "s3:ListAllMyBuckets"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "sns:ListTopics",
                "sns:GetTopicAttributes"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricAlarm",
                "cloudwatch:DescribeAlarms",
                "cloudwatch:DeleteAlarms"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "lakeformation:GetDataAccess"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

ワークグループの指定と KMS の復号化に関する権限を足して,Athena 専用ユーザーのポリシーを次のように作り,クエリは叩けるようになりました.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "athena:List*",
        "athena:Get*"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "athena:StartQueryExecution",
        "athena:GetQueryResults",
        "athena:DeleteNamedQuery",
        "athena:GetNamedQuery",
        "athena:ListQueryExecutions",
        "athena:StopQueryExecution",
        "athena:GetQueryResultsStream",
        "athena:ListNamedQueries",
        "athena:CreateNamedQuery",
        "athena:GetQueryExecution",
        "athena:BatchGetNamedQuery",
        "athena:BatchGetQueryExecution",
        "athena:GetWorkGroup"
      ],
      "Resource": [
        "arn:aws:athena:ap-northeast-1:XXXXXXXXXXX:workgroup/primary" <= ワークグループの ARN
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetBucketLocation",
        "s3:GetObject",
        "s3:ListBucket",
        "s3:ListBucketMultipartUploads",
        "s3:ListMultipartUploadParts",
        "s3:AbortMultipartUpload",
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::XXXX",  <= Athena のクエリをログ格納場所
        "arn:aws:s3:::XXXX/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::XXXX/*" <= Athena のクエリをかける場所
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetBucketLocation",
        "s3:ListAllMyBuckets"
      ],
      "Resource": [
        "*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "kms:DescribeKey",
        "kms:GenerateDataKey",
        "kms:Decrypt"
      ],
      "Resource": [
        "arn:aws:kms:ap-northeast-1:XXXXXXXXXXX:key/XXXX" <= Aurora データエクスポート で使った KMSARN
      ]
    }
  ]
}

Athena の設定でハマったこと

IAM ポリシーが検証できたことで,Athena を叩けるぞと思って専用ユーザーを払い出して担当者にクエリを叩いてもらったら下記のエラーがでてきました.

Your query has the following error(s):
No output location provided. An output location is required either through the Workgroup result configuration setting or as an API input. (Service: AmazonAthena; Status Code: 400; Error Code: InvalidRequestException; Request ID: XXXX)

これは Athena をマネジメントコンソールで叩くために必要な設定としてクエリ結果の保存場所を指定できてなかったためのエラーでした.クエリの結果保存場所の指定は Athena コンソールを使用して、クライアント側の設定クエリ結果の場所を指定ワークグループを使用したクエリ結果の場所の指定 の2パターンが用意されているため,Athena の利用方法に合わせて設定をしていきます.利用するユーザーが少ないのであれば,コンソールから都度指定したり,多数のユーザーが特定のワークグループだけしか使わない場合はワークグループに設定してしまうのが良いのかと思います.

クエリを実行する前に、Amazon S3 でクエリ結果バケットの場所を指定するか、バケットが指定されており、設定がクライアント設定を上書きするワークグループを使用する必要があります。クエリ結果の場所が指定されていない場合、クエリはエラーで失敗します。

現在は、アカウントが以前に Athena を使用していないリージョンで Athena クエリを実行する前に、クエリ結果の場所を指定するか、クエリ結果の場所の設定を上書きするワークグループを使用する必要があります。Athena はデフォルトのクエリ結果の場所を作成しなくなりましたが、以前に作成したデフォルトの aws-athena-query-results-MyAcctID-MyRegion の場所は有効なままであり、引き続き使用できます。

docs.aws.amazon.com

まとめ

Athena でクエリを叩くまでにハマったことを2点まとめました.分析業務で Athena を利用するケースはあると思いますのでこの情報が何か参考になれば幸いです.