【AWS】RDSのスナップショットをS3にエクスポートしてAthenaで解析したら403 Access Denied でハマった

めちゃくちゃハマったのでメモ。

今回やったこと

  1. RDS(Aurora PostgreSQL)でスナップショットをS3にエクスポート
  2. Athena(Glue)で検索
  3. Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied)

RDSのエクスポートについては下記記事を参考にしました。
[新機能]RDSのスナップショットがS3にエクスポートできるようになりました。

RDSがあるのになぜ、わざわざS3にエクスポートしてAthenaで検索するのかというと、本番環境とは異なる環境で分析者がアクセスする環境を一時的に作る必要があったからです。RDS側にユーザーを作成したり、本番に負荷がかかるは避けたかったという意図がありました。普通はRDSにクエリ投げたほうが早いので、今回のようにスナップショットをさらにAthenaで検索するという用途は珍しいのかもしれません。

今回、Administrator権限を持っているユーザーでエクスポートしてAthenaで検索したところ問題なく動作したので分析者にそのまま渡したところ下記のようなエラーが出たと報告をもらいました。

Your query has the following error(s):

Error opening Hive split s3://xxxxxxxxxx-snapshot-ap-northeast-1-xxxxxxxxxx/exports/2020/03/09/xxxxxxxxxx.gz.parquet (offset=0, length=13744253): com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: xxxxxxxxxx; S3 Extended Request ID: xxxxxxxxxx+xxxxxxxxxx/xxxxxxxxxx=), S3 Extended Request ID: xxxxxxxxxx+xxxxxxxxxx/xxxxxxxxxx= (Path: s3://xxxxxxxxxx/exports/2020/03/09/xxxxxxxxxx.gz.parquet)

This query ran against the “xxxxxxxxxx” database, unless qualified by the query. Please post the error message on our forum or contact customer support with Query Id: xxxxxxxxxx.

403でAccessDeniedなので何かアクセス権限が足りないことはすぐに分かります。
しかもS3に対して403と言われているのでアクセス権限をアタッチすれば簡単に解決しそうな気がします。

しかし、試しに「AmazonS3FullAccess」権限をつけてもエラーが変わりません。
S3が403でAccessDeniedなのに「AmazonS3FullAccess」をつけても解決しない、謎です。

次に先頭の「Error opening Hive split」でググると下記のような記事を見つけました。
【AWS Athena】HIVE_CANNOT_OPEN_SPLITが発生する
曰く、

試行錯誤した結果、glue:GetTablesのポリシーが付与されていないと、このエラーが発生するようだ。

ということだったのですが、今回もともとロールに「AmazonAthenaFullAccess」権限が付与されていて、その中に「glue:GetTablesのポリシー」は入っていたので、違う原因のようでした。

S3とAthenaのフルアクセスつけても403エラーで、Administratorだと検索できる、その差分はなんなのか。エラーの内容をみるとS3へのAccess Denied、どう考えても権限周りなのに、考えられる権限つけても解消されない。

結果的には何が原因だったかというと、KMSのキーユーザーにAthenaを実行する該当ロール(IAMユーザー)を追加するという作業が必要でした。

これはスナップショットをS3にエクスポートするときに暗号化するKMSのキーを指定しなければいけないのですが、その暗号化されたS3を読むために、指定していたキーのユーザーとして登録していないと検索することができないというのがエラーの正体でした。

確かにS3へのアクセスが失敗してるんでしょうけど、KeyとかKMSとか一言でもエラー内容に表示してくれたら親切なのになーと思いました。

ググっても全く出てこなかったので誰かのためにメモとして残しました。