🚃

GitHub Actions でEC2 にデプロイするCI/CD 環境を構築する

に公開

はじめに

今回は GitHub Actions を使って EC2 インスタンスに CI/CD パイプラインを構築する方法を解説します。この記事では、コードの変更を GitHub にプッシュするだけで、自動的に EC2 インスタンスにデプロイできる環境を整えます。

EC2 インスタンスの初期設定方法については下記の記事をご確認ください。

https://zenn.dev/jisou/articles/5f90cfa51986c8

構築する CI/CD パイプラインの概要

この記事で構築するパイプラインは次のステップで動作します:

  1. GitHub リポジトリに変更をプッシュ
  2. GitHub Actions が起動
  3. EC2 のセキュリティグループを一時的に開放
  4. SSH 接続して Git Pull とビルドを実行
  5. セキュリティグループを再度閉じる

IAM ユーザーの設定

まず初めに、GitHub Actions が AWS リソースにアクセスするための IAM ユーザーを作成し、アクセスキーとシークレットアクセスキーを取得します。

  1. AWS マネジメントコンソールから作成した IAM ユーザをクリックします。

  1. 「アクセスキーを作成」をクリックします。

  1. 用途として「コマンドラインインターフェイス(CLI)」を選択します。

  1. 説明タグには用途がわかりやすい名前(例:「GitHub-Actions-EC2-Deploy」)を設定します。

  1. 下記のような画面が表示されたら完了です。アクセスキーとシークレットアクセスキーは後で使用するのでメモしておきます。セキュリティのため .csv ファイルをダウンロードしておくことをお勧めします。

鍵の生成と登録

GitHub Actions が EC2 インスタンスに SSH 接続するための鍵ペアを作成し、適切に設定します。

鍵の生成

  1. まず EC2 インスタンスに接続します。
ssh -i ~/.ssh/xxx.pem ec2-user@IPアドレス
  1. .ssh ディレクトリに移動します。
cd ~/.ssh
  1. 鍵ペアを作成します。
ssh-keygen -t rsa
  1. すべて Enter キーを押すと、id_rsa(秘密鍵)と id_rsa.pub(公開鍵)が生成されます。
Enter file in which to save the key ():  // Enter
Enter passphrase (empty for no passphrase):  // Enter
Enter same passphrase again:  // Enter
  1. .ssh ディレクトリで ls コマンドを実行し、下記のファイルが表示されることを確認します。
authorized_keys  id_rsa  id_rsa.pub
  1. 公開鍵を EC2 インスタンスの ~/.ssh/authorized_keys ファイルに追加します。
  • 開鍵の内容を表示します。
cat ~/.ssh/id_rsa.pub
  • 表示された内容を、EC2 インスタンスの ~/.ssh/authorized_keys に追加します。既存のキーがある場合は削除せず、新しい行に追加してください。
ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx //既存のキー

ssh-rsa 00000000000000000000000000000000000000000000000 //追加するキー

GitHub への鍵の登録

生成した公開鍵を GitHub に登録します。

  1. EC2 インスタンス上で以下のコマンドを実行し、公開鍵の内容をコピーします。
$ cat ~/.ssh/id_rsa.pub
  1. GitHub のプロフィールアイコンをクリックします。

  1. 「Settings」 をクリックします。

  1. 左側メニューから「SSH and GPG keys」をクリックします。

  1. 「New SSH key」をクリックします。

  1. 以下の情報を入力します:
項目
Title ec2_auto_deploy
Key 公開鍵の中身

  1. 入力内容に問題がなければ「Add SSH key」をクリックします。

  1. 追加した SSH キーがリストに表示されれば完了です。接続が確立されると、アイコンが緑色に変化します。

GitHub リポジトリに Secrets を登録

GitHub Actions が AWS リソースにアクセスするために必要な情報を、GitHub の Secrets として登録します。

  1. デプロイ対象の GitHub リポジトリで「Settings」タブをクリックします。

  1. 左側メニューのアコーディオンから「Secrets and variables」→「Actions」をクリックします。

  1. 「New repository secret」ボタンをクリックします。

  1. 今回入力する設定項目です。
Name Secret
AWS_ACCESS_KEY 作成した IAM ユーザーのアクセスキーー IAM で取得したアクセスキー
AWS_SECRET_ACCESS_KEY 作成した IAM ユーザーのシークレットアクセスキー IAM で取得したシークレットアクセスキー
EC2_SECURITY_GROUP_ID EC2 にアタッチされているセキュリティグループの ID sg-xxxxxxxx
EC2_HOST EC2 の IP アドレス パブリック IP など
SSH_PRIVATE_KEY 秘密鍵 生成した秘密鍵の id_rsa の中身
EC2_USER サーバーログインの username ec2-user

全ての Secrets が登録されていることを確認します。これらの値は、後で作成する GitHub Actions のワークフローから参照されます。

EC2 インスタンスの設定

