GitHub Actionsを使ってEC2に自動デプロイ環境を構築する
はじめに
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ファイル)を作成します。
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
を実行します。
- 私の場合、/var/wwwにアプリケーションをgit cloneしているので、まずディレクトリを変更し、そこで
実際にやってみる
- テキストファイルを追加でもなんでもいいので、リポジトリに変更を加え、pushし、プルリクエストをセルフマージしてみます。
- リポジトリのactionsに移動すると行われたjobが確認できるかと思います。
- 緑のチェックマークが付くと成功です。実際にEC2にSSH接続し確認してみましょう。自動でgit pullが行われ変更が反映されているかと思います。
終わりに
初めての技術記事ということで分かりづらい箇所もたくさんあったかと思いますが、最後までご覧いただきありがとうございました!
これからも学んだことをマイペースにアウトプットしていけたらと思います。
Discussion