飽き性の頭の中
CodePipeline + ECRを使ってDockerイメージをElastic Beanstalkに自動デプロイできるようにした話【CI/CD】のサムネイル

CodePipeline + ECRを使ってDockerイメージをElastic Beanstalkに自動デプロイできるようにした話【CI/CD】

2020-01-17に公開

こんにちは、たわです。AWS で Elastic Beastalk でワークフローを整理したのでそのときのメモです。

ゴールとしては、

  • GitHub で変更をプッシュしたら
  • 自動で Docker イメージがビルドされ
  • Amazon ECR 上にプッシュされて
  • それが Elastic Beastalk 上にデプロイされる

ワークフローを作ることです。

Elastic Beastalk の環境構築

Elastic Beastalk を立ち上げます。

アプリケーションの作成

まずはコンソールからアプリケーションの作成をします。

20200116224045.jpg

20200116224119.jpg

そうすると、空のアプリケーションができあがります。

20200116224138.jpg

環境の作成

次はアプリケーションの中に環境を作成していきます。

  • development
  • staging
  • production

といったように環境ごとに作り分けるという思想なんだと思います。

  • backend
  • frontend

というように分けてもいいのかもしれません。管理しやすいようにすればよいと思います。

ウェブサーバー環境を選択

  • ウェブサーバー環境
  • ワーカー環境

がありますが、今回はウェブサーバー環境を選択します。

20200116224446.jpg

プラットフォームは Docker を選択

インスタンスの中で何を稼働させるかを選択できます。

  • Node.js
  • Go
  • Python

といったランタイムを選ぶこともできますが、今回は Docker を選択します。

20200116224517.jpg

アプリケーションコードはサンプルのまま

アプリケーションコードはサンプルがデフォルトだと思いますがそのままにします。

あとでデプロイフローは整えそのときに自分のコードが展開されるようにするのでとりあえずこれでよいです。

20200116224710.jpg

その他オプション設定はここで

  • インスタンスの数
  • セキュリティグループ
  • VPC
  • ロードバランサー

などなど設定する場合は「より多くのオプションの設定」を押して詳細設定画面に遷移しましょう。

20200116224906.jpg

数分待てば起動完了

数分待てば Elastic Beanstalk に関連する、EC2 やその他必要なものが立ち上がり準備完了となるはずです。

CodeBuild の設定

次に GitHub から自動で Docker イメージをビルドして ECR にプッシュする流れを設定する必要があります。

CodePipeline でデプロイまでのフローを設定する前に必要です。

ここの詳細に関しては別記事で紹介しているのでそちらを参照してください。今回は当記事との差分だけ紹介します。

https://blog.tawa.me/entry/push-docker-image-to-ecr-by-codebuild
https://blog.tawa.me/entry/push-docker-image-to-ecr-by-codebuild

buildspec.ymlを修正

CodePipeline では後続のタスクに情報を引き継ぐことができます。

なので、CodeBuild の設定ファイル(buildspec.yml)を修正して、ビルド後にデプロイに必要な情報を引き継げるようにします。

元々のbuildspec.yml

上記記事でも紹介している設定ファイルはこんな感じです。

version: 0.2

phases:
  install:
    runtime-versions:
      docker: 18
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)
      - AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)
      - REPOSITORY_URI=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_REPO_NAME}
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - IMAGE_TAG=${COMMIT_HASH:=latest}
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - echo $IMAGE_REPO_NAME:$IMAGE_TAG
      - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG -f $DOCKERFILE .
      - echo docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$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 to $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG ...
      - DOCKER_URL=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
      - docker push $DOCKER_URL

Elastic Beastalk ではDockerrun.aws.jsonが必要

Elastic Beanstalk の設定ファイルはDockerrun.aws.jsonとなります。