CI部の古川(と)です。最近はゴーヤにはまっています。
ITの世界に足を踏み入れ1年4か月経ち、初めて「無限ループ」を体験しました。 とても恐ろしかったです。
本ブログは自分に対する戒めと共に無限ループには気をつけようという啓蒙を意図しています。
はじめに
S3へファイルをPUTしたことをトリガーにしてStep Functionsステートマシンを起動させたい!
という思いで、以下の公式チュートリアル「Amazon S3 イベント発生時にステートマシンの実行を開始する」を実施していました。
docs.aws.amazon.com
チュートリアルを実施して1週間後、Step Functionsを見たところ、なんと!ステートマシンの実行履歴が1万6千回を超えていました。(こわい)
何も考えずに手順に従うとこうなるのかぁ…と実感したので、無限ループが発生した原因と該当チュートリアルで無限ループをさせないための方法を書いていきたいと思います!
無限ループが発生した原因
今回AWS公式チュートリアルで作成した構成はこんな感じです。
S3バケットにファイルをPUTすると
CloudTrailでS3のPUTイベントを検知
↓
EventBridgeが発火
↓
Step Functionsステートマシン起動
といった流れで動く構成です。無限ループどこで発生するの?という感じですが、S3バケットが1つしかない点がポイントです◎
そうです……
EventBridgeのトリガーとなるS3バケットとCloudTrailのログを吐くS3バケットが同一です!!
図に示すとこんな感じ。
この構成でS3バケットにファイルをPUTすると
①CloudTrailがPUTイベントを検知
↓
②CloudTrailにログが出力され、そのログをS3バケットにPUT
↓
①CloudTrailがPUTイベントを検知
↓
②CloudTrailにログが出力され、そのログをS3バケットにPUT
↓
①CloudTrailがPUTイベントを検知
↓
・・・ を無限にループします!!!!!
無限ループしている間、毎回EventBridgeが発火し、Step Functionsステートマシンが起動します。
その結果、1週間後にStep Functionsステートマシンの実行数が1万6千回となっていたということです。
該当チュートリアルで無限ループさせない方法
これはとっても簡単ですね。
CloudTrailがログを書き込む用のS3バケットを作成しましょう◎
これで無限ループとは決別できます!(あんしん)
ちなみに料金は...
無限ループが発覚した際に一番怖かったのが料金です。クラウドの良さ「従量課金」が、とてつもなく恐ろしいことに思えた瞬間でした。
結果は...
大した額にはなりませんでした!!良かった!!
EventBridge
- EventBridgeは、イベントソースがAWSリソース(今回の例ではS3)だったため、無料でした。
Step Functions
Step Functionsの料金体系は、「0.025USD/1,000 回の状態遷移」となっており、かつ1 か月あたり 4,000 回の状態遷移が無料利用枠です。
今回は以下画像の定義でステートマシンを作成しているため、状態遷移は4回(Start→Hello→World→End)です。
状態遷移4回 × ステートマシン実行数16,000回=68,000回
68,000回 - 無料利用枠4,000回=64,000回
64,000回 × 0.000025 USD = 1.60 USD
→約160円でした!
安いサービスでほんとうに良かったです。
参考: aws.amazon.com aws.amazon.com
最後に
IT業界に入ってから、無限ループ怖いぞ!とはよく聞くものの、まさか自分が無限ループを無自覚でやってしまうとは思っていませんでした。
比較的値段が高いAWSサービス(機械学習系とか)で無限ループしていたら……と思うと恐ろしいですね。
気をつけよう!無限ループ!
古川智絵 (執筆記事の一覧)
2020年新卒入社 技術課(SRE1課)に所属 好きな食べ物はみそ汁