その昔、こんな記事を書きました。
S3 と連携して CodePipeline で EC2 Image Builder を動かす
CodePipeline を利用して Lambda を起動して EC2 Image Builder を呼んでいました。
その後、S3 から EventBridge 経由で直接いろいろなサービスを連携できるようになったので、ノーコードで Step Functions のフローにできるんじゃないか?と思いやってみた次第。
ということでやってみた。
全体像
仕組みとしては、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 でステートマシンの作成
作成するステートマシンはこんな感じ。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 通知を有効にする
S3 のイベント通知機能から直接 Step Functions を呼び出すことができないのは今も変わらないので、EventBridge へのイベント通知を有効にする。
EventBridge で新しいルールを作る
新しい EventBridge のルールを用意して S3 のイベントから Step Functions を実行するように設定する。
実行してみる
ここまで出来ればあとは実際に S3 バケットに ファイルをアップロードして動くのを待つのみ。
Step Functions の良いとことは、ノーコード・ローコード開発ができる点もあるけど、実行状況をグラフィカルに確認できるのもいいところ。
改善できるかも
EC2 Image Builder 起動直後は、ビルド用 EC2 インスタンスの起動などもあるので10分待つのはアリだなと思うけど、2回目以降のチェックは5分間隔でチェックしてもいいかもしれない。
ということで、CodePipelilne を使うか、Step Functions を使うのかは好き好きもあるかもしれないけど、コードを書く量は格段に減りましたね。