CI/CD パイプラインでビルドしたアプリケーションを適切に配置するために、EC2 インスタンス上でディレクトリ構造とパーミッションを設定します。

ディレクトリ作成とパーミッション設定

  1. EC2 インスタンスに SSH 接続し、Web アプリケーション用のディレクトリを作成します。
 sudo mkdir -p /var/www/aws-react-vite
  1. ディレクトリの所有者を ec2-user に変更し、適切なアクセス権を付与します。
sudo chown -R ec2-user:ec2-user /var/www/aws-react-vite
sudo chmod -R 755 /var/www/aws-react-vite

これにより、ec2-user に読み書き実行権限が付与され、その他のユーザーには読み実行権限が付与されます。

Nginx の設定変更

  1. Nginx の設定ファイルを編集します。
sudo vi /etc/nginx/nginx.conf
  1. ルートディレクトリのパスを以下のように変更します。
http {
    ...
    server {
        ...
        location / {
            root /var/www/aws-react-vite/dist;  # ビルドされたファイルのパス
            index index.html;
            try_files $uri $uri/ /index.html;
        }
    ...
    }
}
  1. 設定を変更した後、Nginx を再起動して変更を反映させます。
sudo systemctl restart nginx

Vite の設定変更

  1. アプリケーションのビルド先を変更するために、vite.config.ts ファイルを編集します。
  build: {
    outDir: '/var/www/aws-react-vite/dist'
  }

これにより、ビルド時のエラーが解消され、適切なディレクトリにアプリケーションがデプロイされます。

GitHub Actions のワークフロー作成

最後に、GitHub Actions のワークフローを設定して CI/CD パイプラインを完成させます。

  1. ローカル環境のプロジェクトディレクトリに、GitHub Actions のワークフロー用のディレクトリを作成します。
mkdir -p .github/workflows/
  1. 作成したディレクトリ内に、ワークフローファイルを作成します。
touch main.yml
  1. 以下の内容で main.yml ファイルを編集します。
name: EC2 auto deploy
on:
push:
branches: - main
workflow_dispatch:

jobs:
deploy:
runs-on: ubuntu-latest
steps:

      # BranchをCheckout
      - name: Checkout code
        uses: actions/Checkout@v4

      # IP取得ライブラリをインストール
      - name: Public IP Install
        id: ip
        uses: haythem/public-ip@v1.3

      # AWS CLIをインストールする
      - 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

      # AWS CLIにキーを設定をする
      - 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
          echo "${{ secrets.PRIVATE_KEY }}" > private_key
          chmod 600 private_key

          # SSH接続して、git pullとgit buildする
          ssh -oStrictHostKeyChecking=no ${{ secrets.USER_NAME }}@${{ secrets.HOST_NAME }} -i private_key "cd /home/ec2-user/aws-react-vite && git fetch --prune && git checkout main && git pull origin main && npm install && npm run 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

  • ワークフローの説明:
    • on セクションでは、main ブランチへのプッシュ時または手動実行時にワークフローを起動するよう設定しています。
    • steps では、コードのチェックアウト、GitHub Actions ランナーのパブリック IP 取得、AWS CLI のインストールと設定を行い、最後にデプロイを実行します。
    • デプロイ手順では、セキュリティグループを一時的に開放して SSH 接続を可能にし、コードをプルしてビルドした後、セキュリティグループを再度閉じて安全性を確保しています。
  1. ローカル環境で変更をコミットし、GitHub リポジトリにプッシュします。

  2. GitHub リポジトリの「Actions」タブで、ワークフローの実行状況を確認します。下記のように成功(緑色のチェックマーク)が表示されれば CI/CD パイプラインの構築は完了です。

  1. EC2 インスタンスのパブリック IP アドレスにアクセスして、アプリケーションが正しくデプロイされていることを確認します。

終わりに

この記事では、GitHub Actions を使用して EC2 インスタンスに CI/CD パイプラインを構築する方法を解説しました。主なステップは次の通りです:

  1. IAM ユーザーの設定
  2. SSH 鍵の生成と登録
  3. GitHub リポジトリへの Secrets の登録
  4. EC2 インスタンスの設定
  5. GitHub Actions のワークフロー作成

この CI/CD パイプラインを活用することで、コードの変更を GitHub にプッシュするだけで、自動的に EC2 インスタンスにデプロイされるようになります。

参考

『GitHub Actions の Workflow を使って AWS EC2 へのデプロイを自動化してみた』
https://www.next.inc/articles/2024/auto-deploy-with-github-actions-workflow.html

『GitHub Actions を使って EC2 に自動デプロイ』
https://qiita.com/kaino5454/items/bae4bca47e6f409e072f

『GitHub と AWS EC2 を連携させた自動デプロイの設定方法』
https://qiita.com/shuncask/items/db41ec7cc4d4f23b1a28

GitHubで編集を提案
JISOU | 経験者専門プログラミングコーチング

Discussion