docker-composeのgithubactionsによるAWSへの自動デプロイ

GitHub

AWS

Docker

Laravel

PostgreSQL

開発合宿でphp/nginx/postgersのコンテナからなるサービスをAWS ECRにデプロイしてAWS ECSで表示までしました

以下説明

事前準備

  1. 何かしらの動くdocker-composeを使用したサービス
  2. AWSアカウント
  3. githubアカウント

ECRに自動デプロイするまで

  1. AWS IAMでECRに対するadmin権限をもったユーザーを作りアクセスキーIDとシークレットアクセスキーを入手
  2. githubの自動デプロイしたいリポジトリのsecretsにAWS_ACCESS_KEY_ID・AWS_SECRET_ACCESS_KEYに設定
  3. AWS ECRで新しいリポジトリを作成
  4. ECRのリポジトリ名をgithub/secretsのAWS_ECR_REPO_NAMEに設定
  5. githubactionsで新しいワークフローを作る
  6. 実行

ワークフロー

name: ECR Push on: workflow_dispatch: 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: "ap-northeast-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.yaml 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.yaml push
on: workflow_dispatch:

にすると手動でしかgithubactionsが動かないので注意

docker-compose.prod.yaml

version: "3.8" volumes: php-fpm-socket: services: laravel: image: ${ECR_REGISTRY}/${ECR_REPOSITORY}:laravel_${IMAGE_TAG} container_name: laravel volumes: - php-fpm-socket:/var/run/php-fpm - ./backend:/workspace/backend nginx: image: ${ECR_REGISTRY}/${ECR_REPOSITORY}:nginx_${IMAGE_TAG} container_name: nginx ports: - 80:80 volumes: - php-fpm-socket:/var/run/php-fpm - ./backend:/workspace/backend postgres: image: ${ECR_REGISTRY}/${ECR_REPOSITORY}:postgres_${IMAGE_TAG} container_name: postgres volumes: - ./docker/infra/postgres/initdb:/docker-entrypoint-initdb.d ports: - 5432:5432 environment: - POSTGRES_DATABASE=postgres - POSTGRES_USER=postgres - POSTGRES_PASSWORD=password - POSTGRES_ROOT_PASSWORD=root

servicesのimageに設定した場所と名前でECRに保存されます

ECSで表示するまで

  1. ECSのクラスターを作成(EC2 Linux + ネットワーキング)を選択
  2. EC2 インスタンスタイプは使いたい性能でお好みで(t2 micloでも動く)
  3. ECSのタスク定義をする(起動タイプ互換性はEC2を選択)
  4. コンテナの定義からコンテナを追加する(コンテナ名はdocker-composeのものに、imageはECRに上げたやつを入力)
  5. コンテナ起動時に環境変数が必要ならコンテナ詳細設定/環境の環境変数に設定
  6. コンテナの起動順序を設定したい場合はコンテナ詳細設定/スタートアップ依存順序とコンテナ詳細設定/ネットワークのリンクに設定
  7. 起動時に使用したいコマンドがあればコンテナ詳細設定/環境のコマンドの部分に設定
  8. 設定し終わったらECSのクラスターからタスク実行すると表示されます

@shikimeguru

目次