🌌

[CI/CD]AWS CodePipeline でコードからLambdaをデプロイする仕組みを作ってみた

2022/10/16に公開

AWS CodePipeline でコードからLambda(コンテナイメージ)をデプロイする仕組みを作ってみた

CI/CDの仕組みを作る勉強のため、以下の記事の仕組みをベースにCodePipelineを作ってみました。

https://zenn.dev/445/articles/29aff4c8ce2e01

CI/CD初心者が作ったものなので、見直しの余地が多分にありますので注意ください。

構成図

作成した仕組みの構成図です。

ソース

Dockerfile,app.py,init.pyは以下を使わせていただきました。

https://github.com/yoshiko-tsuka/ecr-tutorial

buildspec.yml

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)流用させて頂きました。

https://dev.classmethod.jp/articles/deploy-container-image-lambda-function-with-cloudformation/

(*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の仕組みが動きます。

リモートリポジトリtestmasterブランチにマージが発生すると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