GitHub Actions でEC2 にデプロイするCI/CD 環境を構築する
はじめに
今回は GitHub Actions を使って EC2 インスタンスに CI/CD パイプラインを構築する方法を解説します。この記事では、コードの変更を GitHub にプッシュするだけで、自動的に EC2 インスタンスにデプロイできる環境を整えます。
EC2 インスタンスの初期設定方法については下記の記事をご確認ください。
構築する CI/CD パイプラインの概要
この記事で構築するパイプラインは次のステップで動作します:
- GitHub リポジトリに変更をプッシュ
- GitHub Actions が起動
- EC2 のセキュリティグループを一時的に開放
- SSH 接続して Git Pull とビルドを実行
- セキュリティグループを再度閉じる
IAM ユーザーの設定
まず初めに、GitHub Actions が AWS リソースにアクセスするための IAM ユーザーを作成し、アクセスキーとシークレットアクセスキーを取得します。
- AWS マネジメントコンソールから作成した IAM ユーザをクリックします。
- 「アクセスキーを作成」をクリックします。
- 用途として「コマンドラインインターフェイス(CLI)」を選択します。
- 説明タグには用途がわかりやすい名前(例:「GitHub-Actions-EC2-Deploy」)を設定します。
- 下記のような画面が表示されたら完了です。アクセスキーとシークレットアクセスキーは後で使用するのでメモしておきます。セキュリティのため .csv ファイルをダウンロードしておくことをお勧めします。
鍵の生成と登録
GitHub Actions が EC2 インスタンスに SSH 接続するための鍵ペアを作成し、適切に設定します。
鍵の生成
- まず EC2 インスタンスに接続します。
ssh -i ~/.ssh/xxx.pem ec2-user@IPアドレス
- .ssh ディレクトリに移動します。
cd ~/.ssh
- 鍵ペアを作成します。
ssh-keygen -t rsa
- すべて 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
- .ssh ディレクトリで ls コマンドを実行し、下記のファイルが表示されることを確認します。
authorized_keys id_rsa id_rsa.pub
- 公開鍵を EC2 インスタンスの ~/.ssh/authorized_keys ファイルに追加します。
- 開鍵の内容を表示します。
cat ~/.ssh/id_rsa.pub
- 表示された内容を、EC2 インスタンスの ~/.ssh/authorized_keys に追加します。既存のキーがある場合は削除せず、新しい行に追加してください。
ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx //既存のキー
ssh-rsa 00000000000000000000000000000000000000000000000 //追加するキー
GitHub への鍵の登録
生成した公開鍵を GitHub に登録します。
- EC2 インスタンス上で以下のコマンドを実行し、公開鍵の内容をコピーします。
$ cat ~/.ssh/id_rsa.pub
- GitHub のプロフィールアイコンをクリックします。
- 「Settings」 をクリックします。
- 左側メニューから「SSH and GPG keys」をクリックします。
- 「New SSH key」をクリックします。
- 以下の情報を入力します:
項目 | 値 |
---|---|
Title | ec2_auto_deploy |
Key | 公開鍵の中身 |
- 入力内容に問題がなければ「Add SSH key」をクリックします。
- 追加した SSH キーがリストに表示されれば完了です。接続が確立されると、アイコンが緑色に変化します。
GitHub リポジトリに Secrets を登録
GitHub Actions が AWS リソースにアクセスするために必要な情報を、GitHub の Secrets として登録します。
- デプロイ対象の GitHub リポジトリで「Settings」タブをクリックします。
- 左側メニューのアコーディオンから「Secrets and variables」→「Actions」をクリックします。
- 「New repository secret」ボタンをクリックします。
- 今回入力する設定項目です。
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 インスタンス上でディレクトリ構造とパーミッションを設定します。
ディレクトリ作成とパーミッション設定
- EC2 インスタンスに SSH 接続し、Web アプリケーション用のディレクトリを作成します。
sudo mkdir -p /var/www/aws-react-vite
- ディレクトリの所有者を 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 の設定変更
- Nginx の設定ファイルを編集します。
sudo vi /etc/nginx/nginx.conf
- ルートディレクトリのパスを以下のように変更します。
http {
...
server {
...
location / {
root /var/www/aws-react-vite/dist; # ビルドされたファイルのパス
index index.html;
try_files $uri $uri/ /index.html;
}
...
}
}
- 設定を変更した後、Nginx を再起動して変更を反映させます。
sudo systemctl restart nginx
Vite の設定変更
- アプリケーションのビルド先を変更するために、vite.config.ts ファイルを編集します。
build: {
outDir: '/var/www/aws-react-vite/dist'
}
これにより、ビルド時のエラーが解消され、適切なディレクトリにアプリケーションがデプロイされます。
GitHub Actions のワークフロー作成
最後に、GitHub Actions のワークフローを設定して CI/CD パイプラインを完成させます。
- ローカル環境のプロジェクトディレクトリに、GitHub Actions のワークフロー用のディレクトリを作成します。
mkdir -p .github/workflows/
- 作成したディレクトリ内に、ワークフローファイルを作成します。
touch main.yml
- 以下の内容で 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 接続を可能にし、コードをプルしてビルドした後、セキュリティグループを再度閉じて安全性を確保しています。
-
ローカル環境で変更をコミットし、GitHub リポジトリにプッシュします。
-
GitHub リポジトリの「Actions」タブで、ワークフローの実行状況を確認します。下記のように成功(緑色のチェックマーク)が表示されれば CI/CD パイプラインの構築は完了です。
- EC2 インスタンスのパブリック IP アドレスにアクセスして、アプリケーションが正しくデプロイされていることを確認します。
終わりに
この記事では、GitHub Actions を使用して EC2 インスタンスに CI/CD パイプラインを構築する方法を解説しました。主なステップは次の通りです:
- IAM ユーザーの設定
- SSH 鍵の生成と登録
- GitHub リポジトリへの Secrets の登録
- EC2 インスタンスの設定
- GitHub Actions のワークフロー作成
この CI/CD パイプラインを活用することで、コードの変更を GitHub にプッシュするだけで、自動的に EC2 インスタンスにデプロイされるようになります。
参考
『GitHub Actions の Workflow を使って AWS EC2 へのデプロイを自動化してみた』
『GitHub Actions を使って EC2 に自動デプロイ』
『GitHub と AWS EC2 を連携させた自動デプロイの設定方法』
Discussion