AWS CodeBuildとAWS CodePipelineによるリリースプロセスの自動化について

はじめに

本記事では、まずAWS CodeBuildとAWS CodePipelineの概要を紹介します。その後、AWS CodeBuildと AWS CodePipeline、Amazon ECSを利用したコンテナワークフローを自動化する手順について紹介します。

AWS CodeBuildとは

AWS CodeBuildは、ソースコードのコンパイル、テストの実行、デプロイ可能なソフトウェアパッケージの作成が可能なフルマネージド型のビルドサービスです。AWS CodeBuildを利用すると、ビルドサーバやソフトウェアの設定、バッチ適用、アップデートなどのソフトウェアのインストールや管理に関わる作業が不要になります。

AWS CodeBuildでは、継続的スケーリングにより、複数のビルドが同時に処理されるため、ビルドが待機状態でキュー内に残されることはありません。料金は、ビルドの実行が完了するまでにかかった分単位の時間に対して発生します。

AWS CodePipelineとは

AWS CodePipelineは、素早く確実性のあるアプリケーションとインフラストラクチャのアップデートのためのパイプラインのリリースを自動化する、フルマネージド型の継続的デリバリーサービスです。AWS CodePipelineでは、ユーザーが定義したリリースモデルに基づき、コード変更があった場合のフェーズの構築、テスト、デプロイを自動化します。

また、GitHubをはじめとするサードパーティ製のサービスと簡単に統合することができます。料金は、初期費用などの前払い料金はなく、実際に使用した分にのみ発生します。

AWS CodeBuildとAWS CodePipelineの統合

AWS CodeBuildは、AWS CodePipelineと統合されています。ビルドアクションを追加し、クラウドで実行する継続的インテグレーションと継続的デリバリーのプロセスをセットアップすることで、リリースプロセスを自動化することができます。AWS CodePipelineはコードのテスト、AWS CodeBuildはビルドの実行を行います。

ここでは、AWS CodeBuildと AWS CodePipeline、Amazon ECSを利用した例を紹介します。

継続的デリバリーパイプラインの設定

自動化されたビルドとテスト機構を組み合わせた継続的デリバリーは、以下の利点があります。

  • エラーの早期発見
  • コンテナ化したサービスの構築とデプロイの時間短縮

Amazon ECSでコンテナワークフローを自動化するには、AWS CloudFormationを利用したソリューションを構築する方法もありますが、ここでは、AWS AWS CodeBuildとAWS CodePipelineをAmazon ECSと連携させた方法について紹介します。

1. 新規プロジェクトの作成

AWS CodePipelineで新規プロジェクトを作成します。[Pipeline name]にプロジェクト名を入力します。

2. ソース場所の選択

ソースコードが保存されている場所を選択します。ここで用意されているものは、AWS CodeCommit、GitHub、Amazon S3です。それぞれについて、選択した場合の手順を以下に示します。

(AWS CodeCommitを選択した場合)

  • [Repository name]でソースコードが含まれているリポジトリの名前を選択
  • [ブランチ名]でビルドするソースコードのバージョンが含まれているブランチの名前を選択

(GitHubを選択した場合)

  • [Connect to GitHub]を選択
  • 手順に従い、AWS CodePipelineにレポジトリへのアクセス権を付与
  • [Repository]でソースコードが含まれているリポジトリの名前を選択
  • [ブランチ]でビルドするソースコードのバージョンが含まれているブランチの名前を選択

(Amazon S3を選択した場合)

  • [バケット]でソースコードが含まれているリポジトリの名前を選択
  • [S3オブジェクトキー]に、ソースコードを含むファイルの名前(file.zipなど)を入力

3. ビルドステップの追加

<二重課金の回避>

ビルドステップの追加の説明に入る前に、二重課金が発生しない方法を紹介します。
それは、「AWS CodePipelineを使用する場合は、AWS CodeBuildでウェブフックを無効にする」です。

CodeBuildプロジェクトのウェブフックが有効で、プロジェクトをAWS CodePipelineのビルドステップとして使用すると、以下のことが発生します。

  • コミットごとに2つの等しいビルドが作成される
  • 作成された一方のビルドは、ウェブフックを通じてトリガーされる
  • もう一方のトリガーは、AWS CodePipelineを通じてトリガーされる
  • ビルド単位で料金が発生し、両方のビルドで課金される

ビルドステップの追加について、既存のビルドプロジェクトを使用するか否かによって、2通りの方法あります。

既存のビルドプロジェクトを使用する場合

Configure your projectの欄の[Select an existing build project]を選択し、[Project name]に、ビルドプロジェクトの名前を入力します。

※注意点として、既存のビルドプロジェクトを使用する場合は、出力アーティファクトの設定がすでに定義されている必要があります。

既存のプロジェクトがない、または使用しない場合

AWS CodePipelineから以下の手順で新しいプロジェクトを作成します。

  • [Build provider]でAWS CodeBuildを選択
  • Configure your projectでCreate a new build projectを選択
  • [Project name]でプロジェクトの名前を入力
  • (必要な場合は、他のユーザーがプロジェクトの用途を理解できるように、[Description]にビルドプロジェクトの説明を記入)

次に、環境についての設定を行います。以下は、AWS CodeBuildが管理するDockerイメージに基づいてビルド環境を使用するための手順です。

  • [Environment image]でUse an image managed by AWS CodeBuildを選択
  • [Operating System]でUbuntuを選択
  • [Runtiime]でDockerを選択
  • [Version]でAWS CodeBuildが対応するRuntiime Versionを選択
  • [Build specification]でUse the buildspec yml in the source code root directoryを選択

以上の手順を終えると、CodeBuildステップの作成ができ、既存プロジェクトとして、AWS CodePipelineから選択できるようになります。

4. デプロイプロバイダの追加

デプロイプロバイダは、ビルドしたコードが配置される場所です。ここでの手順を以下に示します。

  • [Deployment provider]でAmazon ECSを選択(※このほかに、AWS CodeDeploy、AWS Elastic Beanstalk、AWS CloudFormationなどがあります。)
  • AWS CodeBuildからAmazon ECSにデプロイするために、イメージ定義JSONファイルを生成(この事前準備として、buildspec.ymlファイル内でAWS CodeBuildのビルドプロセスのpre-build、build、post-buildフェーズに追加の手順が必要です。)
  • [Cluster name]に「3. ビルドステップの追加」で入力したプロジェクト名を入力
  • [Service name]にwebと入力
  • [Image filename]にイメージ定義ファイル名を入力

5. AWS Service Roleの追加/作成

AWSアカウント内のリソースにAWS CodePipelineがアクセスできるようにするために、既存のIAMサービスロールを選択するか、AWS CodePipelineに作成することができます。ここでは、ウィザードを使い、そこで作成したロールを使うため、[Role name]にAWS-CodePipeline-Serviceと入力します。

以上の手順の後、Create pipelineを選択し、パイプラインが作成されます。

まとめ

本記事では、AWS CodeBuild と AWS CodePipelineについて簡単に紹介し、後半で、AWS CodeBuild と AWS CodePipelineをAmazon ECSと連携させて、継続的デリバリーパイプラインの設定をする手順について紹介しました。ここで紹介した手順は、前述のAWS CloudFormationを使用してソリューションを構築するよりも簡単です。いくつかの手順を踏むだけで、Amazon ECSにおいてコンテナワークフローを自動化することができます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

前の記事

Amazon Sumerianの使い方について

次の記事

EFSとEC2