0
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?

More than 1 year has passed since last update.

データ活用基盤を作ってみたその11(構築・データ活用-Athena)

Last updated at Posted at 2023-11-02

はじめに

こんにちは。NTTデータ先端技術の亀井(@kamein)です。
本記事はデータ活用基盤を作ってみた連載記事のその11(構築・データ活用-Athena)です。本シリーズの取り組みの内容についてはその1(構成シナリオ)をご覧ください。
今回のPJではデータ活用を蓄積領域(S3)のデータ閲覧としており、Athenaで実現します。本記事では、Athenaの設定手順や利用手順についてご紹介します。

目次

  • 今回のPJにおけるデータ活用の範囲
  • Athenaについて
  • 実装内容
    • ポリシー付与
    • AWS CLIインストール
    • ネットワーク穴あけ
  • 利用手順
  • 振り返り
  • 最後に

今回のPJにおけるデータ活用の範囲

今回のデータ活用におけるデータ活用はAI,BIのような使い方ではなく、データ連携の用途です。
蓄積領域(S3)に格納されたデータを既存システム側扱いのサーバ(EC2)からCliベースでデータを閲覧を目指しており、Athenaを使用します。
環境構成図の赤枠の範囲の機能実装ですが、既存システム側のEC2は作成済み環境を利用しており、今回のPJ範囲内の蓄積環境のS3とIAMロールはそれぞれの章で説明するため、本記事ではその他のAthena利用に向けて必要な設定や利用手順をご紹介します。

Athenaについて

Athenaについてご紹介いたします。AthenaはS3に保存されたデータ(CSV,JSON,Apache Parquet等)をSQL形式で簡単にクエリができるサーバーレスのサービスです。
また、S3からDBにデータを移したり、Redshiftのクラスター起動したり等の面倒な工程を踏まずに直接S3参照できるため、アドホック分析に向いています。
Athenaには様々な方法でアクセスでき、AWSコンソール、API、JDBC、AWS CLI等で利用できます。
ただし、Glue Data Catalogに保存されているメタデータ(表名や列名等)を使用してSQLを作文・実行するため、Athenaを利用する前にGlue Data Catalogに分析対象データの登録が必須となります。
Athenaの詳細情報につきましては、公式情報をご確認ください。

実装内容

今回のPJでは、「既存システムからCLIベースでアクセスできること」としていたため、次の手順で環境構築することを考えました。

  1. データ活用者ロール(※ 詳細はその7(構築・IAM)参照)を使用できるポリシーを作成し、既存システム側のEC2に付与する
  2. 既存システム上にAWS CLIをインストールしてaws athenaが利用可能な状態にする
  3. ネットワーク穴あけを行い疎通可能な状態にする
    ※ Glue Crawlerを使用してGlud Data Catalogにメタデータ自動登録実装済み

ポリシー作成

データ活用者ロールを使用できるポリシーを作成し、EC2にアタッチしているロールに含めました。

※ 作成したjsonポリシー例

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": "sts:AssumeRole",
			"Resource": "arn:aws:iam::<アカウントID>:role/biwa-prod-iam-role-analyst-001" 
		}
	]
}

AWS CLIインストール

通常は、公式ドキュメントGet started with the AWS CLIに沿ってインストールする必要があります。
しかし、今回は既存システム側の対象サーバ(EC2)で使用しているのマシンイメージはAmazon Linuxでした。Amazon LinuxではAWS関連サービスで利用できるツール類は予めインストールされているため、本手順はスキップとしました。
※ 簡単なAWS検証作業でEC2を利用する場合には、この辺のセットアップ作業を省略できるのでAmazonLinuxの利用をお勧めします。

ネットワーク穴あけ

今回は図に示すように3つのAWSサービスにアクセスするために各サービスに対応するVPCエンドポイントを構成しました。

image.png

  • STS用エンドポイント

    • aws stsコマンドを使用してデータ活用者ロールを使用できるようにするために穴あけ
    • VPCエンドポイント作成時にcom.amazonaws.ap-northeast-1.stsサービスを指定する
  • Athena用エンドポイント

    • aws athenaコマンドを使用してAtenaでクエリが投げられるようにするために穴あけ
    • VPCエンドポイント作成時にcom.amazonaws.ap-northeast-1.athenaサービス名を指定する
  • S3用エンドポイント

    • aws s3コマンドを使用してS3内の状況を確認できるようにするために穴あけ
    • VPCエンドポイント作成時にcom.amazonaws.ap-northeast-1.s3サービスを指定する

※ それぞれのVPCエンドポイントに適用するセキュリティグループはEC2からのインバウンド方向の通信許可設定を加えます。

※ 今回の要件で追加した内容のみ記載しております。作業端末からEC2までのアクセスにはAWS Session Manager(SSM)を使用しておりますが、この図上では省略しております。

