完成したコード deploy.yml

name: Auto Deploy to style-log.com (Docker Compose)

on:
  push:
    branches:
      - main  # mainブランチでのみ実行

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      # 1. GitHubのリポジトリをチェックアウト
      - name: Checkout code
        uses: actions/checkout@v3

      # 2. SSH鍵を設定
      - name: Setup SSH
        uses: webfactory/[email protected]
        with:
          ssh-private-key: ${{ secrets.DEPLOY_KEY }}

      # 3. SSH Configを作成
      - name: Setup SSH Config
        run: |
          mkdir -p ~/.ssh
          echo "Host bastion" >> ~/.ssh/config
          echo "  HostName ${{ secrets.BASTION_HOST }}" >> ~/.ssh/config
          echo "  User ${{ secrets.DEPLOY_USER }}" >> ~/.ssh/config
          echo "Host private1" >> ~/.ssh/config
          echo "  HostName ${{ secrets.PRIVATE_HOST }}" >> ~/.ssh/config
          echo "  User ${{ secrets.DEPLOY_USER }}" >> ~/.ssh/config
          echo "  ProxyJump bastion" >> ~/.ssh/config
          chmod 600 ~/.ssh/config
          cat ~/.ssh/config

      # 4. Bastionへの接続テスト
      - name: Test SSH Connection to Bastion
        run: ssh -o StrictHostKeyChecking=no bastion "echo 'Bastion OK'"

      # 5. Private EC2への接続テスト
      - name: Test SSH Connection to Private EC2
        run: ssh -o StrictHostKeyChecking=no private1 "echo 'Private1 OK'"

      # 6. デプロイ処理
      - name: Deploy via Bastion
        run: |
          ssh -o StrictHostKeyChecking=no private1 << 'EOF'
            set -e
            echo ">>> Move to project directory"
            cd /home/ec2-user/closet-search

            echo ">>> Ensure remote URL is HTTPS"
            git remote set-url origin <https://github.com/summer-hackathon-c/closet-search.git>

            echo ">>> Fetching latest code from main branch"
            git fetch --all
            git reset --hard origin/main

            echo ">>> Building and restarting Docker containers"
            docker compose down
            docker compose up --build -d

            echo ">>> Deployment completed!"
          EOF

ローカルのssh接続の流れを参考に記載 ~/.ssh/config

Host bastion
  HostName 52.199.76.21
  User ec2-user
  IdentityFile ~/.ssh/closet-search.pem

Host private1
  HostName 10.0.133.38
  User ec2-user
  IdentityFile ~/.ssh/closet-search.pem
  ProxyJump bastion

EC2接続テストをそれぞれ実施

# 4. Bastionへの接続テスト
      - name: Test SSH Connection to Bastion
        run: ssh -o StrictHostKeyChecking=no bastion "echo 'Bastion OK'"

      # 5. Private EC2への接続テスト
      - name: Test SSH Connection to Private EC2
        run: ssh -o StrictHostKeyChecking=no private1 "echo 'Private1 OK'"

EC2内のURLをHTTPS URL に変更

git remote set-url origin <https://github.com/summer-hackathon-c/closet-search.git>


dockerでプロジェクト起動

docker compose down docker compose up --build -d

追記 以下のファイルを本番と開発で分けた。 (理由:本番環境のwebサーバーをgunicornにしたかったから)

<aside> 💡

docker-compose.yml Dockerfile requirements

</aside>

ex mainブランチ用 docker-compose.prod.yml(gunicorn 用)

mainブランチ以外用 docker-compose.dev.yml(runserver 用)

GitHub Actions の再実行手順(Re-run all jobs)

目的 同じ内容でもう一度 CI/CD(GitHub Actions)で実行したい

🔁 手順

  1. 対象の リポジトリページ を開く 例:https://github.com/あなたのユーザー名/リポジトリ名
  2. 上部メニューから「Actions」をクリック
  3. 一覧から再実行したいコミットのワークフローを探す (例:Deploy や CI, Run tests など)
  4. 対象の実行履歴をクリック
  5. 右上にあるボタン「⚙️ Re-run jobs」または「🔁 Re-run all jobs」をクリック

