docker-composeのgithubactionsによるAWSへの自動デプロイ
開発合宿でphp/nginx/postgersのコンテナからなるサービスをAWS ECRにデプロイしてAWS ECSで表示までしました
以下説明
事前準備
- 何かしらの動くdocker-composeを使用したサービス
- AWSアカウント
- githubアカウント
ECRに自動デプロイするまで
- AWS IAMでECRに対するadmin権限をもったユーザーを作りアクセスキーIDとシークレットアクセスキーを入手
- githubの自動デプロイしたいリポジトリのsecretsにAWS_ACCESS_KEY_ID・AWS_SECRET_ACCESS_KEYに設定
- AWS ECRで新しいリポジトリを作成
- ECRのリポジトリ名をgithub/secretsのAWS_ECR_REPO_NAMEに設定
- githubactionsで新しいワークフローを作る
- 実行
ワークフロー
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で表示するまで
- ECSのクラスターを作成(EC2 Linux + ネットワーキング)を選択
- EC2 インスタンスタイプは使いたい性能でお好みで(t2 micloでも動く)
- ECSのタスク定義をする(起動タイプ互換性はEC2を選択)
- コンテナの定義からコンテナを追加する(コンテナ名はdocker-composeのものに、imageはECRに上げたやつを入力)
- コンテナ起動時に環境変数が必要ならコンテナ詳細設定/環境の環境変数に設定
- コンテナの起動順序を設定したい場合はコンテナ詳細設定/スタートアップ依存順序とコンテナ詳細設定/ネットワークのリンクに設定
- 起動時に使用したいコマンドがあればコンテナ詳細設定/環境のコマンドの部分に設定
- 設定し終わったらECSのクラスターからタスク実行すると表示されます
目次