[CI/CD]AWS CodePipeline でコードからLambdaをデプロイする仕組みを作ってみた
AWS CodePipeline でコードからLambda(コンテナイメージ)をデプロイする仕組みを作ってみた
CI/CDの仕組みを作る勉強のため、以下の記事の仕組みをベースにCodePipelineを作ってみました。
CI/CD初心者が作ったものなので、見直しの余地が多分にありますので注意ください。
構成図
作成した仕組みの構成図です。
ソース
Dockerfile
,app.py
,init.py
は以下を使わせていただきました。
buildspec.yml
version: 0.2
phases:
pre_build:
commands:
- echo Logging in to Amazon ECR...
- aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
- IMAGE_TAG=$(date "+%Y-%m%d-%H%M%S")
- echo IMAGE_TAG is $IMAGE_TAG
- docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
- docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
post_build:
commands:
- echo Build completed on `date`
- echo Pushing the Docker image...
- docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
- echo Remove latest Tag from Current Docker image...
- aws ecr batch-delete-image --repository-name ecr-tutorial --image-ids imageTag=latest
- echo Set latest Tag To New Docker image...
- MANIFEST=$(aws ecr batch-get-image --repository-name ecr-tutorial --image-ids imageTag=$IMAGE_TAG --query images[].imageManifest --output text)
- aws ecr put-image --repository-name ecr-tutorial --image-tag latest --image-manifest "$MANIFEST"
CloudFormationのテンプレートcfn-lambda.yml
はこちらをほぼそのまま(*1)流用させて頂きました。
(*1)異なるのは、以下のパラメータにデフォルト値を設定していることです。
Parameters:
EcrImageUri:
Description: ECR image URI
Type: String
Default: {{AWSアカウントID}}.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-tutorial:latest
各リソースの説明
各リソースの説明を、構成図の緑色の番号順に記載します。
リソース①:Cloud9
リソース①は、自動処理ではなくコード開発の環境になります。
Cloud9には、CodeCommit上のリモートリポジトリtest
のローカルリポジトリを配置します。リポジトリtest
にはgithubで公開したコード群を格納しています。
ローカルリポジトリtest
のコードを更新しコード開発を行います。
リソース②:CodeCommit
リソース②からCodePipelineによるCI/CDの仕組みが動きます。
リモートリポジトリtest
のmaster
ブランチにマージが発生するとCI/CDの処理が開始されます。
リソース③:S3
リソース③では、処理②の出力アーティファクトが指定のS3バケットに格納されます。
リポジトリtest
内のファイルをアーカイブしたものが出力アーティファクトとしてS3バケットに格納されます。このファイルはリソース④CodeBuild,⑥CloudFormationで使用します。
リソース④:CodeBuild
リソース④では、DockerイメージをビルドしECRに格納します。
ECRにイメージをpushした後に、latest
というタグ文字列を処理前にあったイメージCurrent Image
から外し、今回の処理でpushしたイメージNew Image
に付与します。
以下を環境変数として設定しています。
名前 | 値 | タイプ | 備考 |
---|---|---|---|
AWS_DEFAULT_REGION | ap-northeast-1 | PLAINTEXT | リージョン |
AWS_ACCOUNT_ID | 123456789012 | PLAINTEXT | AWSアカウントID |
IMAGE_REPO_NAME | ecr-tutorial | PLAINTEXT | ECRリポジトリ名 |
リソース⑤:ECR
リソース⑤は、リソース④でビルドしたDockerイメージが格納されます。
リソース⑥:CloudFormation
リソース⑥では、ECRに格納したDockerイメージとCloudFormationのテンプレートcfn-lambda.yml
を使用しLambdaをデプロイします。また、Lambdaに付与するIAMロールも作成します。
ECRの指定リポジトリのlatest
というタグが付いたDockerイメージを使用するようCloudFormationテンプレートcfn-lambda.yml
に設定しています。
リソース⑦:Lambda
リソース⑦は、デプロイしたLambdaとLambdaに付与するIAMロールです。
Lambda実行時に以下の値を指定し動作を確認します。
{"sentence":"I'm Taro Yamada."}
実行結果が以下のようになれば成功です。
リソース⑧:CodePipeline
リソース⑧の概要はこのようになります。
さいごに
概要の記載までで記事が長くなったので詳細まで記載できませんでした。
今回は、Code兄弟などのリソースを手動で作成しましたが、コード化して公開できればと思います。あと、パラメータの設定値を一か所にまとめたい。
Discussion