はじめに
本記事は、以下記事の続きです。
今回は、S3テーブルにAthenaから接続し、SQLクエリを実行してデータが返ってくるまでを確認します。
以下AWS公式記事の手順を参考にしています。
構成図
本記事では AthenaからS3 Tablesバケットをクエリする 部分を実装します。
実装手順
以下ステップで実装していきます。
ステップ2~5では、権限管理Lake Formationも出てきます。
本記事では 4. Athenaからクエリ実行 のステップを行っていきます。
Athenaからクエリ実行手順
以下ステップで行います。
Athena用IAMロール ポリシー設定
まず、Athena用のカスタムポリシー123を作成します。
コンソール操作:
「IAMコンソール」 → 「ポリシー」 → 「ポリシーの作成」 → 「ポリシーエディタ: JSON」
以下JSONを貼り付け → 次へ → 任意のポリシー名設定 → ポリシーの作成
※特に "Sid": "DataCatalogPermissions"の"Resource"記述 部分にクセがあります・!
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DataCatalogPermissions",
"Effect": "Allow",
"Action": [
"glue:GetCatalog",
"glue:GetDatabase",
"glue:GetDatabases",
"glue:GetTables",
"glue:GetTable"
],
"Resource": [
"arn:aws:glue:ap-northeast-1:<アカウントID>:catalog",
"arn:aws:glue:ap-northeast-1:<アカウントID>:catalog/s3tablescatalog",
"arn:aws:glue:ap-northeast-1:<アカウントID>:catalog/s3tablescatalog/*",
"arn:aws:glue:ap-northeast-1:<アカウントID>:database/s3tablescatalog/<S3テーブルバケット名>/<S3テーブル名前空間>",
"arn:aws:glue:ap-northeast-1:<アカウントID>:table/s3tablescatalog/<S3テーブルバケット名>/<S3テーブル名前空間>/<S3テーブルバケット内のテーブル名>"
]
},
{
"Sid": "BaseAthenaPermissions",
"Effect": "Allow",
"Action": [
"athena:*"
],
"Resource": [
"*"
]
},
{
"Sid": "ListObjectsInBucket",
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::<クエリ結果保存用S3バケット>"
]
},
{
"Sid": "BaseS3BucketPermissions",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:ListAllMyBuckets"
],
"Resource": [
"*"
]
},
{
"Sid": "BaseQueryResultsPermissions",
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:GetObject",
"s3:ListBucket",
"s3:ListBucketMultipartUploads",
"s3:ListMultipartUploadParts",
"s3:AbortMultipartUpload",
"s3:CreateBucket",
"s3:PutObject",
"s3:PutBucketPublicAccessBlock"
],
"Resource": [
"arn:aws:s3:::<クエリ結果保存用S3バケット>*"
]
}
]
}
次に、Athena用のサービスロールを作成します。
コンソール操作:
「IAMコンソール」 → 「ロール」 → 「ロールを作成」
今回、「カスタム信頼ポリシー」 → 以下JSONを貼り付けて「次へ」
※Athenaコンソールからクエリ実行する自身のIAMユーザーを"Principal"に追加します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<アカウントID>:user/<ユーザー名>"
},
"Action": "sts:AssumeRole"
}
]
}
「許可ポリシー」に、先ほど作成したAthena用ポリシーを選択して「次へ」
任意のロール名を設定 → 「ロールを作成」
Lake Formationから権限設定
Athena は、S3テーブル名前空間 経由で接続します。
Lake Formationから、Athena用ロールに権限を付与します。
※S3テーブルバケット内テーブルへのSuper(ALL)権限を付与します。
コンソールから操作:
Lake Formationコンソール → Databasesタブ
以下の通り、
Choose catalogで、「<アカウントID>:s3tablescatalog/」を選択し、
アクセス先となる「S3テーブル名前空間」を選択します。
この状態で、Actions → Grant
以下の通り、Athena用ロールに、S3テーブルバケットの指定テーブルへのSuper(ALL)権限を付与します。
Athenaからクエリ実行
Athena用ロールへの権限設定ができたので、Athenaコンソールからクエリを実行します。
スイッチロール
ここで、先程作成したAthena用ロールにスイッチロールしてみます。
コンソールから操作:
右上のIAMユーザー名クリック → ロールの切り替え
SQLクエリ実行
コンソールから操作:
Athenaコンソール → クエリエディタ
以下SQLを貼り付けて、「実行する」
SELECT * FROM "s3tablescatalog/<S3テーブルバケット名>"."<S3テーブル名前空間>"."<S3テーブルバケット内のテーブル名>" limit 10;
クエリ結果
実行後しばらくすると以下出力を確認できました!
※前回記事 でS3テーブルバケット内に格納したデータが出力
最後に
ここまでで、S3テーブルバケットにクエリ実行するところまで確認しました。
次回記事では、このS3テーブルバケットに、QuickSightで接続するまでの設定を確認します。
参考URL
この記事で参考にしたURLです。
-
AWS記事:Amazon Athena の AWS 管理ポリシー
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/managed-policies.html ↩ -
AWS記事:Athena から Amazon S3 へのアクセスを制御する
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/s3-permissions.html ↩ -
AWS記事:AWS Glue Data Catalog のデータベースとテーブルへのアクセスを構成する
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/fine-grained-access-to-glue-resources.html ↩