S3 と連携して Step Functions で EC2 Image Builder を動かす

その昔、こんな記事を書きました。

S3 と連携して CodePipeline で EC2 Image Builder を動かす

CodePipeline を利用して Lambda を起動して EC2 Image Builder を呼んでいました。

その後、S3 から EventBridge 経由で直接いろいろなサービスを連携できるようになったので、ノーコードで Step Functions のフローにできるんじゃないか?と思いやってみた次第。

ということでやってみた。

全体像

build-ami-by-stepfunctions.png

仕組みとしては、S3 から EventBridge 経由でオブジェクトのアップロードイベントを受けて Step Functions を動かす。

Step Functions の中では、EC2 Image Builder の Image Pipeline の ARN を Systems Manager の Parameter Store から読み出し、EC2 Image Builder の Image Pipeline を実行して AMI を作成して、SNS 経由で通知をする。

Step Functions でステートマシンの作成

step-functions-flow.png

作成するステートマシンはこんな感じ。EC2 Image Builder を回すときに、パイプラインの冪等性担保のために指定する ClientToken の生成だけどうしてもコードが必要だったのでノーコードにはならなかった。

ポイントは、GetImageStatus タスクと次の Choise ステート。ここでは、EC2 Image Builder の GetImage API を呼び出して、イメージ作成のステータスを監視している。Image.State.Status が AVAILABLE になっていなければ、Wait ステートに戻ってループをしている。ループ間隔はいまのところ、10分にしてる。ここはビルド処理にどれくらいかかるのか次第。

そして、Image.State.Status が AVAILABLE または FAILED になったらそれぞれ SNS で通知を送ってる。

MakeUUID は、Python で書いた Lambda 関数。コードはこんな。

ステートマシンが出来上がったら、必要な権限を付与したロールを作成する。今回のポリシーはこんな感じ。

S3 のイベント通知で EventBridge 通知を有効にする

enable-eventbridge-integration.png

S3 のイベント通知機能から直接 Step Functions を呼び出すことができないのは今も変わらないので、EventBridge へのイベント通知を有効にする。

EventBridge で新しいルールを作る

新しい EventBridge のルールを用意して S3 のイベントから Step Functions を実行するように設定する。

eventbridge-s3-event-definition.png

eventbridge-target-definition.png

実行してみる

ここまで出来ればあとは実際に S3 バケットに ファイルをアップロードして動くのを待つのみ。

stepfunctions-result.png

Step Functions の良いとことは、ノーコード・ローコード開発ができる点もあるけど、実行状況をグラフィカルに確認できるのもいいところ。

改善できるかも

EC2 Image Builder 起動直後は、ビルド用 EC2 インスタンスの起動などもあるので10分待つのはアリだなと思うけど、2回目以降のチェックは5分間隔でチェックしてもいいかもしれない。

ということで、CodePipelilne を使うか、Step Functions を使うのかは好き好きもあるかもしれないけど、コードを書く量は格段に減りましたね。