はじめに
前回までの記事で、自宅 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・集計・グラフ
│
└─ Amazon Managed Grafana
└─ ログ・時系列ダッシュボード
本記事は、構成・実装方法の整理を目的として作成したもので、現時点では記載内容について実環境での一連の動作検証は実施していません。
可能な範囲で公式ドキュメント等を参照して記載していますが、環境や各サービスのバージョンによっては、手順どおりに動作しない可能性があります。
今後、実機で検証する機会があれば、確認できた内容や修正点を記事へ反映する予定です。
前提
以下の環境は構築済みとします。
自宅ログ基盤
↓
Apache Iceberg
↓
Amazon S3
↓
AWS Glue Data Catalog
↓
Amazon Athena
AWS 側には、次の Iceberg テーブルが作成済みである前提です。
glue_prod.logs.syslog_iceberg
glue_prod.logs.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 の推移
今回は次の2つを試します。
Athena
├─ QuickSight / Quick
└─ Amazon Managed Grafana
構成
今回追加する可視化構成です。
Athena までは既存記事で構築済みなので、本記事では以下から始めます。
Athena で SQL 分析できるデータ
↓
AWS の可視化サービスから利用する
変数
以降の説明では以下を使います。
export AWS_REGION="<AWS_REGION>"
export AWS_PROFILE="<YOUR_AWS_PROFILE>"
export AWS_ACCOUNT_ID="<AWS_ACCOUNT_ID>"
export ICEBERG_BUCKET="<ICEBERG_BUCKET>"
export ATHENA_RESULT_BUCKET="<ATHENA_RESULT_BUCKET>"
export ATHENA_WORKGROUP="<ATHENA_WORKGROUP>"
export GLUE_DATABASE="logs"
例では GLUE_DATABASE=logs、Athena workgroup は既存のものを使います。
Athena Viewを共通レイヤーとして利用する
QuickSight / Quick と Managed Grafana の両方から直接 Iceberg テーブルを参照してもよいですが、可視化用途では Athena View を挟むと扱いやすくなります。
Iceberg
↓
Athena Table
↓
Athena View
↓
├─ QuickSight / Quick
└─ Amazon Managed Grafana
View を使う理由です。
- 元の Iceberg テーブルを変更しなくてよい
- 可視化側の SQL を簡略化できる
- QuickSight / Quick と Grafana で同じ集計定義を共有できる
- 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;
authlog_iceberg に program カラムがない場合は、View から program を外すか、固定値を入れます。
CREATE OR REPLACE VIEW logs.v_authlog_daily AS
SELECT
dt,
host,
'authlog' AS program,
count(*) AS log_count
FROM logs.authlog_iceberg
GROUP BY
dt,
host;
Part 1: 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/logs",
"arn:aws:glue:<AWS_REGION>:<AWS_ACCOUNT_ID>:table/logs/*"
]
},
{
"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/logs/*"
]
},
{
"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: logs
Table: v_syslog_daily
または、table を直接選びます。
Catalog: AwsDataCatalog
Database: logs
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 を想定します。
+-----------------------------------+
| Syslog Dashboard |
+----------------+------------------+
| Logs by Host | Logs by Program |
+----------------+------------------+
| |
| Logs per Day |
| |
+-----------------------------------+
| Authlog per Day |
+-----------------------------------+
Part 2: Amazon Managed Grafana
次に Amazon Managed Grafana から Athena を参照します。
Managed Grafana は、ログ・メトリクス・時系列データの Dashboard に向いています。
今回の用途では、以下のような Panel を作ります。
- Syslog 件数推移
- Authlog 件数推移
- ホスト別ログ件数
- program 別ログ件数
既存の自宅 Grafana 環境に近い使い方をするなら、QuickSight / Quick より Grafana の方が自然です。
Workspaceを作成する
AWS Console から Amazon Managed Grafana を開きます。
AWS Console
↓
Amazon Managed Grafana
↓
Create workspace
設定例です。
Workspace name: home-log-grafana
Authentication: AWS IAM Identity Center または SAML
Permission type: Service managed または Customer managed
個人検証では AWS IAM Identity Center を使うと始めやすいです。既存の認証基盤がある場合は SAML を検討します。
Workspace 作成後、ユーザーに Admin または Editor 権限を付与します。
Amazon Managed Grafana
↓
Workspace
↓
Authentication / Users
↓
Assign user
↓
Role: Admin or Editor
Data Source を追加するには、Grafana 側で Admin または Editor 権限が必要です。
Grafana用IAM Roleを準備する
Managed Grafana から Athena を使うには、Grafana workspace の service role または data source 用 role に権限を付与します。
AWS 公式ドキュメントでは、Athena data source 用の AWS managed policy として AmazonGrafanaAthenaAccess が用意されています。
ただし注意点があります。
AmazonGrafanaAthenaAccess は Athena plugin から query を実行するための権限を含みますが、Athena が読む元データの S3 bucket への権限は含まれません。
そのため、今回の構成では追加で以下が必要です。
- Iceberg データ S3 bucket の読み取り
- Athena query result S3 bucket の読み書き
- Glue Data Catalog の読み取り
また、AWS managed policy 側では Athena workgroup に GrafanaDataSource tag が必要になる場合があります。対象 workgroup に tag を付けます。
aws athena tag-resource \
--resource-arn "arn:aws:athena:${AWS_REGION}:${AWS_ACCOUNT_ID}:workgroup/${ATHENA_WORKGROUP}" \
--tags Key=GrafanaDataSource,Value=true \
--region "${AWS_REGION}" \
--profile "${AWS_PROFILE}"
Grafana 用 role に追加する policy のイメージです。
{
"Version": "2012-10-17",
"Statement": [
{
"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/logs",
"arn:aws:glue:<AWS_REGION>:<AWS_ACCOUNT_ID>:table/logs/*"
]
},
{
"Sid": "ReadIcebergData",
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::<ICEBERG_BUCKET>",
"arn:aws:s3:::<ICEBERG_BUCKET>/warehouse/logs/*"
]
},
{
"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>/*"
]
}
]
}
KMS で S3 object を暗号化している場合は、対象 key に対する kms:Decrypt も必要です。
Athena Data Sourceを追加する
Managed Grafana workspace URL を開き、Grafana にログインします。
Amazon Managed Grafana
↓
Workspace
↓
Grafana workspace URL
Grafana 側で Data Source を追加します。
Connections / Data sources
↓
Add data source
↓
Amazon Athena
AWS data source configuration を使って Athena を追加できる場合は、そちらを優先します。AWS Console 側から data source を選択して有効化できる構成では、workspace の role と AWS service 連携をまとめて管理しやすいためです。
Athena data source では、以下を設定します。
Region: <AWS_REGION>
Data source / Catalog: AwsDataCatalog
Database: logs
Workgroup: <ATHENA_WORKGROUP>
Output location: s3://<ATHENA_RESULT_BUCKET>/grafana/
保存して接続確認します。
Save & test
GrafanaからAthena SQLを実行する
まず、簡単な SQL で確認します。
SELECT
dt,
sum(log_count) AS log_count
FROM logs.v_syslog_daily
GROUP BY dt
ORDER BY dt;
Grafana の Table 表示で結果が返れば、Athena への接続はできています。
次に時系列として使う query を確認します。
Amazon Managed Grafana の Athena data source では、時系列 query 用の macro が用意されています。
公式ドキュメントでは、例えば以下の macro が案内されています。
$__timeFilter(column)$__dateFilter(column)$__timeFrom()$__timeTo()$__timeGroup(column, '1m')
Grafana の macro は Athena コンソールへそのまま貼り付けても動きません。Grafana 側で展開されてから Athena に送られます。
Grafana Dashboardを作成する
Dashboard を作成します。
Dashboards
↓
New
↓
New dashboard
↓
Add visualization
↓
Data source: Amazon Athena
Syslog件数推移
Panel:
Visualization: Time series
Query:
SELECT
time,
sum(log_count) AS log_count
FROM logs.v_syslog_hourly
WHERE $__timeFilter(time)
GROUP BY time
ORDER BY time;
Athena table を直接参照する場合は以下です。
SELECT
date_trunc('hour', ts) AS time,
count(*) AS log_count
FROM logs.syslog_iceberg
WHERE $__timeFilter(ts)
GROUP BY 1
ORDER BY 1;
Authlog件数推移
Panel:
Visualization: Time series
Query:
SELECT
time,
sum(log_count) AS log_count
FROM logs.v_authlog_hourly
WHERE $__timeFilter(time)
GROUP BY time
ORDER BY time;
Athena table を直接参照する場合は以下です。
SELECT
date_trunc('hour', ts) AS time,
count(*) AS log_count
FROM logs.authlog_iceberg
WHERE $__timeFilter(ts)
GROUP BY 1
ORDER BY 1;
ホスト別ログ件数
Panel:
Visualization: Bar chart
Query:
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別ログ件数
Panel:
Visualization: Bar chart
Query:
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;
Dashboard完成イメージ
+------------------------------------------------+
| AWS Log Analytics |
+-----------------------+------------------------+
| Syslog / Hour | Authlog / Hour |
+-----------------------+------------------------+
| Logs by Host | Logs by Program |
+-----------------------+------------------------+
QuickSight / QuickとGrafanaを比較する
どちらも Athena を data source として使えます。
ただし、得意な用途が違います。
| 項目 | QuickSight / Quick | Amazon Managed Grafana |
|---|---|---|
| 主用途 | BI・分析 | 監視・時系列 |
| Athena連携 | ○ | ○ |
| SQL利用 | ○ | ○ |
| ダッシュボード | ○ | ○ |
| ログ分析 | ○ | ◎ |
| ビジネス分析 | ◎ | ○ |
| 時系列分析 | ○ | ◎ |
| 既存Grafana運用との親和性 | △ | ◎ |
QuickSight / Quick は、Athena 上のログを BI データとして扱える点が便利です。
例えば、以下のような使い方に向いています。
- 日次 / 週次の集計レポート
- ホスト別・program 別の傾向分析
- SPICE に取り込んだ高速な集計表示
- 他の業務データと組み合わせた分析
一方、Amazon Managed Grafana は、時系列 Dashboard と監視用途に向いています。
例えば、以下のような使い方に向いています。
- syslog / authlog の時系列推移
- 直近数時間・数日の傾向確認
- ホスト別の異常増加確認
- 既存 Grafana dashboard に近い運用
今回のログ収集システムでは、ログ監視用途としては Amazon Managed Grafana の方が自然です。
ただし、優劣ではありません。
QuickSight / Quick:
Athena 上のログを BI データとして扱う
Amazon Managed Grafana:
Athena 上のログを監視・時系列 Dashboard として扱う
このように分けると使いやすいです。
Athenaコストに注意する
可視化すると、Athena query が繰り返し実行されます。
Dashboard更新
↓
Athena Query
↓
S3 Scan
↓
Athena料金
Athena は query ごとのスキャン量がコストに効きます。具体的な単価は変わる可能性があるため、記事執筆時点の AWS 公式料金ページで確認します。
コストを抑えるために、以下を意識します。
-
dtで絞り込む - Iceberg partition を活用する
- Parquet の列指向を活かし、必要な列だけ SELECT する
-
SELECT *を Dashboard 用 query に使わない - Grafana の refresh interval を短くしすぎない
- Athena View で集計定義を共通化する
- 必要に応じて日次 / 時間別の事前集計を作る
特に Grafana の自動 refresh は注意します。
例えば、Dashboard を開いたまま 30 秒 refresh にすると、Panel 数に応じて Athena query が継続的に実行されます。
Panel 4個
Refresh 30秒
1時間表示
4 panels × 120 refresh = 480 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 と Managed Grafana から可視化することです。
AWS環境を削除する
検証が終わったら、AWS 側に作成した環境を削除します。
ここでは、自宅側の HDFS / Iceberg は残し、AWS 側の分析・可視化環境を削除します。
削除対象です。
QuickSight / Quick
Dashboard
Analysis
Dataset
Athena data source
Amazon Managed Grafana
Dashboard
Athena data source
Workspace
Athena
可視化用 View
Workgroup tag
検証用 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 だけを対象にします。既存環境や他用途で共有しているリソースは削除しません。
変数を確認する
削除前に、対象を変数で確認します。
export AWS_REGION="<AWS_REGION>"
export AWS_PROFILE="<YOUR_AWS_PROFILE>"
export AWS_ACCOUNT_ID="<AWS_ACCOUNT_ID>"
export ICEBERG_BUCKET="<ICEBERG_BUCKET>"
export ATHENA_RESULT_BUCKET="<ATHENA_RESULT_BUCKET>"
export ATHENA_WORKGROUP="<ATHENA_WORKGROUP>"
export GLUE_DATABASE="logs"
export IAM_USER_NAME="<IAM_USER_NAME>"
export GRAFANA_WORKSPACE_ID="<GRAFANA_WORKSPACE_ID>"
現在の AWS アカウントを確認します。
aws sts get-caller-identity \
--profile "${AWS_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 アカウントを共有している場合は、アカウント自体は削除しません。
Amazon Managed Grafanaを削除する
Grafana workspace 内で作成した Dashboard と Athena data source を削除します。
Amazon Managed Grafana
↓
Workspace URL
↓
Dashboards
↓
対象 Dashboard
↓
Delete
Grafana
↓
Connections / Data sources
↓
Amazon Athena
↓
Delete
Workspace 自体を削除します。
AWS Console で削除する場合です。
AWS Console
↓
Amazon Managed Grafana
↓
Workspaces
↓
home-log-grafana
↓
Delete
AWS CLI で削除する場合です。
aws grafana delete-workspace \
--workspace-id "${GRAFANA_WORKSPACE_ID}" \
--region "${AWS_REGION}" \
--profile "${AWS_PROFILE}"
削除状態を確認します。
aws grafana describe-workspace \
--workspace-id "${GRAFANA_WORKSPACE_ID}" \
--region "${AWS_REGION}" \
--profile "${AWS_PROFILE}"
削除済みの場合、workspace が見つからない旨のエラーになります。
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;
Athena Workgroup tagを外す
Managed Grafana 用に Athena workgroup へ GrafanaDataSource tag を付けた場合は外します。
aws athena untag-resource \
--resource-arn "arn:aws:athena:${AWS_REGION}:${AWS_ACCOUNT_ID}:workgroup/${ATHENA_WORKGROUP}" \
--tag-keys GrafanaDataSource \
--region "${AWS_REGION}" \
--profile "${AWS_PROFILE}"
tag を確認します。
aws athena list-tags-for-resource \
--resource-arn "arn:aws:athena:${AWS_REGION}:${AWS_ACCOUNT_ID}:workgroup/${ATHENA_WORKGROUP}" \
--region "${AWS_REGION}" \
--profile "${AWS_PROFILE}"
Glue tableとdatabaseを削除する
Glue table を削除します。
aws glue delete-table \
--region "${AWS_REGION}" \
--database-name "${GLUE_DATABASE}" \
--name syslog_iceberg \
--profile "${AWS_PROFILE}"
aws glue delete-table \
--region "${AWS_REGION}" \
--database-name "${GLUE_DATABASE}" \
--name authlog_iceberg \
--profile "${AWS_PROFILE}"
Glue database を削除します。
aws glue delete-database \
--region "${AWS_REGION}" \
--name "${GLUE_DATABASE}" \
--profile "${AWS_PROFILE}"
削除確認します。
aws glue get-database \
--region "${AWS_REGION}" \
--name "${GLUE_DATABASE}" \
--profile "${AWS_PROFILE}"
削除済みの場合、database が見つからない旨のエラーになります。
Athena query resultを削除する
Athena query result を削除します。
aws s3 rm \
s3://${ATHENA_RESULT_BUCKET}/ \
--recursive \
--profile "${AWS_PROFILE}"
削除後に確認します。
aws s3 ls \
s3://${ATHENA_RESULT_BUCKET}/ \
--recursive \
--summarize \
--profile "${AWS_PROFILE}"
S3 Iceberg dataを削除する
AWS 側 Iceberg warehouse を削除します。
aws s3 rm \
s3://${ICEBERG_BUCKET}/warehouse/logs/syslog_iceberg/ \
--recursive \
--profile "${AWS_PROFILE}"
aws s3 rm \
s3://${ICEBERG_BUCKET}/warehouse/logs/authlog_iceberg/ \
--recursive \
--profile "${AWS_PROFILE}"
warehouse 全体を検証用に作成している場合は、bucket 内を空にします。
aws s3 rm \
s3://${ICEBERG_BUCKET}/ \
--recursive \
--profile "${AWS_PROFILE}"
bucket を削除します。
aws s3 rb s3://${ICEBERG_BUCKET} \
--force \
--profile "${AWS_PROFILE}"
aws s3 rb s3://${ATHENA_RESULT_BUCKET} \
--force \
--profile "${AWS_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_PROFILE}"
aws s3api head-bucket \
--bucket "${ATHENA_RESULT_BUCKET}" \
--profile "${AWS_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_PROFILE}"
削除確認します。
aws athena get-work-group \
--work-group "${ATHENA_WORKGROUP}" \
--region "${AWS_REGION}" \
--profile "${AWS_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_PROFILE}"
Access Key を削除します。
aws iam delete-access-key \
--user-name "${IAM_USER_NAME}" \
--access-key-id "<ACCESS_KEY_ID>" \
--profile "${AWS_PROFILE}"
付与済み managed policy を確認します。
aws iam list-attached-user-policies \
--user-name "${IAM_USER_NAME}" \
--profile "${AWS_PROFILE}"
検証用 policy を detach します。
aws iam detach-user-policy \
--user-name "${IAM_USER_NAME}" \
--policy-arn "<POLICY_ARN>" \
--profile "${AWS_PROFILE}"
inline policy を付けた場合は確認します。
aws iam list-user-policies \
--user-name "${IAM_USER_NAME}" \
--profile "${AWS_PROFILE}"
inline policy を削除します。
aws iam delete-user-policy \
--user-name "${IAM_USER_NAME}" \
--policy-name "<POLICY_NAME>" \
--profile "${AWS_PROFILE}"
自作 managed policy を作成していて、他で使っていない場合は削除します。
aws iam delete-policy \
--policy-arn "<POLICY_ARN>" \
--profile "${AWS_PROFILE}"
検証用 IAM User を削除します。
aws iam delete-user \
--user-name "${IAM_USER_NAME}" \
--profile "${AWS_PROFILE}"
削除確認します。
aws iam get-user \
--user-name "${IAM_USER_NAME}" \
--profile "${AWS_PROFILE}"
削除済みの場合、user が見つからない旨のエラーになります。
Managed Grafana 用や QuickSight / Quick 用に検証専用 role / policy を追加した場合も、同じ考え方で detach してから削除します。AWS managed policy やサービスが自動作成した role を共有利用している場合は削除しません。
削除後の最終確認
最後に、AWS 側リソースが残っていないことを確認します。
Glue database:
aws glue get-database \
--region "${AWS_REGION}" \
--name "${GLUE_DATABASE}" \
--profile "${AWS_PROFILE}"
S3 bucket:
aws s3api head-bucket \
--bucket "${ICEBERG_BUCKET}" \
--profile "${AWS_PROFILE}"
aws s3api head-bucket \
--bucket "${ATHENA_RESULT_BUCKET}" \
--profile "${AWS_PROFILE}"
Athena workgroup:
aws athena get-work-group \
--work-group "${ATHENA_WORKGROUP}" \
--region "${AWS_REGION}" \
--profile "${AWS_PROFILE}"
Grafana workspace:
aws grafana describe-workspace \
--workspace-id "${GRAFANA_WORKSPACE_ID}" \
--region "${AWS_REGION}" \
--profile "${AWS_PROFILE}"
IAM user:
aws iam get-user \
--user-name "${IAM_USER_NAME}" \
--profile "${AWS_PROFILE}"
削除済みのリソースは、存在しない旨のエラーになります。
これで、AWS 側に作成した S3 / Glue / Athena / QuickSight / Managed Grafana / IAM の検証環境を削除できます。
最終構成
今回の最終形です。
役割分担は以下です。
自宅:
データ収集・保管
Source of Truth
AWS:
分析用コピー
SQL分析
BI
Dashboard
AWS へログ収集システム全体を移行したわけではありません。
既存の自宅 Iceberg 基盤を残したまま、AWS をクラウド分析・可視化環境として追加しています。
まとめ
今回は、既存の AWS 側分析基盤に可視化レイヤーを追加しました。
Iceberg
↓
S3
↓
Glue
↓
Athena
ここまで作成していた分析基盤へ、以下を追加しました。
├─ QuickSight / Quick
└─ Amazon Managed Grafana
QuickSight / Quick では、Athena 上のログを BI データとして扱えます。
Managed Grafana では、syslog / authlog を時系列 Dashboard として確認できます。
また、両方から直接 Iceberg table を参照するのではなく、Athena View を共通レイヤーとして挟むことで、可視化側の SQL を単純化できます。
Iceberg
↓
Athena Table
↓
Athena View
↓
├─ QuickSight / Quick
└─ Grafana
これで、自宅 Iceberg を Source of Truth として残しながら、AWS 側で SQL 分析・BI・Dashboard まで広げられるようになります。
参考
- 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 Managed Grafana: Using Athena data source: https://docs.aws.amazon.com/grafana/latest/userguide/Athena-using-the-data-source.html
- Amazon Managed Grafana: AWS managed policies: https://docs.aws.amazon.com/grafana/latest/userguide/security-iam-awsmanpol.html
- Amazon Managed Grafana Documentation: https://aws.amazon.com/documentation-overview/grafana/
- Amazon Athena Pricing: https://aws.amazon.com/athena/pricing/
- Amazon S3 Pricing: https://aws.amazon.com/s3/pricing/