目次
下記記事を参考にGitHub ActionsでEC2に自動デプロイする方法を試してみました。
ちょっと変えたので、備忘録。
前提条件
- GitHubにアカウントとリモートリポジトリがある
- EC2インスタンスにローカルリポジトリが配置されており、SSHでGitHubにpushできる状態である
- AWSアカウントを持っている
- EC2インスタンスにキーペアを使ってSSH接続できる
GitHub Actions用のシークレットの追加
自動デプロイを適用したいリポジトリのページを開き、右上の「Settings」タブをクリックします。
続いて左側のメニューから「Secrets and variables」→「Actions」を選択します。
上記の画像の「New repository secret」ボタンをクリックして、GitHub Actionsで使用するシークレットを追加することができます。
下記のSecretsをこれから一つずつ追加していきます。
- AWS_ACCESS_KEY
- AWS_SECRET_ACCESS_KEY
- USER_HOST_NAME
- EC2_SECURITY_GROUP_ID
- PRIVATE_KEY
AWS_ACCESS_KEYとAWS_SECRET_ACCESS_KEY
まずはAWSのIAMロールを作成して、アクセスキーとシークレットキーを追加します。
- AWS Management Consoleにログインし、IAMサービスを開きます
- 左側のメニューから「ユーザー」を選択し、「ユーザーの作成」ボタンをクリックします
- ユーザー名を入力し、「次へ」を選択します
- 「ポリシーを直接アタッチする」をチェック、許可ポリシーに「AmazonEC2FullAccess」にチェックし「次へ」をクリック
- 「ユーザーの作成」をクリック
- 作成したユーザーを選択し、「アクセスキーを作成」ボタンをクリックします
- コマンドラインインターフェース、確認にチェックを入れ「次へ」をクリックします
- 「アクセスキーを作成」ボタンをクリックします
- 「アクセスキーID」と「シークレットアクセスキー」をコピーします。
- 先ほどコピーした値をGitHubのSecretsに追加します。下記二つとして追加します。
- AWS_ACCESS_KEY
- AWS_SECRET_ACCESS_KEY
これでAWSのIAMロールにシークレットキーを追加できました。
USER_HOST_NAME
続いてEC2インスタンスのユーザー名とホスト名をGitHubのSecretsに追加します。
- EC2インスタンスのページを開き、インスタンスにチェックを入れ、「接続」ボタンをクリックします。
- 「SSHクライアント」タブを開き一番下の「例:」と書かれた部分のユーザー名とホスト名が一つになった部分をコピーします。
- コピーした部分を下記の名前でGitHubのSecretsに追加します。
- USER_HOST_NAME
これでEC2インスタンスのユーザー名とホスト名を追加できました。
PRIVATE_KEY
Github ActionsからEC2インスタンスにSSH接続するために、秘密鍵をGitHubのシークレットに登録する必要があります。
EC2インスタンス作成時にSSH接続のためのキーを作成してあるはずなので、そちらを使用して、EC2インスタンスにSSH接続できるようにします。
今回はpemファイルの場合を想定しています。
下記のコマンドを実行してファイルの内容をコピーします。
bash/zsh:
# {bash/zsh}
cat {ファイルパス}
```
大抵は下記に保存されていると思います。
```shell
cat ~/.ssh/{ファイル名}.pem
```
**PowerShell:**
```shell
Get-Content {ファイルパス}
```
大抵は下記に保存されていると思います。
```shell
Get-Content ~\.ssh\{ファイル名}.pem
```
コピーした部分を下記の名前でGitHubのSecretsに追加します。
- PRIVATE_KEY
### EC2_SECURITY_GROUP_ID
EC2のインスタンスのセキュリティグループIDをGitHubのSecretsに追加します。
- EC2_SECURITY_GROUP_ID
## GitHub Actionsワークフローの作成
リポジトリのルートディレクトリに `.github/workflows/ec2-deploy.yml` ファイルを作成し、以下の内容を記述します。
下記の場合は、リポジトリのmainブランチにpushされたときに実行されます。
46行目のリポジトリのファイルパスと書かれた部分は、実際のリポジトリのパスに置き換えてください。
また、このコードではdocker composeで起動することを想定していますが、必要に応じて変更してください。
```yaml
# "ec2-deploy.yml" {46}
name: Deploy to EC2
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
# IP取得ライブラリをインストール
- name: Public IP Install
id: ip
uses: haythem/public-ip@v1.3
# BranchをCheckout
- name: Checkout
uses: actions/checkout@v2
# 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
# SSH接続して、git pullする
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
動作確認
設定が完了したら、mainブランチに変更をpushして自動デプロイが正常に動作するか確認します。
git add .
git commit -m "Setup GitHub Actions auto-deploy"
git push origin main
GitHubリポジトリの「Actions」タブでワークフローの実行状況を確認できます。