GitHub ActionでAWS EC2にデプロイを実行する(Amazon Linux)

# 概要

AWS EC2でAmazon linuxの仮想サーバーを作成
GitHubActionsを使って作成したAmazon linuxの仮想サーバーへデプロイを実行する

[前回](https://qiita.com/kubota_ndatacom/items/d9a3c9b18854ec148993)

参考にした記事
[[初心者向け]VPC作成からEC2インスタンス起動までを構成図見ながらやってみる（その1）](https://dev.classmethod.jp/articles/creation_vpc_ec2_for_beginner_1/)
[[初心者向け]VPC作成からEC2インスタンス起動までを構成図見ながらやってみる（その2）](https://dev.classmethod.jp/articles/creation_vpc_ec2_for_beginner_2/)


# 前提
AWSのアカウント作成済み
GitHubのアカウント作成済み


# 目次
[1. インスタンスを作成する](#1-インスタンスを作成する)
[2. node.jsのインストール](#2-nodejsのインストール)
[3. gitのインストール](#3-gitのインストール)
[4. AWSCLIの初期設定](#4-AWSCLIの初期設定)
[5. GitHubとAWSCS2のSSH接続の設定](#5-githubとawscs2のssh接続の設定)
[6. リモートリポジトリのシークレットの登録](#6-リモートリポジトリのシークレットの登録)


# 1. インスタンスを作成する

EC2のダッシュボードよりインスタンスを選択、「インスタンスの起動」をクリック

![20221027-001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/31338fe4-70c2-c6ac-4aae-3a52eb29affe.jpeg)


名前を入力（任意）、マシンイメージはAmazonLinuxを選択する

![20221027-002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/a946bd58-d301-411c-5058-023b5e5cc1f3.jpeg)


インスタンスタイプは「t2,micro」を選択、キーペアは[前回記事](https://qiita.com/kubota_ndatacom/items/d9a3c9b18854ec148993)で作成したものを指定する

![20221027-003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/644ebc82-6801-7fa5-c474-6986b5b3e6e1.jpeg)


ネットワーク設定の「編集」をクリック
VPC、サブネットは作成したものを選択、パブリックIPの自動割り当ては「有効化」、「既存のセキュリティグループを選択する」にチェックを入れて、作成したセキュリティグループを選択する

![20221027-004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/8f5b9e89-e87d-2b8c-9c9c-5b16b85bd91e.jpeg)

![20221027-005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/94152769-c864-acbf-c938-051aa99bafc6.jpeg)


必要であればストレージ容量を変更後、「インスタンスを起動」をクリックして完了

![20221027-006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/a14b05a8-ce2a-bb95-7b71-05e261e8c17e.jpeg)


作成したインスタンスのページに表示されているパブリックIPとキーペアに指定した秘密鍵を使用してSSH接続をテストする
@の前のどフォルトユーザーはAmazonLinuxの場合はec2-user(CentOS7の場合はcentos)


![20221027-007.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/b183fe0e-5b4e-6e72-c1a5-5516465ce61b.jpeg)


```
$ ssh -i "AmazonLinux-001.pem" ec2-user@xxx.xxx.xxx.xx
```

ログイン出来れば接続テストOK

![20221027-008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/59a54e55-658f-578e-1252-665de47cadbe.jpeg)



# 2. node.jsのインストール

AmazonLinuxにnode.jsをインストールする

```
$ curl -sL https://rpm.nodesource.com/setup_14.x | sudo bash -
$ sudo yum -y install nodejs
```

「node -v」でバージョンが確認できればOK

```
$ node -v
v14.20.1
```

# 3. gitのインストール

AmazonLinuxにgitをインストールする
[参考](https://qiita.com/tomy0610/items/66e292f80aa1adc1161d)

依存関係のあるライブラリをインストール
```
$ sudo yum -y install gcc curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker autoconf```
```

gitをインストール
```
$ npm install git
```

「git -v」でバージョンが確認できればOK
```
$ git -v
git version 2.37.1
```

# 4. AWSCLIの初期設定

IAMのダッシュボードよりアカウントを選択、「ユーザーを追加」をクリック

![20221031-001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/4b62c9ee-d482-827d-97c1-a89aad2de518.jpeg)


ユーザー名（任意）を入力、「アクセスキー・プログラムによるアクセス」にチェック

![20221031-002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/08c7658a-3ec5-44f2-ac8a-bad594d9861a.jpeg)


「既存のポリシーを直接アタッチ」を選択、「AdministratorAccess」にチェック

![20221031-003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/15dd9fa3-1b05-c334-7a00-faacfbcf9c84.jpeg)


必要ならタグを入力して、「ユーザーの作成」をクリック

![20221031-004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/aa12f78c-b534-e82a-0815-cd387ad5e043.jpeg)


アクセスキーとシークレットアクセスキーは控えておく

![20221031-005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/ce3c8410-45be-1500-bb6d-2807cee2419a.jpeg)


awscliの設定を行う
AWSにSSH接続し下記コマンドを実行する
```
$ aws configure --profile 管理したいプロファイル名
AWS Access Key ID [None]: アクセスキー
AWS Secret Access Key [None]: シークレットアクセスキー
Default region name [None]: ap-northeast-3
Default output format [None]: json
```

# 5. GitHubとAWSCS2のSSH接続の設定
[参考](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)

AWSにSSH接続し下記コマンドを実行する
鍵を入れるフォルダに移動
```
$ cd ~/.ssh
```
鍵を生成

```
$ ssh-keygen -t rsa
```

GitHubの「SSH and GPG keys」のページを開いて、「New SSH key」をクリック

![20221031-006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/fb95215a-f7fe-9c2a-de17-5f87d43b841e.jpeg)


名前（任意）を入力し、作成したキー(id_rsa.pub)の中身をコピーしてGitHubに登録する

![20221031-007.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/acf78325-fb11-b74f-9ccf-0b1961d3456c.jpeg)



# 6. リモートリポジトリのシークレットの登録

GitHubのリモートリポジトリのページのsettingsを選択、secretのactionsを選択する、「New Repository secret」をクリック

![20221031-008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/11f21cd7-81ea-c1d0-b50e-bc3aecd462a3.jpeg)

![20221031-009.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/798427ec-f926-5a43-5073-a905b8fbef91.jpeg)


「Name」「Secret」にそれぞれ
EC2_USER_NAME → EC2のユーザー情報
EC2_HOST_NAME → EC2のホスト情報
EC2_SECURITY_GROUP_ID → EC2のセキュリティグループID
GIT_PRIVATE_KEY → EC2でkeygenしたgithub用の秘密鍵
AWS_ACCESS_KEY → AWS CLIのアクセスキー
AWS_SECRET_ACCESS_KEY → AWS CLIのシークレットアクセスキー

を登録する

![20221031-010.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/d98428cb-6fc5-85ae-3670-1652cb08f463.jpeg)


# 7. workflowファイル(ymlファイル)を作成する

ワークフローファイルを作成する
```yml:AmazonLinux001.yml
# ワークフロー名(任意)
name: AmazonLinux001

# トリガーとなる GitHub イベント
on:
  # workflow_dispatchを指定しておくとGitHubのコンソールから実行可能になる
  workflow_dispatch:

# ワークフローの実行処理
jobs:
  # ジョブ名(任意)
  build:
    # ジョブが実行されるランナー(仮想デバイス)の種類
    runs-on: ubuntu-latest
    # タイムアウトの時間を設定しておく
    timeout-minutes: 10

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

     # 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-3

     # デプロイする
     - 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.GIT_PRIVATE_KEY }}" > private_key
         chmod 600 private_key
         ssh -oStrictHostKeyChecking=no ${{ secrets.EC2_USER_NAME }}@${{ secrets.EC2_HOST_NAME }} -i private_key "cd React && git pull origin main"
         # 処理を実行
         
         # SSHのセキュリティグループを閉じる
         aws ec2 revoke-security-group-ingress --group-id ${{ secrets.EC2_SECURITY_GROUP_ID }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32
```
上記ymlファイルではコンソールからの手動実行で、AWSサーバーのReactフォルダでgit pull が実行される