ServerlessFramework

【AWS】CodeBuildとは?Serverless Frameworkの簡易サンプルを活用して動作確認をする

どうも、AWS勉強中のとがみんです。

CodePipelineを使用して、CI/CDの構築に関して下記の記事に整理してきました。

AWSサービスを活用して、CI/CDの仕組みを構築するにあたって、CodeBuildの理解が必要なため、この記事ではCodeBuildの理解を深める目的で、簡単なサンプルを作成して動作を確認してみようかと思います。

CodeBuildとは?

CodeBuildとは、ソースコードをコンパイル・テストの実行等をを行い、デプロイ可能なソフトウェアパケージを作成できるサービスです。

CodeBuildはフルマネージド型のサービスのため、ビルドサーバーのセットアップやセキュリティパッチの適用等をする必要がなく管理工数を削減できます。

ビルド対象のソースコード、ビルドを行う環境設定、ビルド時に実行するコマンドを設定するだけで、ビルドに必要な環境構築とビルドが行える状態を作ることができます。

今回作成するもの

CodeCommitにて、serverless-cicd-testというリポジトリを作成し、Serverless Frameworkを活用した簡易サンプルを構築します。

作成したサンプルに対して直接serverless deployを実行するのではなく、CodeBuildを活用してserverless deployを実行できるように設定し、その動作を確認していきます。

CodeBuildのAWSコンソール画面からビルドを実行し、CodeCommitから対象のソースコードを取得し、コマンドを実行、API GatewayとLamdaから構成される簡易APIをデプロイし動作確認をします。

Serverless Frameworkを活用した簡易サンプルに関しては下記の記事をベースに考えます。

作業手順の概要

今回は下記のような手順でServerless FramewokのデプロイをCodeBuildを介して行い挙動を確認しました。

  1. プロジェクトの作成
  2. CodeBuildの設定
  3. CodeBuildで実行するコマンドの設定
  4. CodeBuildプロジェクトのビルドの実行と確認

作業手順の詳細

プロジェクトの作成

今回CodeBuildがデプロイ対象とするプロジェクトは下記の記事をベースに作成しました。

CodeCommitにserverless-cicd-testというリポジトリを作成し、mainブランチとdevelopブランチを作成しdevelopブランチで今回は作業をおこないます。

CodeBuildの設定

CodeBuildを使用するにあたって、ビルド対象のソースコードの指定や、ビルド環境等、各種設定を行なっていきます。

ビルドプロジェクトの作成

「デベロッパー用ツール>CodeBuild>ビルドプロジェクト」から、ビルドプロジェクトを作成します。
「ビルドプロジェクトを作成する」を選択すると、各種設定の入力画面が出てくるので、入力していきます。

プロジェクトの設定

プロジェクト名
CodeBuildのプロジェクト名を記載します。今回はプロジェクト名をcodebuild-serverless-cicd-testとしています。

説明
作成するプロジェクトの概要について記載します。今回は「Serverless Frameworkを活用したCI/CD構築のためのビルドプロジェクト」と記載しました。

ビルドバッジ
「ビルドバッジを有効にする」を選択すると、プロジェクトのビルドステータスが表示および埋め込み可能になります。AWSアカウントへログイン等いちいち認証することなく、CodeBuildのステータスを確認できるような仕組みを作れるようになるので便利です。今回は活用しないためチェックは外しておきます。

詳細は下記のリンクを参考にしてください。
CodeBuild でのビルドバッジサンプル
CodeBuildバッジの活用方法

同時ビルド制限の有効化
同時にビルドを実行できる数を制限できます。
デフォルト値は60になっており、実行中のビルド数がプロジェクトの同時ビルド制限に達すると、ビルドエラーを返却します。今回はビルド制限したい理由がないため、チェックは外しておきます。

詳細は下記のリンクを参考にしてください。
AWS CodeBuild でのビルドの使用
AWS CodeBuild のクォータ

ソースの設定

ソースプロバイダ
ソースプロバイダでは、使用するソースコードのリポジトリが存在するGitサービスを選択します。今回はCodeCommitで管理しているソースコードを対象とするため、CodeCommitを選択します。

リポジトリ
リポジトリは今回serverless-framework-testで作成しているため、それを入力します。

リファレンスタイプ
リファレンスタイプは、ソースバージョンを特定する際に参照する対象を指定します。ブランチを指定した場合refs/heads/{ブランチ名}となります。今回はブランチ名を指定します。

Source version sample with AWS CodeBuild

ブランチ名
CodeBuildがビルド対象とするブランチを指定します。今回はdevelopブランチを指定しています。

追加設定
追加設定には「Gitクローンの深さ」「Gitサブモジュール」に関するオプションがあります。
今回はデフォルト設定にしています。Gitクローンの深さはデフォルトで1が設定されており、Gitサブモジュールのチェックは今回は外しておきます。

環境

環境イメージ
ビルドを実行するコンテナイメージを指定します。AWS CodeBuildが管理するDockerイメージを使用する場合は、マネージドイメージを選択します。指定後、OSやランタイム、イメージを指定します。

「オペレーティングシステム」には「Amazon Linux2」、「ランタイム」は「Standard」、イメージには「aws/codebuild/amazonlinux2-aarch64-standard:1.0」を指定しています。

