CircleCIでECSにデプロイ
3000番ポートでwebサーバーを立てる
リポジトリのルートに配置する
code:Dockerfile.prod
FROM golang:1.14.4-alpine3.12 as build
WORKDIR /app
RUN apk update --no-cache \
&& apk add --no-cache git
COPY go.* .
RUN go mod download
COPY . .
RUN GOOS=linux GOARCH=amd64 go build -o app main.go
FROM alpine:3.12 as prod
WORKDIR /app
RUN apk update --no-cache \
&& apk add --no-cache ca-certificates
RUN update-ca-certificates
COPY --from=build /app/app ./
EXPOSE 3000
必要な環境変数
table:envs
AWS_ACCOUNT_ID awsのアカウントID
AWS_ACCESS_KEY_ID 適切なIAMロールを付与したユーザーのアクセスキー
AWS_SECRET_ACCESS_KEY 適切なIAMロールを付与したユーザーのシークレットキー
AWS_REGION ECSサービスが配置されているリージョン
ECR_REPOSITORY ECRのリポジトリ名
ECS_CLUSTER ECSのクラスター名
ECS_SERVICE ECSのサービス名
IAMロール
手順
dockerイメージには$CIRCLE_SHA1タグを付けてpushする
production環境にはlatestタグの方が良いと思う
注意
環境変数AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEYはaws ecr get-loginコマンドで自動で読み込まれるので、名前は変えないほうが良い
code:circle.yml
version: 2.1
jobs:
build:
...
deploy:
docker:
- image: circleci/python:3.7.1
working_directory: ~/repo
steps:
- checkout
# enable to use docker in CircleCI
- setup_remote_docker
# install awscli (ecs-deploy dependency)
- run: sudo pip install awscli
# install jq (ecs-deploy dependency)
- run: sudo apt-get install jq -y
# install ecs-deploy
- run: sudo chmod +x /usr/bin/ecs-deploy
# get credentials from ECR
- run: eval $(aws ecr get-login --region $AWS_REGION --no-include-email)
- run:
name: build docker image
command: |
docker build \
--rm \
-f ./Dockerfile \
-t $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$ECR_REPOSITORY:$CIRCLE_SHA1 \
.
# push docker image to ECR
- run: docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$ECR_REPOSITORY:$CIRCLE_SHA1
- run:
name: deploy to ecs
command: |
ecs-deploy \
--aws-access-key $AWS_ACCESS_KEY_ID \
--aws-secret-key $AWS_SECRET_ACCESS_KEY \
--region $AWS_REGION \
--cluster $ECS_CLUSTER \
--service-name $ECS_SERVICE \
--image $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$ECR_REPOSITORY:$CIRCLE_SHA1 \
--timeout 120
dbのmigrationなどを実行するためにrun-taskする場合は以下のように記述する code:./task.json
{
"containerOverrides": [
{
"name": "<container name>",
}
]
}
code:circleci/config.yml
aws ecs run-task \
--region $AWS_REGION \
--cluster $ECS_CLUSTER \
--launch-type FARGATE \
--task-definition $ECS_TASK \
--overrides file://task.json \
--network-configuration "awsvpcConfiguration={subnets=$ECS_TASK_SUBNETS,securityGroups=$ECS_TASK_SECURITYGROUPS,assignPublicIp=ENABLED}"