GitHub ActionsでpushされたらEC2に自動デプロイする
下記記事を参考にGitHub ActionsでEC2に自動デプロイする方法を試してみました。
https://qiita.com/kaino5454/items/bae4bca47e6f409e072f
ちょっと変えたので、備忘録。
前提条件
- 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ファイルの場合を想定しています。
下記のコマンドを実行してファイルの内容をコピーします。
cat {ファイルパス}
大抵は下記に保存されていると思います。
cat ~/.ssh/{ファイル名}.pem
Get-Content {ファイルパス}
大抵は下記に保存されていると思います。
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で起動することを想定していますが、必要に応じて変更してください。
name: Deploy to EC2
on: push: branches: - main
jobs: build: runs-on: ubuntu-latest steps:
# IP取得ライブラリをインストール - name: Public IP Install id: ip
# 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」タブでワークフローの実行状況を確認できます。