はじめに
AWSにはAWS CodePipeline をはじめとして、CI/CD パイプラインを構築するためのツールが色々と揃っていますが、
今回、AWS Step Functions を利用して、デプロイフローを構築したところなかなかに使い勝手が良かったので、共有させていただきます。
構築したCI/CD パイプライン
構築したCI/CD パイプラインは次のような流れで実行されます。
- Slackのショートカットからデプロイコマンドを実行
- AWS chatbotからAWS Step Functionsを呼び出し
- AWS Step Functionsでは、図のようにLambdaを実行して、CodeBuildを実行
- CodeBuildが完了したら、deploy用のlambdaを呼び出す
実装内容の紹介
SlackからAWS Chatbotを通じて、Step Functionsの呼び出し
Slackのワークフロービルダーを用いて、AWS Chatbotを通じてStep Functionsのステートマシーンの呼び出しを行うメッセージを送信できるようにしました。
下記のようなメッセージを最終的に呼び出します。
@aws lambda invoke --payload {payload: ""} --function-name deploy-function --region ap-northeast-1
AWS Step Functionsのフロー
Build Task => Deploy Task の2つのタスクだけをstatemachineに登録します。
Build Task
Build TaskではAWS Lambdaを呼び出し、LambdaからCodebuildを呼び出します。
[AWS Lambdaの処理]
- ParameterStoreから必要なparameterの取得
- CodeBuildの呼び出し
[AWS CodeBuildの処理]
- Dockerfileのビルド
- ECRにイメージの登録
State machineではCodeBuildの呼び出しまでしか行っていないので、waitForTaskTokenを利用してCodeBuildの処理完了まで処理を待つようにしました。
(waitの対応を行わないと、CodeBuildの呼び出しを行った時点で次のDeploy Taskが実行されます。)
waitForTaskTokenを利用したwait対応
- Build Task のintegrationPatternにwaitForTaskTokenを設定
- buildspec.ymlのpost_buildにsend-task-successを設定
こちらの対応を行うことで、CodeBuild完了までDeployTaskの実行を待つことができます。
Deploy Task
Deploy TaskではAWS LambdaでtaskDefinitionの登録とfargateのserviceの更新を行います。
Step Functionsを利用して良かったところ
- 簡単にTaskを連携させるフローが組める
- Taskを追加することで、承認やe2eテストの処理を追加できる余地がある
今後、改善したいところ
いったんCIフローを作成したのですが、まだまだ改善の余地はあるので少しずついいものにしていこうと思います。
直近では、下記のような改善を行おうと思っています。
- AWS Step Functionsで直接CodeBuildを呼び出せるので、そちらを利用してみてコードをスッキリさせたい
- e2eの自動テストを実行するTaskをフローに追加
おわりに
AWS Step Functions が AWS SDK 統合で 200 を超える AWS のサービスのサポートを追加にもあるようにAWS Step Functionsはどんどん改善がされているので、キャッチアップしてCI/CDフローも改善していきたいと思います。