Circle CIを導入し、EC2デプロイ自動化

<h1>CircleCIを導入の備忘録</h1>

すでにEC２にデプロイ済みのLaravelプロジェクトについて、コードの修正をするたびにローカルからEC2にSSH接続し、Git pullするのが面倒だったので、CICDの勉強も兼ねてCircleCiを導入しました。
使用したconfig.ymlの内容は他のブログをそのまま引用しましたが、SSH接続設定をするのに手こずり、一日費やしてしまったので備忘録として設定方法を記載します。
config.yml内の内容自体は参考とさせていただいたブログ上に説明があるのでそちらをご参照ください。
<br>

<h3>詰まった内容</h3>
登場人物がCircle CI、EC2、Githubの3つで、どこにどの秘密キーor公開キーを設定するのかがプログラミング初学者、SSH接続を全く知らない学習者には分かりづらすぎた。

<h3>前提</h3>
・EC2の環境構築は完了している
・CircleCIのユーザー登録は完了している

<h3>参考にした情報</h3>
※build / deploy 用のconfig.ymlの内容自体は下記サイトのコードをそのまま引用しております。
https://suwaru.tokyo/%E3%80%90%E4%BD%BF%E3%81%84%E6%96%B9%E3%80%91circleci%E3%81%A8%E3%81%AF%EF%BC%9Fec2%E3%81%ABssh%E3%81%97%E3%81%A6%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E8%87%AA%E5%8B%95%E5%8C%96/
https://noumenon-th.net/programming/2020/05/02/circleci-laravel-ec2-deploy/

<h3>主な設定の流れ</h3>
1.EC2上でキーペアを作成
2.GithubにてEC2で作成した公開キーを登録
3.Circle CI上で環境変数設定と秘密キーを登録
※すでにEC2にプロジェクトをデプロイしている場合は１、２は不要の場合あるかもしれません。


<h3>使用するconfig.yml</h3>
```yml:config.yml
version: 2
jobs:
    build:
        docker:
            - image: alpine
        steps:
            - checkout
            - run:
                name: Echo Test
                command: echo "CircleCI Test"
    deploy:
        machine:
            image: circleci/classic:edge
        steps:
            - checkout
            - add_ssh_keys:
                fingerprints:
                  # CircleCI上でSSHキー登録を行った際に作成されるfingerprintsを記入！！
                  - ××:××:××:××:××:××:××:××:××:××:××:××:××:××:××:××
            #この箇所の［EC2上のプロジェクトパス］を自身のパスに書き換え！！
            - run: ssh ${USER_NAME}@${HOST_NAME} 'cd ［EC2上のプロジェクトパス］ && git pull'

workflows:
    version: 2
    build_and_deploy:
        jobs:
            - build
            - deploy:
                requires:
                    - build
                filters:
                    branches:
                        only: master
```


<br>
<h2>1. EC２上でキーペアを作成</h2>
ローカルからEC2にアクセスし、以下コードでキーペアが存在するか確認

```:terminal
[ec2-user@ip ~] $ ls -al ~/.ssh
```

id_rsaとid_rsa.pubが存在しない場合、以下実行しキーペアを作成

```:terminal
[ec2-user@ip ~] $ ssh-keygen -t rsa -b 4096 -m pem
```

生成されたid_rsa.pubの内容を、リダイレクトによってauthorized_keysに追記

```:terminal
[ec2-user@ip ~] $ cat id_rsa.pub >> authorized_keys
```

<br>
次に生成したSSH公開キーをGithubに登録します。

<h2>2. GithubにてEC2で作成した公開キーを登録</h2>

EC2上で以下コマンド実行し、出てくる公開キーの内容をコピーする
※最初のssh-rsa~から最後のec2-user@ip~までをコピー

```:terminal
[ec2-user@ip ~] $ cat id_rsa.pub
```
<br>

右上の自身のアカウントアイコンから「Settings」を選択
「SSH And GPG Keys」を選択
「New SSH Key」ボタンを選択

Titleには任意のタイトルを設定、Keyにコピーした内容を貼り付け
![スクリーンショット 2022-01-15 2.35.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481858/5fad157f-eb8f-6b03-6973-540817182165.png)



<h2>3.Circle CI上で環境変数設定と秘密キーを登録</h2>
Github内のプロジェクト一覧が表示されるのでセットアップしたいプロジェクトを「Set Up Project」で選択します。
※画像ではすでにセットアップ済みなのでunfollow projectになってます
![スクリーンショット 2022-01-15 3.16.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481858/13f3007b-93b1-62f6-46b1-9d9fbcf17618.png)


※記事によってはGithubにCircleCI用のデプロイキーを設定しなければならないと書いてあるものもありますが、この段階で以下画像のようにデプロキーが自動で作成されます。
![スクリーンショット 2022-01-15 3.26.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481858/23ef48ca-5346-bb5f-3ebd-6f26a9773ece.png)

次に、config.yml内で使用される環境変数の設定をおこないます。
以下画像内の「Project Settings」を選択し、「Environment Variables」を選択後
「HOST_NAME」と「USER_NAME」を設定します。
![スクリーンショット 2022-01-15 3.32.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481858/6c9b279c-4160-92cb-352e-314fb4a72350.png)
![スクリーンショット 2022-01-15 3.35.04 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481858/686bdae0-adde-aaac-cbe3-21b75dacd66d.png)

※ここでのHOST_NAMEはEC2インスタンスのIPアドレス、USER_NAMEはEC2インスタンスのユーザー名（ec2-userなど）
EC2接続時の[ec2-user@ip-×××-××-××-××]の＠以前をユーザー名、×××-××-××-××をホスト名に設定すると動作しました

<br>
最後に「SSH Keys」を選択し、EC2インスタンスの秘密キーを登録します。

ここで登録する秘密キーがどの秘密キーなのかがわからず躓きました。。。
１番初めのステップで秘密キー、公開キーがEC2内の/.ssh内に作成されていたので、そこにある秘密キーを登録すると正常に動作しました。
EC2インスタンスにCircleCIサーバーからSSH接続することになるので、公開キーはEC2インスタンス、秘密キーのfingerprintはCircleCIということなのでしょう、、、

以下コマンドで出てくるキーを以下画像内に貼り付け

```:terminal
[ec2-user@ip ~] $ cat id_rsa
```

![スクリーンショット 2022-01-15 3.56.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481858/ca8d8867-302c-b28a-ce4e-45db1efd3a92.png)

Hostnameには環境変数設定で使用したEC2インスタンスIPアドレスを入力。
PrivateKeyについては「-----BEGIN RSA PRIVATE KEY-----」から「-----END RSA PRIVATE KEY-----」までをしっかり貼り付け無いとエラーになります。

最後に発行されたfingerprintをconfig.yml内に記載してください。

![スクリーンショット 2022-01-15 4.06.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481858/d6808c1c-8fec-3aa8-6b5d-be20d7bd1238.png)


ここまで設定すると、Gitのマスターブランチにローカルからプッシュした段階でconfig.yml内で定義したbuild, deployが実行され、EC2へのSSH接続とGit pullが自動で実行されるはずです。
今後はテスト自動化も行いたいので、勉強していこうと思います。

<br>