特権付与
デフォルトではDockerコンテナはどのデバイスにもアクセスできないため、特権モードを指定することで、ビルドプロジェクトのDockerコンテナに全てのデバイスへのアクセスが許可されるようにできるようです。

特権モードにしない状態だとビルド時に下記のようなエラーが出てしまうようです。

Cannot connect to the Docker daemon at unix:/var/run/docker.sock. Is the docker daemon running?

詳細は以下のリンクを参考にしてください。
AWS CodeBuild のトラブルシューティング

サービスロール&ロール名
ロールは新規で作成するため、「新しいサービスロールを作成」にチェックし、ロール名はcodebuild-serverless-cicd-test-roleとしました。

CodeBuildプロジェクトを作成すると、下記のポリシーがアタッチされたロールが作成されます。
「CodeBuildBasePolicy-codebuild-serverless-cicd-test-ap-northeast-1」
「CodeBuildCloudWatchLogsPolicy-codebuild-serverless-cicd-test-ap-northeast-1」

環境に関する追加設定

タイムアウト
「タイムアウト」は5分から8時間の間の値を指定し、ビルドの実行時間が、ここで指定した時間を経過しても完了していないとビルドが停止されます。デフォルトは1時間で設定されています。

ビルドプロジェクトの設定の変更 (コンソール)

キュータイムアウト
タイムアウト値で指定された時間が経過しても開始されないキュー内のビルドは、キューから削除されます。デフォルトは8時間で設定されています。今回はデフォルトで設定してます。

証明書
今回は「証明書をインストールしない」を選択します。

VPC
CodeBuildは、VPC内のリソースにアクセスができないため、アクセスをできるようにするためには、追加でVPCの設定を行う必要があります。
対象のVPC、サブネット、そのVPCのセキュリティグループを選択します。
今回はVPC環境へのアクセスはないため、設定は行いません。

Use AWS CodeBuild with Amazon Virtual Private Cloud

コンピューティング
処理を行うコンピュータの性能を指定します。
今回は、ハイスペックである必要がないので「4GBメモリ、2vCPU」を選択します。

環境変数
名前と値を入力することで、ビルドによって使用される各種環境変数を指定できます。
今回は使用しません。

ファイルシステム
ファイルシステムでは、利用するEFSの情報を入力します。この設定により、ビルド処理をは関係のない処理をbuildspec.ymlと分けて管理できるそうです。

詳細は下記の記事を参考にしてください。

アップデート AWS CodeBuild で Amazon EFS のサポートがされました!

BuildSpec

Codebuildで使用するリポジトリのソースコードのルートディレクトリ配下にbuildspec.ymlというファイルを配置する必要があります。

このbuildspec.ymlにCodeBuildで実施する具体的なタスクを記述していきます。buildspec.ymlという名称と異なる場合は、「Buildspec名」のオプションにファイル名を記載します。

今回は後ほど「buildspec.yml」というファイルを作成するため、オプションは空白にします。

バッチ設定

今回はデフォルトの設定でいきます。

AWS CodeBuildユーザーガイドAPI バージョン 2016-10-06 P270

アーティファクト

今回は、ビルドによって出力アーティファクトを作成しないため、「アーティファクトなし」の設定でいきます。

Change a build project’s settings (console)

ログ

ビルドによる出力ログがCloudWatchに出力されるように指定します。
最後にビルドプロジェクトの作成を実行することで、ビルドプロジェクトが作成されます。

buildspec.ymlの作成

buildspecというファイルを作成しプロジェクトのルートディレクトリに配置し、作成したCodeCommitのserverless-cicd-testというリポジトリのdevelopブランチにpushします。

ディレクトリ構成は下記のようになっています。

.
├── buildspec.yml
├── handler.js
└── serverless.yml

buildspec.ymlには、以下の内容を記述しました。

Serverless Frameworkのインストールをおこない、デプロイを実施するコマンドを記載しています。

CodeBuildプロジェクトのビルドの実行と確認

Codebuildを実行することで、Serverless Frameworkで作成したサービスがデプロイされることを確認します。

権限不足によるエラー

実行した結果は以下のようにログに出力されます。
実行したところ、cloudformationに対する権限がなくエラーがでました。

Serverless FrameworkをCodeBuildを活用して実行する場合、ServerlessFrameworkで活用する各種サービスに対する権限を追加で設定する必要があります。

CloudFormationやLamda等、今回は権限を細かく設定するのは手間がかかることと、CodeBuildの設定方法や挙動を確認することが今回の記事の目的のため、AdministratorAccessの強いポリシーを今回はアタッチします。

本来であれば使用する最小限の権限のみを許可すると安全です。

IAMポリシーのアタッチ

「IAM>ロール>codebuild-serverless-cicd-test-role」のコンソールから、ポリシーをアタッチを選択します。

AdministratorAccessを検索して選択し、「ポリシーをアタッチ」を選択すると、ポリシーがアタッチされます。

ビルドの再実行

ビルドを再実行します。

権限付与後、ビルドの成功が確認できました。

リソースの確認

CodeBuildビルド実行後、各種リソースを確認していきます。
CloudWatchの確認

CloudFromationの確認

Lamda関数の確認

レスポンスの確認

まとめ

Serverless Frameworkを活用したプロジェクトをCodeBuildを用いて実行し、Lamda等各種サービスを作成しました。

今後はこのビルドビルドプロジェクトを用いて、developブランチへのマージをトリガーに実行されるようにしていきたいです。