🐕

GitHub Actionsを使ってEC2に自動デプロイ環境を構築する

2023/12/30に公開

はじめに

Github Actoinsを使ってEC2インスタンスに自動デプロイ環境を構築します。
構成図は以下の通りです。

mainブランチのPull RequestのmergeをトリガーにGtiHub Actionsのワークフローを実行させ、EC2インスタンスにSSH接続し、git pull orign mainを実行し変更内容を自動的に反映させます。

前提

  • SSH接続ができるGitがインストールされたEC2インスタンスがあること
  • GitHubリポジトリがあること

1. 公開鍵と秘密鍵の作成

GitHubに登録するための鍵を作成します
ローカルマシンで以下のコマンドを実行します。

ssh-keygen -t rsa -b 4096 -C "example@example.com" -N ""

このコマンドにより公開鍵と秘密鍵が作成されます。
example@example.comは適宜書き換えてください
-N "" でパスフレーズのない鍵を作成することができます。
ワークフロー実行中に

ssh: this private key is passphrase protected

というエラーに遭遇したためパスフレーズなしの鍵でこのエラーを回避することができます。

2. 公開鍵をGitHubに登録する

# .sshディレクトに移動
cd ~/.ssh

# 公開鍵のファイルを開いて内容をコピーする
vi id_rsa.pub

コピーした内容をGithubのsettings->SSH and GPG keys->New SSH Keysに貼り付けます。
Titleは分かりやす名前にしておくのが無難です。

ターミナルで以下コマンドを入力し、ユーザーネームが表示されたら成功です。

ssh -T git@github.com                                      
Hi username! You've successfully authenticated, but GitHub does not provide shell access.

3. 必要な情報をGitHub リポジトリに登録する

# .sshディレクトリで秘密鍵のファイルを開いて内容をコピーする
vi id_rsa

使用するGitHubリポジトリのSetting->Secrets and variables->New repository secretから秘密鍵、EC2のホスト情報、EC2のユーザー情報を登録します。

変数名 内容
EC2_SSH_KEY 手順1で作成した秘密鍵
EC2_HOST_NAME EC2インスタンスのホスト名
EC2_USER_NAME EC2インスタンスのユーザー名

秘密鍵の内容は-----BEGIN OPENSSH PRIVATE KEY----------END OPENSSH PRIVATE KEY-----も含むので注意です!

4. EC2に公開鍵を登録する

# EC2インスタンスにSSH接続
ssh -i 

# sshディレクトリに移動
cd ~/ssh

# 手順1で作成した公開鍵を貼り付ける
vi authorized_keys

5. Workflowファイルの作成

リポジトリのルートに.github/workflowsディレクトリを作成し、その中にワークフローファイル(ymlファイル)を作成します。

auto_deploy.yml
name: Deploy to EC2

on:
  pull_request:
    branches:
      - main
    types: [closed]

jobs:
  deployment:
    if: github.event.pull_request.merged == true
    runs-on: ubuntu-latest

    steps:
    - name: Checkout repository
      uses: actions/checkout@v2

    - name: Deploy to EC2
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.EC2_HOST_NAME }}
        username: ${{ secrets.EC2_USER_NAME }}
        key: ${{ secrets.EC2_SSH_KEY }}
        script: |
          cd /var/www
          git pull origin main

on

on:
  pull_request:
    branches:
      - main
    types: [closed]

mainブランチへのpull requestがcloseされたタイミングでjobを実行するようにしています。

jobs

if

github.event.pull_request.mergedによりプルリクエストがマージされた時のみ実行するようにしています。

runs-on

ワークフローが実行される環境(ランナー)を最新バージョンのubuntuに設定します。

Steps

  • uses: actions/checkout@v2によりリポジトリのチェックアウトします。
  • appleboy/ssh-action@masterと手順3でリポジトリに登録した情報を使って、EC2インスタンスにSSH接続します。
  • scriptにSSH接続して実際に行うコマンドを記述
    • 私の場合、/var/wwwにアプリケーションをgit cloneしているので、まずディレクトリを変更し、そこでgit pullを実行します。

実際にやってみる

  1. テキストファイルを追加でもなんでもいいので、リポジトリに変更を加え、pushし、プルリクエストをセルフマージしてみます。
  2. リポジトリのactionsに移動すると行われたjobが確認できるかと思います。
  3. 緑のチェックマークが付くと成功です。実際にEC2にSSH接続し確認してみましょう。自動でgit pullが行われ変更が反映されているかと思います。

終わりに

初めての技術記事ということで分かりづらい箇所もたくさんあったかと思いますが、最後までご覧いただきありがとうございました!
これからも学んだことをマイペースにアウトプットしていけたらと思います。

Discussion