**AWS Systems Manager (Session Manager)**導入後

deploy.yml

name: Auto Deploy to style-log.com (Docker Compose via SSM)

on:
  push:
    branches: [ main ]
  workflow_dispatch:

jobs:
  deploy:
    runs-on: ubuntu-latest
    env:
      AWS_REGION: ${{ secrets.AWS_REGION }}
      DEPLOY_USER: ${{ secrets.DEPLOY_USER }}

    steps:
      # 0) ソース取得
      - name: Checkout code
        uses: actions/checkout@v4

      # 1) AWS 認証(Secrets のキーを使用)
      - name: Configure AWS credentials (Access Keys)
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ env.AWS_REGION }}

      # 1.5) 認証の疎通確認
      - name: Verify AWS identity
        run: aws sts get-caller-identity

      # 2) Session Manager Plugin をランナーにインストール
      - name: Install Session Manager Plugin
        run: |
          set -e
          curl -sL "<https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_64bit/session-manager-plugin.deb>" -o /tmp/ssm-plugin.deb
          sudo dpkg -i /tmp/ssm-plugin.deb
          session-manager-plugin --version

      # 3) SSH 秘密鍵をAgentへ登録(DEPLOY_KEY)
      - name: Setup SSH key (ssh-agent)
        uses: webfactory/[email protected]
        with:
          ssh-private-key: ${{ secrets.DEPLOY_KEY }}

      # 4) SSH config(SSM用:ssh-agentの鍵を自動利用)
      - name: Setup SSH Config for SSM
        run: |
          mkdir -p ~/.ssh
          chmod 700 ~/.ssh
          cat > ~/.ssh/config << EOF
          Host private1-ssm
            HostName i-06038da6332891790
            User $DEPLOY_USER
            ProxyCommand /bin/sh -lc 'aws ssm start-session --region $AWS_REGION --target %h --document-name AWS-StartSSHSession --parameters "portNumber=%p"'

          Host private2-ssm
            HostName i-0442d66d290cc9f1c
            User $DEPLOY_USER
            ProxyCommand /bin/sh -lc 'aws ssm start-session --region $AWS_REGION --target %h --document-name AWS-StartSSHSession --parameters "portNumber=%p"'
          EOF
          chmod 600 ~/.ssh/config
          # known_hosts チェック省略(本番で厳格化するなら管理してください)
          printf "Host *\n  StrictHostKeyChecking no\n  UserKnownHostsFile /dev/null\n" >> ~/.ssh/config
          # 解釈確認(デバッグ用)
          ssh -G private1-ssm | grep -E '^(hostname|proxycommand)' || true

      # 5) SSM 経由の接続テスト
      - name: Test SSH via SSM - private1
        run: ssh -o ConnectTimeout=20 private1-ssm "echo 'Private1 via SSM OK'"

      - name: Test SSH via SSM - private2
        run: ssh -o ConnectTimeout=20 private2-ssm "echo 'Private2 via SSM OK'"

      # 6) デプロイ(Docker Compose)
      - name: Deploy to Private1 (via SSM)
        run: |
          ssh private1-ssm << EOF
            set -e
            cd /home/$DEPLOY_USER/closet-search
            git remote set-url origin <https://github.com/summer-hackathon-c/closet-search.git>
            git fetch --all
            git reset --hard origin/main
            docker compose -f docker-compose.prod.yml down
            docker compose -f docker-compose.prod.yml up --build -d
            echo ">>> Deployment to private1 completed!"
          EOF

      - name: Deploy to Private2 (via SSM)
        run: |
          ssh private2-ssm << EOF
            set -e
            cd /home/$DEPLOY_USER/closet-search
            git remote set-url origin <https://github.com/summer-hackathon-c/closet-search.git>
            git fetch --all
            git reset --hard origin/main
            docker compose -f docker-compose.prod.yml down
            docker compose -f docker-compose.prod.yml up --build -d
            echo ">>> Deployment to private2 completed!"
          EOF