🏗️

【CodeBuild】EventBridgeによる連結からStep Functionsによるパイプライン作成へ

2024/10/06に公開

背景

EventBridgeを使ってCodeBuildのビルドプロジェクトを順次実行させていました。


EventBridgeによるビルドプロジェクトのパワー連結

問題点

  • EventBridgeのイベント管理が大変
    (連結するビルドプロジェクト数-1)個のイベントが必要
  • 一連の流れ単位での管理ができない
    ビルドプロジェクト単位ではなく、実行するビルドプロジェクトのセットで管理したいこともある

解決案

パイプラインを作成することで上記問題を解決できると考えました。


パイプラインによるビルドプロジェクトの連結

技術選定

パイプラインを作成するにあたって使用するサービスを検討します。今回はAWSの下記2点が候補に挙がりました。

(以下ChatGPTによる概要説明)

  • CodePipeline
    アプリケーションのリリースプロセスを自動化するCI/CD(継続的インテグレーション/継続的デリバリー)サービスです。主にコードのビルド、テスト、デプロイを自動化し、開発から本番環境までのリリースフローを簡単に管理できます。
    特徴:
    • ステージごとのワークフロー: ソースコードの取得(例えばGitHubやS3)、ビルド、テスト、デプロイといった一連のステージを定義。
    • トリガー: 新しいコードがプッシュされたり、特定のイベントが発生した際にパイプラインが自動的に実行される。
    • 統合: AWS CodeBuild、CodeDeploy、LambdaなどのAWSサービスや、サードパーティのツール(Jenkinsなど)と統合できる。
    • 並列処理や分岐: 複数の環境に同時にデプロイしたり、異なる処理フローを設定可能。
  • Step Functions
    マイクロサービスやサーバーレスアプリケーションのワークフローを視覚的に設計・実行できるサービスです。状態マシンを使って、異なるステップ(タスク)の連携や条件分岐、リトライロジックを設定します。
    特徴:
    • 状態マシン: 各ステップが異なる状態に対応し、次にどのステップに進むべきかを定義できる。これにより、処理の順序やフローを可視化。
    • シーケンスや条件分岐: ワークフローの中で、順次処理や条件に応じた分岐処理、並列処理が可能。
    • 耐障害性: タスクの失敗時に自動でリトライやエラーハンドリングを行う。
    • サーバーレス統合: Lambda、DynamoDB、SNS、SQSなどのAWSサービスと容易に統合可能。
    • 長時間実行: 長期間実行されるワークフローや、複雑なタスクチェーンの管理にも対応。

実は今回はリポジトリを使用していない(ソースコードはS3に保存している)ためプッシュトリガーは必要ないです。なので今回はStep Functionsを利用することにしました。

Step Functionsの設定

※Step Functions内で設定するビルドプロジェクトは作成済みであることを前提とします

Step Functionsのコンソール画面に移動し、メニュー「ステートマシン」から「ステートマシンの作成」を選択します。テンプレートは「Blank」を選択します。

左側の検索窓に「codebuild」と入力すると、CodeBuildのアクション一覧が出てきます。

ビルドプロジェクトを実行する「StartBuild」をドラッグ&ドロップし、「状態名」は適当なものに、「APIパラメータ」の「ProjectName」は実行したいビルドプロジェクト名にします。

ビルドプロジェクトが実行完了してから次のビルドプロジェクトを実行したい場合、下記設定項目にチェックを入れておきます。

最終的には以下のような図になります。

以上でStep Functionsの設定は完了です。

結果


Step Functionsの実行履歴

パイプラインを作成することで、ビルドプロジェクトを連結する分のEventBridgeのイベントが不要になりました。また、パイプライン単位での実行管理ができるようになりました。

まとめ

  • EventBridgeによるCodeBuildの連結からStep Functionsによるパイプライン作成に変更
  • パイプラインを作成することで管理するEventBridgeイベントが(ビルドプロジェクトを連結する分だけ)減る
  • AWSのパイプラインサービスは主にCodePipelineとStep Functionsがあり、それぞれ特徴が異なるため、要件によって使い分ける

Discussion