コンテンツにスキップ

AWS

AWS” の投稿: 2 件

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」タブでワークフローの実行状況を確認できます。

CloudflareのサブドメインをAWSのRoute53に登録する

CloudflareのドメインをAWSのRoute53にサブドメインとして登録してみたので、備忘録を残します。

この方法を使えば、Cloudflareで管理しているドメインの一部をAWSのサービスで利用できるようになります。

前提条件

  • Cloudflareで管理しているドメイン(例: example.com)
  • AWSアカウント

まず、CloudflareでサブドメインのDNS委任を行うための準備をします。

この例では、aws.example.comというサブドメインをRoute53に委任する想定で進めます。

Route53でホストゾーンを作成する

CloudflareのドメインをRoute53に委任するためには、まずRoute53でホストゾーンを作成する必要があります。

  1. AWSマネジメントコンソールにログインします

    Image from Gyazo

  2. 左上のアイコンから「ネットワーキングとコンテンツ配信」>> 「Route53」をクリックします。

    Image from Gyazo

  3. 左上のメニューアイコンから「ホストゾーン」を選択肢、「ホストゾーンの作成」ボタンをクリックします。

    Image from Gyazo

  4. ドメイン名に委任したいサブドメイン(例: aws.example.com)を入力、「パブリックホストゾーン」を選択して「ホストゾーンの作成」ボタンをクリックします。

    Image from Gyazo

ホストゾーンが作成されると、自動的に4つのNSレコード(ネームサーバー)が生成されます。これらのNSレコードの値をメモしておきます。

例えば以下のようなものです:

ns-1234.awsdns-12.org
ns-567.awsdns-34.com
ns-890.awsdns-56.net
ns-1234.awsdns-78.co.uk

CloudflareでNSレコードを設定する

次に、CloudflareのDNS設定画面で、Route53のネームサーバーを指定したNSレコードを追加します。

  1. Cloudflareのダッシュボードにログインし、対象のドメイン(example.com)を選択します。

    Image from Gyazo

  2. 左側メニューの「DNS」タブをクリックし、「レコード」セクションに移動します。

    Image from Gyazo

  3. 「レコードの追加」をクリックします

    Image from Gyazo

  4. タイプに「NS」を選択し、「名前」欄にサブドメイン名(例: aws)、ネームサーバーにRoute53で取得したNSレコード(例: ns-1234.awsdns-78.co.uk)を入力し「保存」ボタンをクリックします。

    Image from Gyazo

  5. Route53で取得したNSレコードは4つあるので、全てで手順4を行います。

DNSの伝播を待つ

DNS設定の変更が反映されるまでには時間がかかることがあります。

通常は数分から数時間程度で反映されますが、最大で48時間かかる場合もあります。

設定の確認

DNSの設定が反映されたかどうかを確認するには、以下のコマンドを使用できます:

Terminal window
dig NS aws.example.com

正しく設定されていれば、Route53のネームサーバーが返ってくるはずです。

例えば出力の一部に以下のような値が得られます:

;; ANSWER SECTION:
aws.example.com. 3600 IN NS ns-1234.awsdns-12.org.
aws.example.com. 3600 IN NS ns-567.awsdns-34.com.
aws.example.com. 3600 IN NS ns-890.awsdns-56.net.
aws.example.com. 3600 IN NS ns-1234.awsdns-78.co.uk.

これで、aws.example.comのDNS管理はRoute53に委任されました。

Route53のホストゾーンで、このサブドメインに対して必要なDNSレコード(A、CNAME、MXなど)を追加できます。