【GitHub・CodePipeline・CodeBuild】Lambda関数のCI/CD構築
はじめに
今回は、GitHub・CodePipeline・CodeBuildを使用して、Lambdaの自動デプロイを実装していきます。この時にLambdaのバージョンも同時に更新さるようにします。
また、複数のLambdaのソースを管理していきたいので、一つのリポジトリにフォルダ(関数名)ごとに分けて管理していきます。
Lambda関数はGo言語で作成します。Go言語の細かいデプロイ方法の説明は、ここでは省きます。
やりたいこと
- ソース管理はGitHub
- 一つのリポジトリにLambda関数ごとにフォルダ分け
- Lambda関数ごとにCodePipeline作成
- mainブランチで更新されたLambda関数のみCI/CDの実行
- Lambda関数はGo言語で作成される
- Lambda関数が更新されたらバージョンを自動で更新
構成図はこんな感じです。
GitHubはこんな感じです。
前提
- GitHubアカウントを持っている
- リポジトリが作成されている
構築の流れ
- Lambda関数作成
- buildspec.ymlの編集
- AWS Connector for GitHub を経由したCodeConnectionsによる接続
- CodePipelineの作成
- CodeBuildの作成
1.Lambda関数作成
では初めていきます。
まずは、Lambda関数の作成です。今回はGo言語を使うので、ランタイムをAmazon Linux 2023にする必要があります。
ソースはデフォルトのままでOKです。
2.buildspec.ymlの編集
buildspec.ymlは、CodeBuildの設定をするファイルです。
リポジトリ内に置いておく必要があり、buildspec.ymlのパスをCodeBuildの作成をする際に指定する必要があります。
lambda-test1
の箇所は作成したlambda関数の名前に変えてください。
version: 0.2
phases:
install:
runtime-versions:
golang: 1.24
pre_build:
commands:
- cd $CODEBUILD_SRC_DIR/lambda-test1
- echo "Running go mod tidy..."
- go mod tidy
build:
commands:
- GOOS=linux GOARCH=amd64 go build -o bootstrap init.go
artifacts:
base-directory: '$CODEBUILD_SRC_DIR/lambda-test1'
files:
- bootstrap
補足
pre_build部分
commands:
- cd $CODEBUILD_SRC_DIR/関数名
- echo "Running go mod tidy..."
- go mod tidy
- 関数のソースコードがあるディレクトリへ移動(関数名はディレクトリ名に置き換え)。
-
$CODEBUILD_SRC_DIR
はCodeBuild側で用意している環境変数です。CodeBuild がビルドに使用するディレクトリパスを自動で反映します。 - (参考:https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-env-ref-env-vars.html)
-
artifacts部分
artifacts:
base-directory: '$CODEBUILD_SRC_DIR/lambda-test1'
files:
- bootstrap
- 成果物(アーティファクト)として bootstrapを保存。
3.AWS Connector for GitHub を経由したCodeConnectionsによる接続
AWSとGitHubを連携するために、CodeConnections接続を作成し、AWS Connector for GitHubを使ってAWSアカウントとGitHubリポジトリを接続します。
CodeConnections接続の作成
Code Pipelineコンソールの設定 > 接続からリソースを作成します。
プロバイダーと任意の接続名を入力します。
今回はGitHubを選択しています。
プロバイダーと任意の接続名を入力します。
今回はGitHubを選択しています。
GitHubアカウントを選択する画面がでてきたら、接続したいGitHubアカウントを選択しましょう。
「新しいアプリをインストール」するをクリックしてGitHubアカウントにAWS Connector for GitHubをインストールしていきます。既に接続がある場合は虫眼鏡ボタンから既存の接続を選ぶことも可能です。
今回は「新しいアプリをインストール」をクリックします。
次に、インストールするアカウントを選択します。
(既にAWS Connector for GitHub の設定がある場合はConfigure と表示されるようです)
インストールする権限がないアカウントを選択した場合、管理者に申請が送られるようですので、管理者に確認しましょう。
GitHubのアカウント設定画面から権限設定等ができます。
接続が完了すると、ステータスが利用可能となった接続設定の画面に移動します。
CodeConnections 接続の設定はこれで完了です。
4・5.CodePipeline,CodeBuildの作成
CodePipeline内でCodeBuildを使用するには、CodePipelineの作成の中でCodeBuildを作成する必要があります。(ソースプロバイダをCodePipelineにする)
CodePipelineの設定①
「パイプラインを作成する」をクリックして作成していきます。
「カスタムパイプラインを構築する」を選択。
パイプライン名を入力します。
サービスロールは、今回は「新しいサービスロール」を選択します。
アーティファクトストアを「カスタムロケーション」にすることで、指定のS3へアーティファクトを書き出すことができます。今回は、デフォルトでいきます。
ソースプロバイダーに「GitHub (GitHub アプリ経由)」を選択しましょう。
そうすると接続に先ほどCodeConnectionsで作成したものが出てくるはずです。
「リポジトリ名」は連携したGitHub内の該当のリポジトリを選択します。
「デフォルトブランチ」はmainに設定します。
フォルダ別にトリガーを分けない場合は、「ウェブフックイベント」の設定はなしで大丈夫なのですが、今回は、分けたいので設定していきます。
「ファイルパス」で分けたいパスを指定していきます。/**
をつけることで、該当のパス以下すべてを対象にします。
CodeBuildの設定
次にビルドステージでCodeBuildの設定をしていきます。
プロバイダーを構築するを「その他のビルドプロバイダー」を選択して、「CodeBuild」を選択します。
次に「プロジェクトを作成する」を選択すると別ウィンドウが立ち上がり、CodeBuildの設定ができます。
プロジェクト名を選択します。
ほとんどデフォルトのままでOKですが、「Buildspec」の箇所はディレクトリを分けてbuildspec.ymlを配置するので、変更しましょう。
「CodePipeline に進む」をクリックすると先ほどのCodepipelineの設定画面に戻ります。
戻ると作成したCodeBuildの名前が入力されていますので、そのまま次にいきましょう。
テストステージはスキップします。
CodePipelineの設定②
デプロイプロバイダーを「Lambda」に設定します。
関数名は事前に作成していた関数を選択します。
エイリアスは今回使用しないので、スキップします。
一連の設定は完了しましたので、Pipelineを作成しましょう。
完了すると自動でPipelineが走ります。
成功していますね。
Lambda更新され、自動でバージョン作成もしてくれます。
これで一連の流れができました!
お疲れ様です。
おわりに
Lambda関数を更新するだけのCI/CDであれば、CodePipelineからLambda関数を調節指定できるようになったので、とても便利ですね。
Python等ビルドの必要がないLambda関数であれば、buildspec.ymlも必要なくなります。
Discussion