はじめに
前回までの記事で、自宅 HDFS 上の Apache Iceberg を Source of Truth として残し、AWS 側に S3 + Glue Data Catalog + Athena の分析用コピーを作りました。
- 自宅HDFS上のApache IcebergをAWS S3へ複製してAthenaで分析する構成を考える【設計編】
- 自宅HDFS上のApache IcebergをAmazon S3へ複製しAthenaから分析してみる【構築編】
- AWS S3上のApache IcebergをAthena向けに運用する【運用編】
今回は発展編です。
Athena で SQL 分析できるようになったログを、AWS 上の可視化サービスから利用します。
Amazon S3
↓
AWS Glue Data Catalog
↓
Amazon Athena
│
└─ Amazon QuickSight / Amazon Quick
└─ BI・集計・ダッシュボード
前提
以下の環境は構築済みとします。
自宅ログ基盤
↓
Apache Iceberg
↓
Amazon S3
↓
AWS Glue Data Catalog
↓
Amazon Athena
AWS 側には、次の Iceberg テーブルが作成済みである前提です。
glue_prod.${GLUE_DATABASE}.syslog_iceberg
glue_prod.${GLUE_DATABASE}.authlog_iceberg
Athena からは、次のように参照できる状態です。
SELECT count(*) FROM logs.syslog_iceberg;
SELECT count(*) FROM logs.authlog_iceberg;
既存記事では主なカラム例として以下を使っています。
host
ts
severity
program
msg
dt
hr
ただし、実環境では syslog_iceberg と authlog_iceberg の schema が完全に同じであるとは決め打ちしません。可視化前に Athena で確認します。
DESCRIBE logs.syslog_iceberg;
DESCRIBE logs.authlog_iceberg;
Athenaだけではなく可視化してみる
Athena では、以下のような SQL を実行できます。
SELECT
host,
count(*) AS log_count
FROM logs.syslog_iceberg
GROUP BY host
ORDER BY log_count DESC;
SQL で都度確認するだけでも分析はできます。
ただし、ログ基盤として継続的に見る場合は、毎回 Athena コンソールで SQL を実行するより、ダッシュボード化した方が便利です。
例えば以下を見たいです。
- ホスト別ログ件数
- program 別ログ件数
- 日別ログ件数
- 時間別ログ件数
- syslog / authlog の推移
今回は QuickSight / Amazon Quick を使います。
Athena
└─ QuickSight / Quick
構成
今回追加する可視化構成です。
Athena までは既存記事で構築済みなので、本記事では以下から始めます。
Athena で SQL 分析できるデータ
↓
AWS の可視化サービスから利用する
変数
構築編で作成した /etc/iceberg/aws.env を読み込みます。
Athena View の作成や疎通確認は、同期用 profile home-aws で実施します。
再ログイン後や新しい terminal では環境変数が未反映の状態から始まるため、spark ユーザーで AWS CLI / Athena の確認操作を行う前に毎回この初期化を実行します。
実行ユーザー: spark
source /etc/profile.d/iceberg-s3-athena.sh
use_iceberg_aws_sync
AWS_PROFILE=home-aws、AWS_SHARED_CREDENTIALS_FILE=/var/lib/spark/.aws/credentials になっていることを確認してから、後続の Athena View 作成や疎通確認を行います。
この記事で以降に spark ユーザーから実行する AWS CLI / Athena 操作は、この初期化が済んでいる shell で実行する前提です。
例では GLUE_DATABASE=logs、Athena workgroup は構築編で作成した home-log-iceberg を使います。
QuickSight / Quick の有効化、service role 作成、resource permissions 設定などは管理系操作です。
そのため、必要に応じて AWS_ADMIN_PROFILE=home-aws-admin または AWS Console の管理者ユーザーで実施します。
可視化サービスが Athena / S3 / Glue を参照するときは、home-iceberg-sync の access key を使い回すのではなく、QuickSight / Quick 側の service role / resource permissions に権限を付与します。
通常ユーザーで QuickSight / Quick / IAM / S3 permissions などの管理系操作を行う場合も、再ログイン後や新しい terminal では環境変数が未反映の状態から始まる前提にします。
そのため、通常ユーザーで管理系操作を行う直前には、同じログインセッション内で次を実行します。
実行ユーザー: 通常ユーザー
source /etc/profile.d/iceberg-s3-athena.sh
use_iceberg_aws_admin
AWS_PROFILE=home-aws-admin、AWS_SHARED_CREDENTIALS_FILE=<通常ユーザーのHOME>/.aws/credentials になっていることを確認してから、管理系コマンドを実行します。
使い分けは以下です。
| 作業 | 実行する関数 | 参照する credential |
|---|---|---|
| Athena View 作成、Athena 疎通確認 | use_iceberg_aws_sync |
/var/lib/spark/.aws/credentials |
| QuickSight / Quick、IAM、S3 permissions、後始末などの管理系操作 | use_iceberg_aws_admin |
通常ユーザーの ~/.aws/credentials
|
| QuickSight / Quick からの実行 | CLI profile は使わない | QuickSight / Quick の service role / resource permissions |
現在どの profile と credentials/config を参照しているか確認します。
echo "AWS_PROFILE=${AWS_PROFILE}"
echo "AWS_SHARED_CREDENTIALS_FILE=${AWS_SHARED_CREDENTIALS_FILE}"
echo "AWS_CONFIG_FILE=${AWS_CONFIG_FILE}"
Athena Viewを共通レイヤーとして利用する
QuickSight / Quick から直接 Iceberg テーブルを参照してもよいですが、可視化用途では Athena View を挟むと扱いやすくなります。
Iceberg
↓
Athena Table
↓
Athena View
↓
└─ QuickSight / Quick
View を使う理由です。
- 元の Iceberg テーブルを変更しなくてよい
- 可視化側の SQL を簡略化できる
- Dashboard ごとの集計定義を View 側へ寄せられる
- Dashboard ごとの集計ロジック差異を減らせる
今回は以下の View を作ります。
logs.v_syslog_hourly
logs.v_syslog_daily
logs.v_authlog_hourly
logs.v_authlog_daily
Athena で実行します。
CREATE OR REPLACE VIEW logs.v_syslog_hourly AS
SELECT
date_trunc('hour', ts) AS time,
dt,
hr,
host,
program,
count(*) AS log_count
FROM logs.syslog_iceberg
GROUP BY
date_trunc('hour', ts),
dt,
hr,
host,
program;
CREATE OR REPLACE VIEW logs.v_syslog_daily AS
SELECT
dt,
host,
program,
count(*) AS log_count
FROM logs.syslog_iceberg
GROUP BY
dt,
host,
program;
authlog_iceberg も同じ考え方で作ります。
CREATE OR REPLACE VIEW logs.v_authlog_hourly AS
SELECT
date_trunc('hour', ts) AS time,
dt,
hr,
host,
program,
count(*) AS log_count
FROM logs.authlog_iceberg
GROUP BY
date_trunc('hour', ts),
dt,
hr,
host,
program;
CREATE OR REPLACE VIEW logs.v_authlog_daily AS
SELECT
dt,
host,
program,
count(*) AS log_count
FROM logs.authlog_iceberg
GROUP BY
dt,
host,
program;
作成後に確認します。
SELECT
time,
dt,
hr,
host,
program,
log_count
FROM logs.v_syslog_hourly
ORDER BY time DESC
LIMIT 10;
SELECT
time,
dt,
hr,
host,
program,
log_count
FROM logs.v_authlog_hourly
ORDER BY time DESC
LIMIT 10;
QuickSight / Amazon Quick
まずは Amazon QuickSight / Amazon Quick から Athena を参照します。
AWS 公式ドキュメント上では、現在 Amazon Quick や Amazon Quick Sight の表記が使われているページがあります。コンソール上の表示名は変更される可能性があるため、本記事では QuickSight / Quick と表記します。
QuickSight / Quick は、BI・集計・レポート寄りの可視化に向いています。
今回の用途では、以下のようなグラフを作ります。
- ホスト別ログ件数
- program 別ログ件数
- 日別ログ件数
- authlog 日別ログ件数
QuickSight / QuickからAthenaへ接続する
大まかな流れです。
QuickSight / Quick を有効化
↓
AWS resource permissions で Athena / S3 を許可
↓
Dataset を作成
↓
Athena をデータソースとして選択
↓
Athena Workgroup を指定
↓
接続確認
↓
Glue Data Catalog の database / table / view を選択
AWS Console の画面名は更新されることがあるため、実際の画面では近い名称を選びます。
QuickSight / Quickを有効化する
AWS Console から QuickSight / Quick を開きます。
初回利用の場合は、アカウントを有効化します。
利用リージョンは、Athena / Glue / S3 を配置したリージョンに合わせます。
AWS Console
↓
Amazon QuickSight / Amazon Quick
↓
Sign up / Enable
↓
Region: <AWS_REGION>
AWS resource permissionsを設定する
Athena へ接続する前に、QuickSight / Quick 側が Athena と S3 を参照できるようにします。
公式ドキュメントでは、管理画面から AWS resource permissions を設定し、Athena と対象 S3 bucket を許可する流れが案内されています。
QuickSight / Quick
↓
Manage QuickSight / Manage Quick
↓
Security & permissions
↓
AWS resources
↓
Add or remove
↓
Amazon Athena を有効化
↓
対象 S3 bucket を選択
ここで重要なのは、Athena そのものだけでは足りないことです。
Athena は S3 上の Iceberg データと query result 用 S3 bucket を使います。そのため QuickSight / Quick から Athena を利用する場合も、以下へのアクセスが必要です。
- Athena
- Glue Data Catalog
- Iceberg データを置いた S3 bucket
- Athena query result 用 S3 bucket
- 暗号化している場合は KMS key
特に以下を忘れると、Athena 接続時や Dataset 作成時に権限エラーになります。
Athena が参照する S3 bucket へのアクセス権限
Athena query result を保存する S3 bucket へのアクセス権限
QuickSight / Quick用IAMの考え方
QuickSight / Quick は、サービス用 IAM Role を使って AWS リソースへアクセスします。
公式ドキュメントでは、Athena / S3 / query result location / KMS の権限を確認するよう案内されています。
最小権限で考える場合は、対象を以下に絞ります。
- 対象 region
- 対象 Athena workgroup
- 対象 Glue database
- 対象 Glue table / view
- 対象 S3 bucket
- 対象 Athena result bucket
IAM Policy のイメージです。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AthenaQuery",
"Effect": "Allow",
"Action": [
"athena:StartQueryExecution",
"athena:GetQueryExecution",
"athena:GetQueryResults",
"athena:GetWorkGroup",
"athena:ListWorkGroups"
],
"Resource": [
"arn:aws:athena:<AWS_REGION>:<AWS_ACCOUNT_ID>:workgroup/<ATHENA_WORKGROUP>"
]
},
{
"Sid": "GlueCatalogRead",
"Effect": "Allow",
"Action": [
"glue:GetDatabase",
"glue:GetDatabases",
"glue:GetTable",
"glue:GetTables",
"glue:GetPartition",
"glue:GetPartitions"
],
"Resource": [
"arn:aws:glue:<AWS_REGION>:<AWS_ACCOUNT_ID>:catalog",
"arn:aws:glue:<AWS_REGION>:<AWS_ACCOUNT_ID>:database/<GLUE_DATABASE>",
"arn:aws:glue:<AWS_REGION>:<AWS_ACCOUNT_ID>:table/<GLUE_DATABASE>/*"
]
},
{
"Sid": "ReadIcebergDataBucket",
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::<ICEBERG_BUCKET>"
]
},
{
"Sid": "ReadIcebergDataObjects",
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::<ICEBERG_BUCKET>/warehouse/<GLUE_DATABASE>/*"
]
},
{
"Sid": "AthenaResultBucketAccess",
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::<ATHENA_RESULT_BUCKET>",
"arn:aws:s3:::<ATHENA_RESULT_BUCKET>/*"
]
}
]
}
実際の QuickSight / Quick サービス role 名はアカウント状態により異なる場合があります。IAM Console で QuickSight / Quick が使っている role を確認してから、必要に応じて policy を追加します。
Datasetを作成する
QuickSight / Quick の画面から Dataset を作成します。
QuickSight / Quick
↓
Data / Datasets
↓
Create / New dataset
↓
Athena
新規 Athena data source を作成する場合は、以下を指定します。
Data source name: home-log-athena
Athena workgroup: <ATHENA_WORKGROUP>
接続確認を実行します。
Validate connection
成功したら、Athena 側の catalog / database / table を選びます。
Catalog: AwsDataCatalog
Database: ${GLUE_DATABASE}
Table: v_syslog_daily
または、table を直接選びます。
Catalog: AwsDataCatalog
Database: ${GLUE_DATABASE}
Table: syslog_iceberg
今回は可視化用途の View を優先します。
logs.v_syslog_daily
logs.v_syslog_hourly
logs.v_authlog_daily
logs.v_authlog_hourly
Dataset の取り込み方式は、用途により選びます。
| 方式 | 特徴 |
|---|---|
| SPICE | QuickSight / Quick 側に取り込む。表示が速い。更新タイミングを設計する |
| Direct Query | Athena に都度 query する。データ鮮度は高いが Athena query が増える |
ログ件数の日次集計などは、まず SPICE で試すと扱いやすいです。
QuickSight / Quickでグラフを作成する
Dataset 作成後、Analysis を作成します。
Dataset
↓
Visualize
↓
Analysis
ホスト別ログ件数
Dataset:
logs.v_syslog_daily
設定例です。
Visual type: Bar chart
X axis: host
Value: log_count
直近7日だけに絞る場合は、Dataset 側または Visual 側で dt を filter します。
Athena SQL で確認する場合は以下です。
SELECT
host,
sum(log_count) AS log_count
FROM logs.v_syslog_daily
WHERE dt >= current_date - INTERVAL '7' DAY
GROUP BY host
ORDER BY log_count DESC;
program別ログ件数
Dataset:
logs.v_syslog_daily
設定例です。
Visual type: Bar chart
X axis: program
Value: log_count
Athena SQL で確認する場合は以下です。
SELECT
program,
sum(log_count) AS log_count
FROM logs.v_syslog_daily
WHERE dt >= current_date - INTERVAL '7' DAY
GROUP BY program
ORDER BY log_count DESC
LIMIT 20;
日別ログ件数
Dataset:
logs.v_syslog_daily
設定例です。
Visual type: Line chart
X axis: dt
Value: log_count
Athena SQL で確認する場合は以下です。
SELECT
dt,
sum(log_count) AS log_count
FROM logs.v_syslog_daily
GROUP BY dt
ORDER BY dt;
authlog日別ログ件数
syslog だけでなく、authlog も可視化します。
Dataset:
logs.v_authlog_daily
設定例です。
Visual type: Line chart
X axis: dt
Value: log_count
Color: host
Athena SQL で確認する場合は以下です。
SELECT
dt,
host,
sum(log_count) AS log_count
FROM logs.v_authlog_daily
GROUP BY
dt,
host
ORDER BY
dt,
host;
Dashboard完成イメージ
最終的には、以下のような Dashboard を想定します。
QuickSight / Quickに一本化する
AWS 側の可視化は QuickSight / Quick に一本化します。Athena 上のログを BI データとして扱い、日次 / 週次の集計レポート、ホスト別・program 別の傾向分析、SPICE に取り込んだ高速な表示を中心に使います。
自宅側で使っている Grafana は引き続き Trino 経由のダッシュボードとして残しますが、AWS 側の可視化は QuickSight / Quick に寄せます。AWS 側の管理対象を S3 / Glue / Athena / QuickSight / IAM に絞ることで、認証、権限、削除手順をシンプルにします。
Athenaコストに注意する
可視化すると、Athena query が繰り返し実行されます。
Dashboard更新
↓
Athena Query
↓
S3 Scan
↓
Athena料金
Athena は query ごとのスキャン量がコストに効きます。具体的な単価は変わる可能性があるため、記事執筆時点の AWS 公式料金ページで確認します。
コストを抑えるために、以下を意識します。
-
dtで絞り込む - Iceberg partition を活用する
- Parquet の列指向を活かし、必要な列だけ SELECT する
-
SELECT *を Dashboard 用 query に使わない - QuickSight / Quick の dataset 更新頻度を短くしすぎない
- Athena View で集計定義を共通化する
- 必要に応じて日次 / 時間別の事前集計を作る
特に Direct Query や dataset の自動更新は注意します。
例えば、Direct Query の Dashboard を短い間隔で更新すると、Visual 数に応じて Athena query が継続的に実行されます。
Visual 4個
Refresh 30分
1日表示
4 visuals × 48 refresh = 192 queries
ログ監視用途であっても、Athena はリアルタイム監視専用の query engine ではありません。
今回のような Iceberg + Athena 構成では、以下のような間隔から始めるのが安全です。
開発・確認時: 手動 refresh
日次傾向: 1時間以上
短期調査: 必要な時だけ短い refresh
秒単位の監視が必要な場合は、CloudWatch Metrics、Amazon Managed Service for Prometheus、OpenSearch Service、または既存のリアルタイム系基盤と使い分けます。
OpenSearch Serviceを使う場合
補足です。
ログ検索や全文検索を重視する場合は、Amazon OpenSearch Service も候補になります。
Iceberg / Athena:
SQL分析・履歴分析
OpenSearch Service:
キーワード検索・全文検索・調査
ただし、本記事では構築対象に含めません。
今回の中心は、Athena で SQL 分析できるログを QuickSight / Quick から可視化することです。
トラブルシュート
The config profile could not be found
以下のようなエラーが出る場合は、現在参照している AWS CLI の config / credentials に、指定した profile が存在しません。
The config profile (home-aws-admin) could not be found
まず、現在の profile と参照先ファイルを確認します。
echo "AWS_PROFILE=${AWS_PROFILE}"
echo "AWS_SHARED_CREDENTIALS_FILE=${AWS_SHARED_CREDENTIALS_FILE}"
echo "AWS_CONFIG_FILE=${AWS_CONFIG_FILE}"
aws configure list-profiles
Athena View の作成確認など通常の確認作業では、同期用 profile を使います。
source /etc/profile.d/iceberg-s3-athena.sh
use_iceberg_aws_sync
QuickSight / Quick、IAM、S3 permissions、後片付けなどの管理系作業では、初期構築用 profile を使います。
source /etc/profile.d/iceberg-s3-athena.sh
use_iceberg_aws_admin
use_iceberg_aws_sync は spark ユーザーの /var/lib/spark/.aws/ を参照し、use_iceberg_aws_admin は通常ユーザーの ~/.aws/ を参照します。
AWS環境を削除する
検証が終わったら、AWS 側に作成した環境を削除します。
ここでは、自宅側の HDFS / Iceberg は残し、AWS 側の分析・可視化環境を削除します。
削除対象です。
QuickSight / Quick
Dashboard
Analysis
Dataset
Athena data source
Athena
可視化用 View
検証用 workgroup
query result
Glue Data Catalog
logs.syslog_iceberg
logs.authlog_iceberg
logs database
Amazon S3
Iceberg warehouse bucket
Athena query result bucket
IAM
検証用 policy
検証用 access key
検証用 user / role
誤削除を防ぐため、検証専用に作成した bucket、database、workgroup、role、user だけを対象にします。既存環境や他用途で共有しているリソースは削除しません。
変数を確認する
削除作業は管理系操作のため、初期構築用 profile を有効にします。
source /etc/profile.d/iceberg-s3-athena.sh
use_iceberg_aws_admin
現在の AWS アカウントを確認します。
echo "AWS_PROFILE=${AWS_PROFILE}"
echo "AWS_SHARED_CREDENTIALS_FILE=${AWS_SHARED_CREDENTIALS_FILE}"
echo "AWS_CONFIG_FILE=${AWS_CONFIG_FILE}"
aws sts get-caller-identity \
--profile "${AWS_ADMIN_PROFILE}"
S3 bucket 名を確認します。
echo "${ICEBERG_BUCKET}"
echo "${ATHENA_RESULT_BUCKET}"
QuickSight / Quickを削除する
QuickSight / Quick で作成した Dashboard、Analysis、Dataset、Athena data source を削除します。
依存関係があるため、利用側から順に削除します。
Dashboard
↓
Analysis
↓
Dataset
↓
Athena data source
AWS Console で実施します。
QuickSight / Quick
↓
Dashboards
↓
対象 Dashboard を選択
↓
Delete
QuickSight / Quick
↓
Analyses
↓
対象 Analysis を選択
↓
Delete
QuickSight / Quick
↓
Datasets
↓
logs.v_syslog_daily などの Dataset を選択
↓
Delete
QuickSight / Quick
↓
Datasets
↓
Data sources
↓
home-log-athena
↓
Delete
QuickSight / Quick アカウント自体を検証用に新規作成し、他用途で使っていない場合だけ、アカウント終了を検討します。既存の QuickSight / Quick アカウントを共有している場合は、アカウント自体は削除しません。
Athena Viewを削除する
可視化用に作成した Athena View を削除します。
Athena で実行します。
DROP VIEW IF EXISTS logs.v_syslog_hourly;
DROP VIEW IF EXISTS logs.v_syslog_daily;
DROP VIEW IF EXISTS logs.v_authlog_hourly;
DROP VIEW IF EXISTS logs.v_authlog_daily;
削除後に確認します。
SHOW VIEWS IN logs;
Glue tableとdatabaseを削除する
Glue table を削除します。
aws glue delete-table \
--region "${AWS_REGION}" \
--database-name "${GLUE_DATABASE}" \
--name syslog_iceberg \
--profile "${AWS_ADMIN_PROFILE}"
aws glue delete-table \
--region "${AWS_REGION}" \
--database-name "${GLUE_DATABASE}" \
--name authlog_iceberg \
--profile "${AWS_ADMIN_PROFILE}"
Glue database を削除します。
aws glue delete-database \
--region "${AWS_REGION}" \
--name "${GLUE_DATABASE}" \
--profile "${AWS_ADMIN_PROFILE}"
削除確認します。
aws glue get-database \
--region "${AWS_REGION}" \
--name "${GLUE_DATABASE}" \
--profile "${AWS_ADMIN_PROFILE}"
削除済みの場合、database が見つからない旨のエラーになります。
Athena query resultを削除する
Athena query result を削除します。
aws s3 rm \
s3://${ATHENA_RESULT_BUCKET}/ \
--recursive \
--profile "${AWS_ADMIN_PROFILE}"
削除後に確認します。
aws s3 ls \
s3://${ATHENA_RESULT_BUCKET}/ \
--recursive \
--summarize \
--profile "${AWS_ADMIN_PROFILE}"
S3 Iceberg dataを削除する
AWS 側 Iceberg warehouse を削除します。
aws s3 rm \
s3://${ICEBERG_BUCKET}/warehouse/${GLUE_DATABASE}/syslog_iceberg/ \
--recursive \
--profile "${AWS_ADMIN_PROFILE}"
aws s3 rm \
s3://${ICEBERG_BUCKET}/warehouse/${GLUE_DATABASE}/authlog_iceberg/ \
--recursive \
--profile "${AWS_ADMIN_PROFILE}"
warehouse 全体を検証用に作成している場合は、bucket 内を空にします。
aws s3 rm \
s3://${ICEBERG_BUCKET}/ \
--recursive \
--profile "${AWS_ADMIN_PROFILE}"
bucket を削除します。
aws s3 rb s3://${ICEBERG_BUCKET} \
--force \
--profile "${AWS_ADMIN_PROFILE}"
aws s3 rb s3://${ATHENA_RESULT_BUCKET} \
--force \
--profile "${AWS_ADMIN_PROFILE}"
S3 Versioning を有効化している場合、aws s3 rb --force だけでは過去 version や delete marker が残ることがあります。その場合は S3 Console の Empty bucket、または lifecycle rule で noncurrent version / delete marker を削除してから bucket を削除します。
削除確認します。
aws s3api head-bucket \
--bucket "${ICEBERG_BUCKET}" \
--profile "${AWS_ADMIN_PROFILE}"
aws s3api head-bucket \
--bucket "${ATHENA_RESULT_BUCKET}" \
--profile "${AWS_ADMIN_PROFILE}"
削除済みの場合、bucket が見つからない、またはアクセスできない旨のエラーになります。
Athena workgroupを削除する
検証用に Athena workgroup を新規作成した場合だけ削除します。
primary など既存 workgroup を使った場合は削除しません。
aws athena delete-work-group \
--work-group "${ATHENA_WORKGROUP}" \
--recursive-delete-option \
--region "${AWS_REGION}" \
--profile "${AWS_ADMIN_PROFILE}"
削除確認します。
aws athena get-work-group \
--work-group "${ATHENA_WORKGROUP}" \
--region "${AWS_REGION}" \
--profile "${AWS_ADMIN_PROFILE}"
削除済みの場合、workgroup が見つからない旨のエラーになります。
IAM Access Key / Policy / Userを削除する
検証用 IAM User を作成した場合は、Access Key、policy、user の順に削除します。
Access Key を確認します。
aws iam list-access-keys \
--user-name "${IAM_USER_NAME}" \
--profile "${AWS_ADMIN_PROFILE}"
Access Key を削除します。
aws iam delete-access-key \
--user-name "${IAM_USER_NAME}" \
--access-key-id "<ACCESS_KEY_ID>" \
--profile "${AWS_ADMIN_PROFILE}"
付与済み managed policy を確認します。
aws iam list-attached-user-policies \
--user-name "${IAM_USER_NAME}" \
--profile "${AWS_ADMIN_PROFILE}"
検証用 policy を detach します。
aws iam detach-user-policy \
--user-name "${IAM_USER_NAME}" \
--policy-arn "<POLICY_ARN>" \
--profile "${AWS_ADMIN_PROFILE}"
inline policy を付けた場合は確認します。
aws iam list-user-policies \
--user-name "${IAM_USER_NAME}" \
--profile "${AWS_ADMIN_PROFILE}"
inline policy を削除します。
aws iam delete-user-policy \
--user-name "${IAM_USER_NAME}" \
--policy-name "<POLICY_NAME>" \
--profile "${AWS_ADMIN_PROFILE}"
自作 managed policy を作成していて、他で使っていない場合は削除します。
aws iam delete-policy \
--policy-arn "<POLICY_ARN>" \
--profile "${AWS_ADMIN_PROFILE}"
検証用 IAM User を削除します。
aws iam delete-user \
--user-name "${IAM_USER_NAME}" \
--profile "${AWS_ADMIN_PROFILE}"
削除確認します。
aws iam get-user \
--user-name "${IAM_USER_NAME}" \
--profile "${AWS_ADMIN_PROFILE}"
削除済みの場合、user が見つからない旨のエラーになります。
QuickSight / Quick 用に検証専用 role / policy を追加した場合も、同じ考え方で detach してから削除します。AWS managed policy やサービスが自動作成した role を共有利用している場合は削除しません。
削除後の最終確認
最後に、AWS 側リソースが残っていないことを確認します。
Glue database:
aws glue get-database \
--region "${AWS_REGION}" \
--name "${GLUE_DATABASE}" \
--profile "${AWS_ADMIN_PROFILE}"
S3 bucket:
aws s3api head-bucket \
--bucket "${ICEBERG_BUCKET}" \
--profile "${AWS_ADMIN_PROFILE}"
aws s3api head-bucket \
--bucket "${ATHENA_RESULT_BUCKET}" \
--profile "${AWS_ADMIN_PROFILE}"
Athena workgroup:
aws athena get-work-group \
--work-group "${ATHENA_WORKGROUP}" \
--region "${AWS_REGION}" \
--profile "${AWS_ADMIN_PROFILE}"
IAM user(同期ユーザー):
aws iam get-user \
--user-name "${IAM_USER_NAME}" \
--profile "${AWS_ADMIN_PROFILE}"
削除済みのリソースは、存在しない旨のエラーになります。
これで、AWS 側に作成した S3 / Glue / Athena / QuickSight / IAM の検証環境を削除できます。
最終構成
今回の最終形です。
設計編、構築編、運用編と図の粒度を合わせるため、本記事でも AWS アイコンを使った構成図ではなく Mermaid 図で整理します。
役割分担は以下です。
自宅:
データ収集・保管
Source of Truth
AWS:
分析用コピー
SQL分析
BI
Dashboard
AWS へログ収集システム全体を移行したわけではありません。
既存の自宅 Iceberg 基盤を残したまま、AWS をクラウド分析・可視化環境として追加しています。
まとめ
今回は、既存の AWS 側分析基盤に可視化レイヤーを追加しました。
Iceberg
↓
S3
↓
Glue
↓
Athena
ここまで作成していた分析基盤へ、以下を追加しました。
└─ QuickSight / Quick
QuickSight / Quick では、Athena 上のログを BI データとして扱えます。
また、直接 Iceberg table を参照するのではなく、Athena View を共通レイヤーとして挟むことで、可視化側の SQL を単純化できます。
Iceberg
↓
Athena Table
↓
Athena View
↓
└─ QuickSight / Quick
これで、自宅 Iceberg を Source of Truth として残しながら、AWS 側で SQL 分析・BI・Dashboard まで広げられるようになります。
AWS 側 Iceberg コピーから自宅 HDFS Iceberg へ特定日データを戻す復旧手順はこちらです。
参考
- Amazon Quick: Creating a dataset using Amazon Athena data: https://docs.aws.amazon.com/quick/latest/userguide/create-a-data-set-athena.html
- Amazon Quick: Authorizing connections to Amazon Athena: https://docs.aws.amazon.com/quick/latest/userguide/athena.html
- Amazon Quick: Troubleshooting Athena connections: https://docs.aws.amazon.com/quick/latest/userguide/troubleshoot-connect-athena.html
- Amazon Athena Pricing: https://aws.amazon.com/athena/pricing/
- Amazon S3 Pricing: https://aws.amazon.com/s3/pricing/

