コンテンツにスキップ

EC2

EC2” の投稿: 1 件

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」を選択します。

Image from Gyazo

上記の画像の「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ロールを作成して、アクセスキーとシークレットキーを追加します。

  1. AWS Management Consoleにログインし、IAMサービスを開きます

    Image from Gyazo

  2. 左側のメニューから「ユーザー」を選択し、「ユーザーの作成」ボタンをクリックします

    Image from Gyazo

  3. ユーザー名を入力し、「次へ」を選択します

    Image from Gyazo

  4. 「ポリシーを直接アタッチする」をチェック、許可ポリシーに「AmazonEC2FullAccess」にチェックし「次へ」をクリック

    Image from Gyazo

  5. 「ユーザーの作成」をクリック

    Image from Gyazo

  6. 作成したユーザーを選択し、「アクセスキーを作成」ボタンをクリックします

    Image from Gyazo

  7. コマンドラインインターフェース、確認にチェックを入れ「次へ」をクリックします

    Image from Gyazo

  8. 「アクセスキーを作成」ボタンをクリックします

    Image from Gyazo

  9. 「アクセスキーID」と「シークレットアクセスキー」をコピーします。

    Image from Gyazo

  10. 先ほどコピーした値をGitHubのSecretsに追加します。下記二つとして追加します。

    • AWS_ACCESS_KEY
    • AWS_SECRET_ACCESS_KEY

これでAWSのIAMロールにシークレットキーを追加できました。

USER_HOST_NAME

続いてEC2インスタンスのユーザー名とホスト名をGitHubのSecretsに追加します。

  1. EC2インスタンスのページを開き、インスタンスにチェックを入れ、「接続」ボタンをクリックします。

    Image from Gyazo

  2. 「SSHクライアント」タブを開き一番下の「例:」と書かれた部分のユーザー名とホスト名が一つになった部分をコピーします。

    Image from Gyazo

  3. コピーした部分を下記の名前でGitHubのSecretsに追加します。

    • USER_HOST_NAME

これでEC2インスタンスのユーザー名とホスト名を追加できました。

PRIVATE_KEY

Github ActionsからEC2インスタンスにSSH接続するために、秘密鍵をGitHubのシークレットに登録する必要があります。

EC2インスタンス作成時にSSH接続のためのキーを作成してあるはずなので、そちらを使用して、EC2インスタンスにSSH接続できるようにします。

今回はpemファイルの場合を想定しています。

下記のコマンドを実行してファイルの内容をコピーします。

Terminal window
cat {ファイルパス}

大抵は下記に保存されていると思います。

Terminal window
cat ~/.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で起動することを想定していますが、必要に応じて変更してください。

ec2-deploy.yml
name: Deploy to EC2
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
# IP取得ライブラリをインストール
- name: Public IP Install
id: ip
uses: haythem/[email protected]
# 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して自動デプロイが正常に動作するか確認します。

Terminal window
git add .
git commit -m "Setup GitHub Actions auto-deploy"
git push origin main

GitHubリポジトリの「Actions」タブでワークフローの実行状況を確認できます。