はじめに
こんにちは、最近AI画像生成にハマっている兒玉です。
今日は AWS Control Tower ( 以下Control Tower ) に管理されている S3 Log のライフサイクルを変更しようとしたことで想定していなかった課金が発生したやらかしをご紹介します。
Control Tower では、Log Archive アカウントに CloudTrail のログを作成してくれています。しかし、だいぶ前に作成したので、一体どのくらいの期間ログを保持しているかとか、どのくらいの量ログが溜まっているのか確認していませんでした。
気になって確認してみると…
S3 がトップじゃないですか!(金額はたいしたことないですが、アカウントを維持しているだけで毎月料金を近く取られるのが気になる)
というわけで、少しでも節約するために 古いログを S3 Glacier Flexible Retrieval (旧Glacier) に移すことにしました。
このときは悲劇が起こるとは思っても見ませんでした。
S3バケットのライフサイクルを変更(失敗)
Control Tower のユーザーガイドを一通り探してみたのですが、それっぽいユースケースの説明がありませんでした。仕方ないので、自力で手探りしてみることにします。
Control Tower のログは Log Archive アカウントにあります。Log Archive アカウントにアクセスして、S3バケットを確認しました。
180日で期限切れになって削除される設定になっているようですね。変更してみましょう。
あれ? Access Denied ?
ああ、そうですよね、Control Tower の管理するログなので、直接変更はできないですよね。Control Tower よくできていますよね!(すっとぼけ)
ここでやめておけばよかったのですが…
Control Tower のコンソールからログ設定の変更(要確認?)
というわけで、気を取り直して Control Tower の方から変更していきましょう。
管理アカウントでログインし直して、Control Tower の左のメニューから 共有アカウント > ログアーカイブ をクリック
ベースラインの設定 の CloudFormation StackSet を表示する をクリック
Log Archive アカウントにControl Tower がデプロイした際の StackSet の情報が表示されるので、スタックインスタンス タブを選択して中身を確認します。AWS アカウントの箇所にLog Archive アカウントが表示されています。ということは、これを変更しろということでしょうかね?
更にパラメータのタブを見ると、
RetentionDays が 180 RetntionDaysForAccessLogs が 180 、その下のTransitionDays が 90 TransitionToGlacier が No になっています。ここを変えれば良さそうですね。
右上のアクションから、StackSet のパラメータを上書き を選択
RetentionDays と RetntionDaysForAccessLogs と TransitionToGlacier を選択して StackSet 値の上書きを選択
TransitionToGlacier を Yesにし、RetentionDays と RetentionDaysForAccessLogs は 編集できたことわかりやすいように 180 -> 200 としました。
デプロイがかかって…
SUCCEEDED になりました。
LogArchive アカウントに入り直して、S3バケットのライフサイクル設定を確認すると90日でGracier Flexible Retrieval に移動して、200日で削除されるようにきちんと更新されていました!
しかし、Control Tower の 画面の Amazon S3 ログを確認すると、 180日のままでした。
うーん、なぜだろう。と、当日は調査をやめて作業を終了しました。
翌日、異常事態の通知が!
AWS から、連絡用のメールアドレスに、見慣れない通知が来ました。
AWS Cost Management: Cost anomaly(ies) summary for account: <アカウント名称> (<AWS アカウントID>) [2024-01-24]
まずい! なにか乗っ取りでも発生したのか! と、真っ青になって確認してみると…
$242.31 !?
…調査開始…
アカウントID 下3桁 911 Log Archive アカウントの S3 … まさか… 震える手で Anomary Detection Dashboard のボタンを押します…
あああ… $242.31 605775% …. アカウントID 末尾 911 は昨日の Control Tower の Log Archive アカウントでしかも料金は S3 で発生しています。この時点でほぼほぼ昨日の自分の作業が原因だとわかりました。でも、なぜ?
考えられる根本原因のトップランキング のところをスクロールして、根本原因の表示 のリンクから確認します
検証時にしか使っていないアカウントなので、通常の場合日毎のアクセス料金は 0 Request です。ところが、昨日ののみ S3 の API アクセスがなんと 7,072,658 Requests になっています!
あれ? でもAPIコールだけではそんなに金額かからないんでは?
S3 標準 の PUT、COPY、POST、LIST リクエスト (1,000 リクエストあたり) は 0.0047USD
S3 標準 の GET、SELECT、他のすべてのリクエスト (1,000 リクエストあたり) は 0.00037USD
7,072,658(件) x 0.0047(USD/1000件) / 1000(件) =33.2414926 (USD)
7,072,658(件) x 0.00037USD(USD/1000件) / 1000(件) =2.61688346 (USD)
合いませんね。
ちょっと調べてみると、
注記
PUT、COPY、またはライフサイクルルールを使用してデータを任意の S3 ストレージクラスに移動する場合、リクエストごとに取り込み料金がかかります。オブジェクトをストレージクラスに移動する前に、取り込みまたは移行のコストを検討してください。コストに関する考慮事項の詳細については、[Amazon S3 の料金] を参照してください。
しまったぁぁぁぁぁ… ライフサイクル移行リクエストの料金 か…
S3 Glacier Flexible Retrieval への移行料金は 0.03USD / 1000 件(*2024/01/25現在)
7,072,658(件) x 0.03426USD(USD/1000件) / 1000(件) = 242.30926308(USD)
ぴったりです。確定です。自分のやらかしでしたね。あぁ、ライフサイクル移行の料金ってかなり割高だったんですね…
終わりに
今回は一気に90日分ほど移動したので 242.31 USD の料金が発生しました。しかし、このままでは、毎月この1/3程度の料金が毎月発生してしまい毎月1USD節約するどころか毎月約70USDずつ課金されてしまいます。これはたまらないので、次回はなにか対策を検討しようと思います。