GitHub ActionでEC2にデプロイするまで(WindowsServer編)

## 背景と実施したこと
GitHub Actionを仕事で初めて使いました。
最終的に実現したかったことはソースをGitHubにpushした際に自動でEC2（今回はWindowServer）にデプロイする、という動きです。

その際に調べたこと試したことを備忘的に残しておきます。
これから始めてGitHub Actionを使う人の助けになれば幸いです。
ちなみにですが、WindowsServer編と銘打っているもののLinux系とGitHub Actionsの処理はほとんど変わりません。

参考にした記事
[GitHub ActionsでEC2に自動デプロイ環境を構築する方法](https://note.com/ryoppei/n/nf2bf7ee78b0b)
[Github Actionsの使い方メモ](https://qiita.com/HeRo/items/935d5e268208d411ab5a)
[Github Actionsって何？](https://zenn.dev/hashito/articles/7c292f966c0b59)
[OpenSSH キーの管理](https://docs.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_keymanagement)
[SSH接続先の情報をssh configに記載する](https://qiita.com/miriwo/items/976d21e9a42fd3b01d08)
[sshキー(秘密鍵・公開鍵)の作成と認証　流れ](https://qiita.com/soma_sekimoto/items/35845495bc565c38ae9d)

## 概要
+ 実現したことを絵にすると以下のようなイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/ff11286e-eeb2-9d1c-699a-222a3cae736c.png)

+ なんか難しいように感じるかもしれませんが、サーバ側でGitHubからpullする動きをSSH接続で実現するだけです。
+ GitHub ActionからSSHでEC2につなぎにいくため接続元IPは固定ではなく、つなぎ方に少し工夫が必要です。


## 前提
+ クライアントPCからEC2までSSH接続できていること（秘密鍵の認証でもパスワード認証でもOK）
+ EC2からGitHubにつないでソースをPullできること
+ AWS CLIを使うためのキーがあること
※WindowsServerの場合はデフォルト設定のままではSSH接続できるようになっていないので要注意です。

## GitHub Actionを実際に使ってみる。
GitHub Actionを使用するには、まず対象のリポジトリを選んで「Action」のタブに遷移します。
そうすると以下のようにいくつかテンプレートが出てきます。
（ymlで処理を記述するのがルール）

適当なものを選びcommitすると
\.github\workflows
のパスにファイルができます。（もちろん自前で0から作ってもOK）

pullしてローカルの開発環境で実際にコードを書いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/c3359372-ec6b-6db3-620d-eedaf97d6ccf.png)

以下はただechoするだけのサンプルですが、pushしてみると起動することが確認できます。

※文法の細かい解説はここでは触れません。
　公式ドキュメント以外では以下が参考になりました。
[Github Actionsの使い方メモ](https://qiita.com/HeRo/items/935d5e268208d411ab5a)
[Github Actionsって何？](https://zenn.dev/hashito/articles/7c292f966c0b59)

```yml
name: Deploy to Amazon

on:
  push:
    branches:
      - main

jobs:
  Test:
    name: Test
    runs-on: ubuntu-latest

    steps:
      - name: echoTest
        run: echo "Test"

```


## EC2にデプロイするまでのコード

```yml
name: Deploy to Amazon

on:
  push:
    branches:
      - main

jobs:
  Test:
    name: Test
    runs-on: ubuntu-latest

    steps:
      - name: echo1
        run: echo "this is a pen"

      # IP取得ライブラリをインストール
      - name: Public IP Install
        id: ip
        uses: haythem/public-ip@v1.2

      - name: checkout
        uses: actions/checkout@v3

      - name: src check
        run: |
          ls -al
          cd .github/workflows/
          ls -al

      # 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.MY_PRIVATE_KEY }}" > private_key
          chmod 600 private_key

          # 鍵認証の場合はこんな感じ
          ssh -oStrictHostKeyChecking=no ${{ secrets.EC2_USER_NAME }}@${{ secrets.EC2_HOST_NAME }} -i private_key "cd C:\inetpub\test\github-action-sample &&  git pull origin main"
          
          #　パスワード認証の場合はこんな感じ
          sshpass -p "${{ secrets.ADM_PASS }}" ssh -oStrictHostKeyChecking=no ${{ secrets.EC2_USER_NAME }}@${{ secrets.EC2_HOST_NAME }} "cd C:\inetpub\test\github-action-sample &&  git pull origin main"
          
          # pullした後は任意の処理を走らせる
          
          # SSHのセキュリティグループを閉じる
          aws ec2 revoke-security-group-ingress --group-id ${{ secrets.EC2_SECURITY_GROUP_ID }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32

```
コードの大部分は
[GitHub ActionsでEC2に自動デプロイ環境を構築する方法](https://note.com/ryoppei/n/nf2bf7ee78b0b)
の記事を参考にさせていただきました。

ところどころsecretsから値を取得している部分がありますが、これは
以下の画面から設定・取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/1a88b175-e069-7310-74a2-d830a5409282.png)

また上記の参考記事にも記載があるのですが
GitHub ActionからSSHで接続する都合上、都度セキュリティグループに対してIPを教えて開放・処理が終わったら閉じる、ということをする必要があります。
この点は要注意ですね。


## まとめ
以上、ごく簡単にではありますが、GitHub ActionからEC2にデプロイするまでの流れでした。
Circle　CIなどのサービスもありますが、小規模開発や複雑な処理がない場合はGitHub Actionだけでよいように思えました。
Vercelなんかは小難しい設定をすることなくこれを実現できていると考えるとすごいですね。

また今回はCI/CDでいうとCDの部分だけがクリアできたことになります。
以降はCIの部分にも挑戦していきたいと思います。