GitHub ActionsでpushされたらEC2に自動デプロイする

公開日:
更新日:
目次

GitHub のリポジトリにpushしたら、AWSの EC2 インスタンスにあるアプリを自動でデプロイしたい人向けの記事です。SSHキー管理・GitHub Secrets・YAMLワークフローの全体像と、デプロイ時にだけセキュリティグループを一時開放する安全パターンまでを解説します[1]docker compose で動くアプリを想定していますが、サービス再起動の部分を変えれば他構成でも応用可能です。

前提条件

セットアップを始める前に、以下が揃っているか確認してください。

  • GitHubアカウントとリモートリポジトリ
  • EC2インスタンスにローカルリポジトリが配置済み(SSHでGitHubにpullできる状態)
  • AWSアカウント
  • EC2インスタンスにキーペア(pemファイル)でSSH接続できる状態

全体の流れ

3ステップで実装します。

  • GitHub Secrets に必要な認証情報を5つ登録
  • ワークフローYAMLを .github/workflows/ec2-deploy.yml に配置
  • mainブランチにpushして動作確認

GitHub Actions用のシークレットを追加する

リポジトリの「Settings」→「Secrets and variables」→「Actions」を開きます。

Image from Gyazo

「New repository secret」から以下5つを順に登録します。

  • AWS_ACCESS_KEY / AWS_SECRET_ACCESS_KEY(IAMユーザーのキー)
  • USER_HOST_NAME(EC2の [email protected] 形式)
  • PRIVATE_KEY(pemファイルの中身)
  • EC2_SECURITY_GROUP_ID(EC2が属するセキュリティグループID)

順に取得していきます。

IAMユーザーを作ってアクセスキーを取得する

GitHub Actions から AWS CLI を叩くために、専用の IAM ユーザーを作成します。AWS Management Console にログインし、IAMサービスを開きます。

Image from Gyazo

左メニュー「ユーザー」→「ユーザーの作成」をクリック。

Image from Gyazo

ユーザー名を入力して「次へ」。

Image from Gyazo

「ポリシーを直接アタッチする」を選び、許可ポリシーに AmazonEC2FullAccess をチェックして「次へ」。

Image from Gyazo

「ユーザーの作成」を完了したら、作成したユーザー詳細画面で「アクセスキーを作成」をクリック。

Image from Gyazo

「コマンドラインインターフェース」を選び、確認チェックを入れて「次へ」。

Image from Gyazo

「アクセスキーを作成」を押して「アクセスキーID」と「シークレットアクセスキー」をコピーします。

Image from Gyazo

これらを GitHub Secrets の AWS_ACCESS_KEYAWS_SECRET_ACCESS_KEY として登録します。

EC2のユーザー名・ホスト名を取得する

EC2インスタンス画面でインスタンスを選択し「接続」ボタン。

Image from Gyazo

「SSHクライアント」タブの「例:」と書かれた部分の [email protected] 形式の文字列をコピー。

Image from Gyazo

これを USER_HOST_NAME として登録します。

秘密鍵(PRIVATE_KEY)を登録する

GitHub Actions から EC2 にSSH接続するため、pemファイルの 中身 を Secrets に登録します。

bash/zsh の場合:

cat ~/.ssh/{ファイル名}.pem

PowerShell の場合:

Get-Content ~\.ssh\{ファイル名}.pem

-----BEGIN RSA PRIVATE KEY----- から -----END RSA PRIVATE KEY----- までをまるごとコピーして、PRIVATE_KEY として登録します。

セキュリティグループID(EC2_SECURITY_GROUP_ID)を取得する

EC2 → セキュリティグループ から、対象EC2が属するセキュリティグループのIDをコピーして EC2_SECURITY_GROUP_ID として登録します。

GitHub Actionsワークフローを作成する

リポジトリのルートに .github/workflows/ec2-deploy.yml を作成します。

このワークフローのポイントは デプロイ時だけ一時的にSSHポートを開放し、終わったら閉じる という動的なセキュリティグループ操作です[2]。常時22番ポートを開けないので、攻撃面を最小化できます。

name: Deploy to EC2

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Public IP Install
        id: ip
        uses: haythem/public-[email protected]

      - name: Checkout
        uses: actions/checkout@v2

      - name: AWS CLI install
        run: |
          curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
          unzip awscliv2.zip
          sudo ./aws/install --update
          aws --version

      - name: AWS set Credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-1

      - name: Deploy
        run: |
          # SSHのセキュリティグループを一時的に開放
          aws ec2 authorize-security-group-ingress --group-id ${{ secrets.EC2_SECURITY_GROUP_ID }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32
          # SSH接続して git pull → docker compose 再ビルド
          echo "${{ secrets.PRIVATE_KEY }}" > private_key
          chmod 600 private_key
          ssh -oStrictHostKeyChecking=no ${{ secrets.USER_HOST_NAME }} -i private_key "cd リポジトリのファイルパス && git fetch --prune && git checkout main && git pull origin main && sudo docker compose down && sudo docker system prune --all --force && sudo docker compose up -d --build"
          # SSHのセキュリティグループを閉じる
          aws ec2 revoke-security-group-ingress --group-id ${{ secrets.EC2_SECURITY_GROUP_ID }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32

リポジトリのファイルパス の部分は EC2 上のリポジトリの絶対パスに置き換えます。docker compose で起動していない場合は、最後の SSH コマンドのサービス再起動部分を環境に合わせて変更してください(pm2 reloadsystemctl restart など)。

動作確認

mainブランチにpushして、GitHubリポジトリの「Actions」タブでワークフローの実行状況を確認します。

git add .
git commit -m "Setup GitHub Actions auto-deploy"
git push origin main

ジョブがすべて緑になり、EC2側で docker ps を確認して新しいコンテナが立ち上がっていれば成功です。

まとめ

GitHub ActionsからEC2へのデプロイは「Secrets 5つ + ワークフローYAML」で実装できます。SSHポートを常時開けず、デプロイ時だけ動的に開放→閉じる 形にしておくと安全性が高まります。docker compose 以外の構成でも、最後のSSH先のコマンドを環境に合わせれば応用可能です。

参考文献

脚注
  1. Configuring OpenID Connect in AWS - GitHub Docs (2026-05-10 アクセス) ↩︎

  2. authorize-security-group-ingress - AWS CLI Reference (2026-05-10 アクセス) ↩︎