GitHubとAWS EC2を連携させた自動デプロイの設定方法

# 1. はじめに
ソフトウェアの開発やプロジェクトの進行において、スムーズなデプロイプロセスは不可欠です。特に、自動化されたデプロイは、時間と手間を節約し、エラーのリスクを軽減するために重要です。

本記事では、デプロイしたいサーバーからGitHubのリポジトリにSSH接続を設定し、GitHub Actionsを利用して自動デプロイを行う方法について解説します。この手法を使えば、コードの変更や更新があった場合に、手動でデプロイする手間を省き、自動的に最新のバージョンをデプロイできるようになります。



# 2. githubとAWS EC2の接続設定
まず、デプロイしたいサーバーからGithubのリポジトリにSSH接続できるように設定します。今回の例では、デプロイサーバーはAWS EC2です。
以下を前提として話を進めます。
・EC2へはすでにローカルからSSH接続可能な状態である。[参考](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html)
・Githubアカウントが作成済みである。[参考](https://qiita.com/ayatokura/items/9eabb7ae20752e6dc79d)
・Githubでレポジトリが作成済みである。[参考](https://qiita.com/ucan-lab/items/d594404d0d2c64a85a38)
## 2.1 gitのインストール
EC2に接続後、gitをインストールします。
```shell:gitのインストール
$ sudo yum install -y  git-all
```
## 2.2 認証鍵の生成
SSH接続用の認証鍵を生成するため、以下のコマンドを実行します。
```console:認証鍵の作成
$ cd ~/.ssh/
$ ssh-keygen-t rsa
Enter file in which to save the key (): github_key
Enter passphrase (empty for no passphrase): [Enter]
Enter same passphrase again: [Enter]
```
するとデプロイサーバー内に、~/.ssh/github_keyと~/.ssh/github_key.pubが生成されます。
github_keyが秘密鍵、github_key.pubが公開鍵です。

## 2.3 githubリポジトリのkeysとして公開鍵の登録
以下のコマンドを用い、公開鍵をコピーしておきます。
```shell
$ cat ~/.ssh/github_key.pub
```
Deploy keys の登録をするため、ブラウザでGitHubを開きます。
以下の画像の手順に従い鍵の登録を行う画面へ遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648527/969c9146-bf8e-72dd-6013-7f91f79a3ad2.png)
[引用元](https://codelikes.com/github-ssh-connection/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648527/45189c04-5a97-122d-611d-adfe3a00203d.png)
[引用元](https://codelikes.com/github-ssh-connection/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648527/1a074817-a008-3eb1-45c5-7b0a7c94cba3.png)
[引用元](https://codelikes.com/github-ssh-connection/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648527/c00cfbaf-2e8c-97e7-9ac6-5630829da66a.png)
[引用元](https://codelikes.com/github-ssh-connection/)

どのような認証を行うかざっくり説明すると以下の通りです。
1. EC2は秘密鍵を使って署名を生成し、サーバーに送る。
2. githubは公開鍵を使って署名が正しいか検証する。

秘密鍵の所有者しか正しい署名が作れないことを利用し、署名の正しさを公開鍵で検証してもらうことで、確かに所有者であることを確認してもらいます。

## 2.4 リポジトリにSSH接続する
使用するリポジトリを開き、下記のようにSSH接続するためのコードをコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648527/faa17bd8-8207-3e0c-38f6-7727d5675265.png)
[引用元](https://codelikes.com/github-ssh-connection/)

EC2から以下のgit cloneコマンドを使用してソースコードをクローンします。
```shell:clone
git clone git@github.com:[ユーザ名]/[リポジトリ名].git 
```

お疲れ様です！これでデプロイサーバーのEC2からgithubにSSH接続し、リポジトリのcloneやpushができるようになりました😃

# 3. github actionsを活用した自動デプロイ
次に、GitHub Actionsという機能を利用して自動デプロイを設定します。GitHub Actionsは、特定のイベントやスケジュールに基づいて自動的にタスクを実行するためのワークフローを作成するための強力なツールです。

## 3.1 必要な情報をSecretsに登録
GitHubには、各リポジトリごとに暗号化された変数として登録できる機能であるSecretsが存在します。この機能を利用することで、パスワードやサーバーのアクセス情報など、GitHubのリポジトリ上でコードの一部として管理できない情報を隠した状態で管理し、GitHub Actionsで使用することができます。今回はこのアクションを利用するために、必要な情報を事前に変数として登録しておきます。

ブラウザでGitHubのリポジトリを開き、Settings メニューから Secrets の登録画面を開きます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648527/873fda74-24e3-3bcc-2656-fae13bbe42d6.png)
[参考](https://hsmtweb.com/tool-service/github-actions.html)


後で作成するワークフローファイルで、${{ secrets.[登録したSecretsの名前] }} という記述を使用することで、指定した値を呼び出すことができます。

以下は登録する内容の一覧です。

|Name（任意のわかりやすいものでOK）|記載する内容|例|
|:----|:----|:----|
|USER_NAME|デプロイサーバーログインのusername|ec2-user（サーバー情報を確認してください）|
|HOST_NAME|サーバーのホスト|ec2-54-178-72-250.ap-northeast-1.compute.amazonaws.com（サーバー情報を確認してください）|
|PRIVATE_KEY|デプロイサーバーへSSH接続するための秘密鍵。※ 先ほどサーバー上で生成したものではありません|デプロイサーバーへのSSH接続で利用しているものです。

例えば、上記で登録した SERVER_USERNAME の値を利用したい場合は、${{ secrets.SERVER_USERNAME }} という記述を使用することでその値を呼び出すことができます。

## 3.2 Workflow(ymlファイル)の作成 
リポジトリ内のActionsメニューに移動すると、ワークフローが作成されていない状態では、通常は以下のような画面が表示されます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648527/65670600-eb8b-da73-8676-50a1429873ea.png)
[参考](https://hsmtweb.com/tool-service/github-actions.html)
画面をスクロールすると、利用しているサービスやパッケージに合わせたワークフローのテンプレートが表示されます。

今回は、非常に簡単なワークフローを作成するだけなので、「Suggested」という表示が出ている一番上の枠内にある「Set up this workflow」というボタンをクリックして、ワークフローのベースを取得しましょう。

GitHub上のエディタには、デフォルトのワークフローが記載されたYAML形式のファイルが表示されます。
ファイル名を変更することもできますが、そのままでも構いません。今回は、"deploy.yml"というファイル名に変更しておきましょう。

まず、「Start Commit」というボタンをクリックして、ファイルをリポジトリに追加します。「deploy.yml」ファイルが、[リポジトリ名]/.github/workflows/ のディレクトリ内に作成されました。

以下のように、ファイルの内容を変更しましょう！


```
# Workflowの名前。任意に設定可能
name: EC2 auto deploy

# アクションが実行されるタイミングを設定。今回はmainブランチにpushされた時。
on:
 push:
   branches:
     - main
 
#実行される処理
jobs:
 build:
   # 実行環境の指定
   runs-on: ubuntu-latest
   steps:

     # デプロイする
     - name: Deploy
       run: |
         # SSH接続して、git pullする
         echo "${{ secrets.PRIVATE_KEY }}" > private_key
         chmod 600 private_key
         ssh -oStrictHostKeyChecking=no ${{ secrets.USER_NAME }}@${{ secrets.HOST_NAME }} -i private_key "cd [リポジトリのディレクトリ] && git fetch github:shuncask/kanpai.git && git pull github:shuncask/kanpai.git"
         
```
ローカルの端末からリポジトリに変更を加えてmainブランチにpushしてみましょう。Workflow が正しく動作したかどうかは、GitHub リポジトリの Actions メニューから確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648527/fa709a02-d33c-0ee8-54c4-96318530f992.png)
[参考](https://hsmtweb.com/tool-service/github-actions.html)

緑のチェックが付いていれば成功です！これで自動的にデプロイできるようになりました！

# 4. 終わりに
本記事では、デプロイしたいサーバーからGitHubのリポジトリにSSH接続し、GitHub Actionsを利用して自動デプロイを設定する方法について詳しく解説しました。ぜひ、この記事で紹介した手順を参考にして、自動デプロイを導入してみてください!

# 参考

https://hsmtweb.com/tool-service/github-actions.html

https://codelikes.com/github-ssh-connection/

https://zenn.dev/luvmini511/articles/0e471affdcba52

https://qiita.com/angel_p_57/items/19eda15576b3dceb7608#%E5%85%AC%E9%96%8B%E9%8D%B5%E8%AA%8D%E8%A8%BC%E3%81%AE%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8