こんにちは、たわです。AWS で Elastic Beastalk でワークフローを整理したのでそのときのメモです。
ゴールとしては、
- GitHub で変更をプッシュしたら
- 自動で Docker イメージがビルドされ
- Amazon ECR 上にプッシュされて
- それが Elastic Beastalk 上にデプロイされる
ワークフローを作ることです。
Elastic Beastalk の環境構築
Elastic Beastalk を立ち上げます。
アプリケーションの作成
まずはコンソールからアプリケーションの作成をします。
そうすると、空のアプリケーションができあがります。
環境の作成
次はアプリケーションの中に環境を作成していきます。
- development
- staging
- production
といったように環境ごとに作り分けるという思想なんだと思います。
- backend
- frontend
というように分けてもいいのかもしれません。管理しやすいようにすればよいと思います。
ウェブサーバー環境を選択
- ウェブサーバー環境
- ワーカー環境
がありますが、今回はウェブサーバー環境を選択します。
プラットフォームは Docker を選択
インスタンスの中で何を稼働させるかを選択できます。
- Node.js
- Go
- Python
といったランタイムを選ぶこともできますが、今回は Docker を選択します。
アプリケーションコードはサンプルのまま
アプリケーションコードはサンプルがデフォルトだと思いますがそのままにします。
あとでデプロイフローは整えそのときに自分のコードが展開されるようにするのでとりあえずこれでよいです。
その他オプション設定はここで
- インスタンスの数
- セキュリティグループ
- VPC
- ロードバランサー
などなど設定する場合は「より多くのオプションの設定」を押して詳細設定画面に遷移しましょう。
数分待てば起動完了
数分待てば Elastic Beanstalk に関連する、EC2 やその他必要なものが立ち上がり準備完了となるはずです。
CodeBuild の設定
次に GitHub から自動で Docker イメージをビルドして ECR にプッシュする流れを設定する必要があります。
CodePipeline でデプロイまでのフローを設定する前に必要です。
ここの詳細に関しては別記事で紹介しているのでそちらを参照してください。今回は当記事との差分だけ紹介します。
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
となります。