1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

S3 Tablesを利用するAWSアーキテクチャ構築:Athena

Last updated at Posted at 2025-01-31

はじめに

本記事は、以下記事の続きです。

今回は、S3テーブルにAthenaから接続し、SQLクエリを実行してデータが返ってくるまでを確認します。
以下AWS公式記事の手順を参考にしています。

構成図

最終的な構成図は以下です。
image.png

本記事では AthenaからS3 Tablesバケットをクエリする 部分を実装します。

実装手順

以下ステップで実装していきます。
ステップ2~5では、権限管理Lake Formationも出てきます。
本記事では 4. Athenaからクエリ実行 のステップを行っていきます。

  1. S3テーブルバケットを作成
  2. EMRからスキーマ作成
  3. Firehoseからデータ送信
  4. Athenaからクエリ実行
  5. QuickSightからデータセット接続

Athenaからクエリ実行手順

以下ステップで行います。

  1. Athena用IAMロール ポリシー設定
  2. Lake Formationから権限設定
  3. Athenaからクエリ実行

Athena用IAMロール ポリシー設定

まず、Athena用のカスタムポリシー123を作成します。
コンソール操作:
「IAMコンソール」 → 「ポリシー」 → 「ポリシーの作成」 → 「ポリシーエディタ: JSON」

以下JSONを貼り付け → 次へ → 任意のポリシー名設定 → ポリシーの作成
※特に "Sid": "DataCatalogPermissions"の"Resource"記述 部分にクセがあります・!

Athena用ポリシー
{
    "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"に追加します。

Athena用ロールに対するカスタム信頼ポリシー
{
  "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

image.png

以下の通り、Athena用ロールに、S3テーブルバケットの指定テーブルへのSuper(ALL)権限を付与します。
image.png

Athenaからクエリ実行

Athena用ロールへの権限設定ができたので、Athenaコンソールからクエリを実行します。

スイッチロール

ここで、先程作成したAthena用ロールにスイッチロールしてみます。

コンソールから操作:
右上のIAMユーザー名クリック → ロールの切り替え
image.png

Athena用ロール情報を入力して「ロールの切り替え」
image.png

SQLクエリ実行

コンソールから操作:
Athenaコンソール → クエリエディタ

以下SQLを貼り付けて、「実行する」

SELECT * FROM "s3tablescatalog/<S3テーブルバケット名>"."<S3テーブル名前空間>"."<S3テーブルバケット内のテーブル名>" limit 10;

クエリ結果

実行後しばらくすると以下出力を確認できました!
前回記事 でS3テーブルバケット内に格納したデータが出力

image.png

最後に

ここまでで、S3テーブルバケットにクエリ実行するところまで確認しました。
次回記事では、このS3テーブルバケットに、QuickSightで接続するまでの設定を確認します。

参考URL

この記事で参考にしたURLです。

  1. AWS記事:Amazon Athena の AWS 管理ポリシー
    https://docs.aws.amazon.com/ja_jp/athena/latest/ug/managed-policies.html

  2. AWS記事:Athena から Amazon S3 へのアクセスを制御する
    https://docs.aws.amazon.com/ja_jp/athena/latest/ug/s3-permissions.html

  3. AWS記事:AWS Glue Data Catalog のデータベースとテーブルへのアクセスを構成する
    https://docs.aws.amazon.com/ja_jp/athena/latest/ug/fine-grained-access-to-glue-resources.html

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?