IP アドレス制限を設定した IAM リソースで Athena クエリ実行時、クエリ結果出力先 S3 バケットからアクセス拒否される場合の対処方法
困っている内容
Athena の利用を開始するために、新規のワークグループとクエリ出力先に設定する S3 バケットを作成しました。
Athena はコンソールから利用し、Athena を利用する IAM ユーザには以下内容のポリシーをアタッチしています。
- AWS 管理ポリシー AmazonAthenaFullAccess をコピーし、S3 バケット名のみ変更したもの
- 特定の IP アドレス(自身の PC のグローバル IP アドレス) からのアクセスのみを許可するポリシー
この状態で Athena からクエリを実行すると、下記のようなエラーメッセージが出力されます。
クエリ結果出力先 S3 バケットへの書き込みが拒否されている認識です。
Access denied when writing to location: s3://<クエリ結果出力先 S3 バケット名>/<クエリ ID>.txt
このクエリは、クエリで修飾されていない限り、「<データベース名>」データベースに対して実行されました。エラーメッセージを フォーラム に投稿するか、クエリ ID: <クエリ ID> とともに カスタマーサポート にお問い合わせください。
アクセス拒否を解消するために必要な設定等をご教授いただきたいです。
どう対処すればいいの?
IP アドレスを制限しているポリシーに、ソース IP アドレスが “athena.amazonaws.com” の場合は許可する条件の追加をご検討ください。
Athena が S3 にアクセスする際、AWS サービスプリンシパル(athena.amazonaws.com) 経由でのアクセスとなるため、ユーザの IP アドレスとは異なるソース IP アドレスからのリクエストになります。
そのため、使用した IAM リソース(IAM ユーザや IAM ロール) で IP アドレス制限を設定していると Access Denied エラーが発生します。
対処法の例としては、IP 制限の条件句に aws:CalledVia を追加し、特定の IP アドレスと Athena 以外が Deny となるように変更することが挙げられます。[1][2]
なお、変更後には想定された動作となっているかをテストしてください。
条件句(Condition) 追加例
"ForAllValues:StringNotEquals": {
  "aws:CalledVia": [
      "athena.amazonaws.com"
  ]
}