利用手順

構築後は試験工程で動作確認しました。ここでは参考情報としてAtenaのクエリを投げるまでにどのように手順が必要かをご紹介します。

1.データ活用者ロールの使用

$ aws sts assume-role --role-arn arn:aws:iam::<アカウントID>:role/<データ活用者ロール名> --duration-seconds 900 --role-session-name ssm-user --profile default --endpoint-url https://sts.ap-northeast-1.amazonaws.com

## ※ secret_access_key/session_token/access_key_idの出力結果をコピーする

$ export AWS_ACCESS_KEY_ID = <access_key_idの出力結果を貼り付け>
$ export AWS_SECRET_ACCESS_KEY= <secret_access_keyの出力結果を貼り付け>
$ export AWS_SESSION_TOKEN= <session_tokenの出力結果を貼り付け>

$ aws sts get-caller-identity --endpoint-url https://sts.ap-northeast-1.amazonaws.com

2.S3でバケット見れること確認

aws s3 ls

3.athenaでクエリを投げる

sh-4.2$ aws athena start-query-execution \
> --query-string "SELECT * FROM biwa_prod_s3_bucket_datastorage_002 limit 10;" \
> --query-execution-context Database=biwa-prod-glue-catalogdatabase-analytics-001 \
> --result-configuration OutputLocation=s3://biwa-prod-s3-bucket-athena-001/athena-result/

## ※ QueryExecutionIdの出力結果をコピーする

sh-4.2$ aws athena get-query-results --query-execution-id <QueryExecutionIdの出力結果を貼り付け>

※ 「biwa_prod_s3_bucket_datastorage_002」と「biwa-prod-glue-catalogdatabase-analytics-001」は、その10でデータカタログに登録した情報を指定します

## 参考までにget-query-resultsの出力結果を表示します
{
    "UpdateCount": 0,
    "ResultSet": {
        "Rows": [
            {
                "Data": [
                    {
                        "VarCharValue": "jis_code"
                    },
                    {
                        "VarCharValue": "old_postal_code"
                    },
                    {
                        "VarCharValue": "postal_code"
                    },
                    {
                        "VarCharValue": "prefecture_kana"
                    },
                    {
                        "VarCharValue": "city_kana"
                    },
                    {
                        "VarCharValue": "town_kana"
                    },
                    {
                        "VarCharValue": "prefecture_kanji"
                    },
                    {
                        "VarCharValue": "city_kanji"
                    },
                    {
                        "VarCharValue": "town_kanji"
                    },
                    {
                        "VarCharValue": "multiple_towns_flag"
                    },
                    {
                        "VarCharValue": "has_subdivision_flag"
                    },
                    {
                        "VarCharValue": "has_district_flag"
                    },
                    {
                        "VarCharValue": "multiple_areas_flag"
                    },
                    {
                        "VarCharValue": "update_status"
                    },
                    {
                        "VarCharValue": "change_reason"
                    }
                ]
            },
            {
                "Data": [
                    {
                        "VarCharValue": "1101"
                    },
                    {
                        "VarCharValue": "60"
                    },
                    {
                        "VarCharValue": "600000"
                    },
                    {
                        "VarCharValue": "ホッカイドウ"
                    },
                    {
                        "VarCharValue": "サッポロシチュウオウク"
                    },
                    {
                        "VarCharValue": "イカニケイサイガナイバアイ"
                    },
                    {
                        "VarCharValue": "北海道"
                    },
                    {
                        "VarCharValue": "札幌市中央区"
                    ~(中略)~
                    }
                ]
            }
        ],
        "ResultSetMetadata": {
            "ColumnInfo": [
                {
                    "Scale": 0,
                    "Name": "jis_code",
                    "Nullable": "UNKNOWN",
                    "TableName": "",
                    "Precision": 19,
                    "Label": "change_reason",
                    "CaseSensitive": false,
                    "SchemaName": "",
                    "Type": "bigint",
                    "CatalogName": "hive"
                }
            ]
        }
    }
}

振り返り

無事にAthenaでクエリを実行・表示することができました!
RDBMS等のデータベースに入れ直すことなくAthenaを使えばオブジェクトストレージのS3に直接参照できて良いですね。Athenaを使用するまでの手間もCrawler設定、ネットワーク穴あけ、IAM権限設定ぐらいで簡単に利用できるので導入しやすいです。

最後に

S3データを簡単に閲覧できるのでAthenaはスモールスタートに適したサービスだと考えます。
よくあるBIツールのtableauやAIツールのdataiku等でもAthenaをデータソースとして利用できるため、本格的なデータ分析にも移行しやすいです。
機会がありましたら一度はAthenaに触れておくことをお勧めいたします。
次の記事は、データ活用基盤を作ってみたその12です。
最後までお読み頂きありがとうございました。

0
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
0
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?