MENU
オンライン講座開催中

GitHub ActionsでAWS EC2に自動デプロイする方法【入門②】

GitHub ActionsでAWS EC2に自動デプロイする方法【入門②】
目次

小学生でもわかる!GitHub ActionsでEC2自動デプロイの仕組み

むずかしい話の前に、全体の仕組みをかんたんに説明します。

あなたは作家です。原稿を書いたら、出版社(GitHub)に送ります。出版社にはロボット社員(GitHub Actions)がいて、原稿が届いた瞬間に自動で本屋さん(EC2サーバー)に並べてくれます。

あなたがやることは「原稿を送るだけ」。あとは全部ロボットがやってくれます。

自分のPC → push → GitHub → GitHub Actions起動 → EC2に自動デプロイ
 ↓
ユーザーがサイトを見られる!

この記事でやること

  • GitHub Actionsのワークフローファイルを作成する
  • GitHubにEC2接続用のシークレットを登録する
  • pushしたらEC2に自動デプロイされる仕組みを完成させる

前提条件

  • GitHubとEC2がSSH接続済みであること(前回の記事参照)
  • EC2の `/var/www/html/` 以下にデプロイ用ディレクトリを作成済み

STEP1|EC2のデプロイ先ディレクトリを作成する

EC2にSSHで接続して、デプロイ先のディレクトリを作成します。

sudo mkdir /var/www/html/charakatsu-deploy
sudo chown ec2-user:ec2-user /var/www/html/charakatsu-deploy

確認します。

ls -la /var/www/html

ec2-user 権限でディレクトリが作成されていればOKです。

STEP2|GitHubにシークレットを登録する

GitHub ActionsからEC2に接続するために必要な情報を、GitHubのシークレットに登録します。

シークレットとは暗号化された環境変数のことです。パスワードや秘密鍵など、コードに直接書きたくない情報を安全に保管できます。

GitHubのリポジトリ → Settings → Secrets and variables → Actions → 「New repository secret」から以下の3つを登録します。

  • EC2_SSH_KEY:EC2の秘密鍵(~/.ssh/id_ed25519 の中身)
  • EC2_HOST:EC2のパブリックIPアドレス
  • EC2_USER:EC2のユーザー名(Amazon Linux 2023の場合は ec2-user

EC2の秘密鍵は以下のコマンドで表示できます。

cat ~/.ssh/id_ed25519

-----BEGIN OPENSSH PRIVATE KEY----- から -----END OPENSSH PRIVATE KEY----- まで全部コピーして登録してください。

EC2のパブリックIPはAWSコンソール → EC2 → インスタンスの詳細から確認できます。

STEP3|EC2のauthorized_keysに公開鍵を登録する

GitHub ActionsからSSH接続を受け入れるために、EC2の authorized_keys に公開鍵を追加します。

cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

STEP4|EC2のセキュリティグループにSSHルールを追加する

GitHubのサーバーからEC2にSSH接続できるように、セキュリティグループのインバウンドルールにSSH(ポート22)を追加します。

AWSコンソール → EC2 → セキュリティグループ → インバウンドルールを編集 → 「ルールを追加」

  • タイプ:SSH
  • ソース:0.0.0.0/0
  • 説明:GitHub Actions

STEP5|GitHub Actionsのワークフローファイルを作成する

EC2上でワークフローファイルを作成します。

cd ~/charakatsu-deploy
mkdir -p .github/workflows
nano .github/workflows/deploy.yml

以下の内容を貼り付けます。

name: Deploy to EC2

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup SSH
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.EC2_SSH_KEY }}" > ~/.ssh/id_ed25519
          chmod 600 ~/.ssh/id_ed25519
          ssh-keyscan -H ${{ secrets.EC2_HOST }} >> ~/.ssh/known_hosts

      - name: Deploy
        run: |
          ssh ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} "cd /var/www/html/charakatsu-deploy && git pull origin main"

Ctrl + O → Enter → Ctrl + X で保存します。

STEP6|デプロイ先にgitリポジトリを初期化する

デプロイ先ディレクトリにGitHubのリポジトリをクローンします。

cd /var/www/html/charakatsu-deploy
git clone git@github.com:あなたのユーザー名/リポジトリ名.git .

STEP7|GitHubにpushして動作確認する

cd ~/charakatsu-deploy
git add .
git commit -m "Add GitHub Actions deploy workflow"
git push origin main

GitHubのActionsタブを開いて、緑のチェックマーク(Success)が表示されれば自動デプロイ完成です!

よくあるエラーと解決方法

実際にやってみると、いくつかハマりやすいポイントがあります。同じエラーが出たときの参考にしてください。

① sudo git clone するとPermission deniedになる

fatal: could not create work tree dir: Permission denied

sudo をつけてgit cloneするとrootユーザーのSSH鍵を使おうとするため、認証が通りません。sudo なしで実行してください。

# NG
sudo git clone git@github.com:...

# OK
git clone git@github.com:...

② dial tcp ***:22: i/o timeout

GitHub ActionsからEC2へのSSH接続がタイムアウトするエラーです。原因は2つ考えられます。

  • EC2_HOSTにプライベートIPを設定している:AWSコンソールでパブリックIPを確認して登録し直してください
  • セキュリティグループのSSHルールがない:インバウンドルールにSSH(ポート22)を追加してください

③ ssh: unable to authenticate

ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey]

SSH鍵の認証が通らないエラーです。以下を確認してください。

  • EC2_SSH_KEYに秘密鍵を-----BEGIN OPENSSH PRIVATE KEY-----から-----END OPENSSH PRIVATE KEY-----まで丸ごとコピーして登録しているか
  • EC2の~/.ssh/authorized_keysに公開鍵を追加しているか(以下のコマンドで追加できます)
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

④ fatal: not a git repository

fatal: not a git repository (or any of the parent directories): .git

デプロイ先ディレクトリにgitリポジトリが存在しないエラーです。事前にgit cloneが必要です。

cd /var/www/html/your-deploy-dir
git clone git@github.com:あなたのユーザー名/リポジトリ名.git .

まとめ

  • EC2のデプロイ先ディレクトリを作成
  • GitHubにシークレット(SSH鍵・IP・ユーザー名)を登録
  • authorized_keysに公開鍵を追加
  • セキュリティグループにSSHルールを追加
  • GitHub Actionsワークフローファイルを作成
  • pushしたら自動でEC2にデプロイされる仕組みが完成!

次回はこの仕組みを使って、実際のファイルを自動デプロイする応用編を解説します。

STEP8|テストpushで動作確認する

最後に、実際にpushして自動デプロイが動くか確認しましょう。

EC2のターミナルでテスト用ファイルを作ってpushします。

cd ~/charakatsu-deploy
echo "test" > test.txt
git add .
git commit -m "Test auto deploy"
git push origin main

pushが完了したらGitHubのリポジトリ → 「Actions」タブを開いてください。

一番上のワークフローが緑のチェックマーク(Success)になっていれば自動デプロイ完成です!🎉

これで次回からはpushするだけでEC2に自動反映される環境が整いました。

目次