前置き
Docker-Composeで環境を作っているのでそのままそれを使ってpushできると楽だと思った。
いろいろ調べたがあまりまとまっているものがなかったので書いた。
前提条件
- Mac
- AWSアカウントがある。
- Docker Desktop環境がある
- AWS CLI環境がある
手順
- IAMユーザを作る。以下の権限をユーザorグループにつけておく。
- Administrator Access
- AmazonECS_FullAccess
AWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYを控えておく。
- Amazon ECS用のcontextを作る。
以下のコマンドを実行
$ docker context create ecs [contextname]
? Create a Docker context using
と聞かれるのでAWS secret and token credetials
を選択
AWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYを入力。
$ docker context list
で追加できたか確認できる。`$ docker context use [context name]で選択できる。現在はdefaultにしておく。
- AWSコンソールでECRのプライベートリポジトリを作る。一つのDocker Imageにつき一つ作成する。
uriをコピーしておく
- レジストリに対してDockerクライアントを認証する。AWSコンソール上のプッシュコマンドの表示をクリックして1つめのコマンドをコピーして実行する。
- yamlのimageをそれぞれECRのリポジトリパスに修正
version: "3"
services:
backend:
image: リポジトリパス # ここ
build:
context: .
dockerfile: ./backend/Dockerfile
container_name: backend
tty: true
ports:
- 8000:8000
volumes:
- .:/app
- node_modules:/app/frontend/node_modules
frontend:
image: リポジトリパス #ここ
build:
context: .
dockerfile: ./frontend/Dockerfile
container_name: frontend
tty: true
env_file: .env.development
ports:
- 3000:3000
volumes:
- .:/app
- node_modules:/app/frontend/node_modules
depends_on:
- backend
volumes:
node_modules:
-
$docker-compose push
でdocker imageをECRにプッシュ -
$docker context use [context name]
でcontextをECSのものに切り替える。 -
$docker compose up
でECSデプロイ完了。コンソール上で確認できるはず。 - githubのSecretsに
AWS_ACCESS_KEY_ID
とAWS_SECRET_ACCESS_KEY
とAWS_ECR_REPO_NAME
を登録 - 以下のymlファイルをActionに登録してpushしておしまい!!!
ecs.yaml
name: ECR Push
on:
push:
jobs:
ecr-push:
runs-on: ubuntu-latest
name: ECR Push
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: "us-east-1"
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Build, to Amazon ECR
run: |
docker-compose -f docker-compose.prod.yml build
- name: push image to Amazon ECR
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
ECR_REPOSITORY: ${{ secrets.AWS_ECR_REPO_NAME }}
IMAGE_TAG: latest
run: |
docker-compose -f docker-compose.prod.yml push
エラーハンドリング
- docker-compose pushで以下のエラーが出たらimageのtagが設定できていない。
$ docker-compose -f docker-compose.ecs.yaml push
An image does not exist locally with the tag: 785741758597.dkr.ecr.us-east-1.amazonaws.com/kanji-visualization/frontend