目次
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」を開きます。
「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サービスを開きます。

左メニュー「ユーザー」→「ユーザーの作成」をクリック。
ユーザー名を入力して「次へ」。
「ポリシーを直接アタッチする」を選び、許可ポリシーに AmazonEC2FullAccess をチェックして「次へ」。
「ユーザーの作成」を完了したら、作成したユーザー詳細画面で「アクセスキーを作成」をクリック。
「コマンドラインインターフェース」を選び、確認チェックを入れて「次へ」。
「アクセスキーを作成」を押して「アクセスキーID」と「シークレットアクセスキー」をコピーします。
これらを GitHub Secrets の AWS_ACCESS_KEY と AWS_SECRET_ACCESS_KEY として登録します。
EC2のユーザー名・ホスト名を取得する
EC2インスタンス画面でインスタンスを選択し「接続」ボタン。
「SSHクライアント」タブの「例:」と書かれた部分の [email protected] 形式の文字列をコピー。
これを 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 reload、systemctl 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先のコマンドを環境に合わせれば応用可能です。
参考文献
Configuring OpenID Connect in AWS - GitHub Docs (2026-05-10 アクセス) ↩︎
authorize-security-group-ingress - AWS CLI Reference (2026-05-10 アクセス) ↩︎









