この記事のポイント
- AwS CodeBuildでコンテナイメージをビルドするチュートリアルだYo
はじめに
この記事ではAWS AWS CodeBuild(以下、本文ではCodeBuild)を使って、アプリケーションをビルドする話を書きます。
主な内容としては実践したときのメモを中心に書きます。(忘れやすいことなど)誤りなどがあれば修正していく想定です。
AWS CodeBuild とは
今回動かすCodeBuildとはどんなものなのでしょうか。公式ドキュメントでは以下のように説明されています。
AWS CodeBuild は、 クラウドでのフルマネージドビルドサービスです。CodeBuild はソースコードをコンパイルし、単体テストを実行して、すぐにデプロイできるアーティファクトを生成します。
引用:とは AWS CodeBuild - AWS CodeBuild
また、公式サイトでは以下のように説明されています。
自動スケーリングを使用したコードのビルドとテスト
引用:マネージド型ビルドサーバー – AWS CodeBuild – AWS
つまりはクラウド上で管理が不要なビルドサーバーを提供するサービスです。
一時的なビルドサーバーを立ち上げ、ビルドアーティファクトを生成できたらサーバーを破棄するような使い方ができます。
※アーティファクト:ビルドやコンパイルの結果生成される成果物のこと。一般的な翻訳だと人工物などの意味がありますが、IT用語としてはビルド成果物のことを指します。
余談:AWSのCode兄弟
公的な呼び名ではないですが、AWSにはCodeBuild以外にもCodeという名前がつくサービスがあります。
これらをまとめて俗に「AWSのCode兄弟」と呼ぶことがあります。※私も勝手にそう呼んでいます。
それぞれの役割としては以下の通りです。
- CodeCommit:ソースコードのバージョン管理を行うサービス(Gitリポジトリのホスティングサービス)
- CodeBuild:ソースコードのビルドとテストを行うサービス
- CodeArtifact:ビルド成果物の保存と管理を行うサービス、パッケージレジストリ
- CodeDeploy:アプリケーションのデプロイを自動化するサービス
- CodePipeline:CodeCommit、CodeBuild、CodeDeployなどのサービスを連携させて、継続的インテグレーションと継続的デリバリー(CI/CD)を実現するサービス
このCode兄弟を組み合わせることで、ソースコードの管理からビルド、テスト、デプロイまでの一連のプロセスをAWS内で自動化できます。
CodeBuildの基本
buildspec.ymlを元にビルドを実行します。
ビルドの基本は4工程にわたるphasesです。具体的には以下のとおりです。
- install
- pre_build
- build
- post_build
他にもrun-as、env、proxy、reports、artifacts、cacheがありますが、今回はphasesを試してみましょう。
ハンズオン
説明は以上にして、CodeBuildを使って簡単なビルドを実行してみます。今回はGitHubのパブリックリポジトリを使った手順になります。具体的には以下の通りです。
-
事前準備
- buildspec.ymlを用意する
- ECRでリポジトリを作成する
-
CodeBuildの設定と実行
- CodeBuild用のIAMロールを作成する
- CodeBuildプロジェクトを作成する
- CodeBuildを実行する
- ビルド結果を確認する
リポジトリをクローンする
セットアップするために、リポジトリをクローンします。
git clone https://github.com/ymd65536/AWSCodeBuild.git
このリポジトリに今回のセットアップに必要なファイルが含まれています。
ディレクトリを変更します。
cd AWSCodeBuild
CodeBuildを構築してイメージをビルド
次にCloudFormationテンプレートを使用してCodeBuildのプロジェクトを作成し、ビルドを実行します。
以下のコマンドでCloudFormationスタックをデプロイします。
aws cloudformation deploy --template-file image_build.yml --stack-name devCodebuild --capabilities CAPABILITY_NAMED_IAM
スタックのデプロイが完了したら、以下のコマンドでビルドを開始します。BUILD_IDという変数の後ろから最後までのコマンドはビルドの進捗をポーリングしてステータスを表示するためのものです。
aws codebuild start-build --project-name devCodebuild-build-project --region ap-northeast-1 && BUILD_ID="devCodebuild-build-project:e8aeb764-5c76-480c-87e5-3a1183944c69" && while true; do STATUS=$(aws codebuild batch-get-builds --ids "$BUILD_ID" --region ap-northeast-1 --query 'builds[0].buildStatus' --output text); echo "Build status: $STATUS"; if [ "$STATUS" != "IN_PROGRESS" ]; then break; fi; sleep 10; done && echo "Final status: $STATUS"
AWS CodeBuildと合わせて使うサービス
ハンズオンは以上です。ここからはCodeBuildを他のサービスと組み合わせて使う場合のパターンを紹介します。
CodeBuildは前述のCode兄弟を組み合わせることを基本とし、他のサービスと連携することでより効果的に利用できます。
以下はCodeBuildとよく組み合わせて使われるAWSサービスの例です。他にもあるとは思いますが、代表的なものを挙げます。
今回は5パターンを紹介します。
パターン1:静的Webサイトホスティングの場合
- CodeCommit: ソースコードのリポジトリとして使用し、CodeBuildがこのリポジトリからコードを取得してビルドを実行
- CodeBuild: ソースコードのビルドを実行します。例えば、静的Webサイトの場合、HTML、CSS、JavaScriptのビルドや最適化
- S3: ビルド成果物の保存先として使用します。CodeBuildはビルド後に生成されたアーティファクトをS3バケットにアップロード
このパターンでは、CodeBuildがソースコードをビルドし、生成された静的WebサイトのファイルをS3にアップロードします。
S3バケットは静的Webサイトホスティング用に設定され、ユーザーはS3のURLを通じてWebサイトにアクセスできます。
多くの場合では、CloudFrontを組み合わせて使用してコスト効率と可用性を高めることが多いでしょう。
パターン2: コンテナ化されたアプリケーションのビルドとデプロイの場合
- CodeCommit: ソースコードとDockerfileのリポジトリとして使用します
- CodeBuild: Dockerイメージのビルドを実行します
- Amazon ECR: ビルドされたDockerイメージの保存先として使用します
- Amazon ECSまたはAmazon EKS: ビルドされたDockerイメージをデプロイするために使用します
このパターンでは、CodeBuildがDockerイメージをビルドし、ECRにプッシュします。その後、ECSまたはEKSがそのイメージを使用してコンテナを起動します。
フロントエンドからへのアクセスはALB(Application Load Balancer)を使用して行うことが一般的です。
パターン3: コンテナ化されたアプリケーションのビルドとデプロイの場合(App Runner利用時)
- CodeCommit: ソースコードとDockerfileのリポジトリとして使用します
- CodeBuild: Dockerイメージのビルドを実行します
- Amazon ECR: ビルドされたDockerイメージの保存先として使用します
- AWS App Runner: ビルドされたDockerイメージをデプロイするため
このパターンではアプリケーションに利用するインフラに対して責任共有モデルの範囲が非常に狭く、App Runnerが多くの責任を引き受けます。
つまり、インフラ管理の負担が大幅に軽減されるので、開発者はコードとコンテナイメージの管理に集中できます。
パターン4: コンテナ化されたアプリケーションのビルドとデプロイの場合(ECS利用時)
- CodeCommit: ソースコードとDockerfileのリポジトリとして使用します。
- CodeBuild: Dockerイメージのビルドを実行します。
- CodeDeploy: ビルドされたDockerイメージをデプロイするために使用します。
- Amazon ECS: ビルドされたDockerイメージをデプロイするため
このパターンでは、CodeDeployを使用してECSサービスのデプロイを自動化します。ALBを必要とする場合も多いでしょう。
なお、リニアデプロイやカナリアデプロイについては最近のアップデートのこともあってECSサービスで対応可能になっています。
参考:Amazon ECS でリニアデプロイとカナリアデプロイが標準機能としてサポート開始
また、デプロイ先にはEC2を使うことも可能です。
パターン5: コンテナ化されたアプリケーションのビルドとデプロイの場合(Lambda利用時)
- CodeCommit: ソースコードとDockerfileのリポジトリとして使用します。
- CodeBuild: Dockerイメージのビルドを実行します。
- CodeDeploy: ビルドされたDockerイメージをデプロイするために使用します。
- AWS Lambda: ビルドされたDockerイメージをデプロイするため
このパターンではAWS SAMを含むサーバーレスフレームワークを利用することが多いです。
必要に応じてAPI Gatewayを組み合わせて使用します。
まとめ
AWS CodeBuildは、クラウドで管理不要のビルドサーバーを提供し、ソースコードのビルドとテストを自動化するサービスです。
CodeCommit、ECR、ECS/EKSなどAWSのCode兄弟や他サービスと連携し、コンテナイメージのビルドやCI/CDパイプラインを構築します
ビルドに困ったときのファーストチョイスになるので積極的に試してみましょう。
また、GitHub Actionsのランナーをマネージドに運用できるところもCodeBuildの大きなポイントです。