🐡

Athena v3 にしたら、日付処理の仕様変更により障害が起きた話

2023/07/07に公開

2023.3月に書いておいたネタを今更ながら投稿します。ChatGPT狂乱祭で、すっかり投稿を忘れていました。

概要:

AWS の利用料金を Athena を使って毎月集計しています。今年の 3 月に入り、2 月分の料金集計をしたところ、なぜか 1 月分のレポートが出力されるという障害が起きました。原因を調査したところ、Athena v3 から、- interval '1' month の結果が変わっていたことが原因であることが分かりました。なお、Athena v2 から v3 へは、去年のどこかのタイミングで検証して、変更しています。

原因の詳細:

実行している SQL から、問題の箇所の抜粋を下記に示します。

select date_trunc('month', (current_timestamp AT TIME ZONE 'Asia/Tokyo')) - interval '1' month

現在の時刻 (current_timestamp AT ...) をもとに、初日を算出(date_trunc('month' ...))、そこから一か月前の日時(- interval '1' month)を取得するという処理をしていました。Athena v2、v3 の両方とも、今月の初日を取得する SQL の結果は下記の通りです。

select date_trunc('month', (current_timestamp AT TIME ZONE 'Asia/Tokyo'))
2023-03-01 00:00:00.000 Asia/Tokyo

しかしながら、上記に - interval '1' month を加えると、Athena v2 では想定通り先月の初日が返ってくるのに対し、v3 では 1 月 29 日が返ってきます(30 日引いた?)。そのため、2 月限定のトラップで、見事に障害が発生してしまいました。

Athena v2

select  date_trunc('month', (current_timestamp AT TIME ZONE 'Asia/Tokyo') ) - interval '1' month
2023-02-01 00:00:00.000 Asia/Tokyo

Athena v3

select  date_trunc('month', (current_timestamp AT TIME ZONE 'Asia/Tokyo') ) - interval '1' month
2023-01-29 00:00:00.000 Asia/Tokyo

対策:

該当の SQL は、単純に先月の年月が取得できれば良いので、下記のように、先月の最終日を取得するように変更しました。

select date_trunc('month', (current_timestamp AT TIME ZONE 'Asia/Tokyo')) - interval '1' day

まとめ:

日付処理が含まれるコードのランタイムのバージョンアップ検証は、大変だということがわかりました。あと、重要な変更のページ https://docs.aws.amazon.com/ja_jp/athena/latest/ug/engine-versions-reference-0003.html#engine-versions-reference-0003-breaking-changes に記載しておいてほしい人生でした。

Discussion