0
Help us understand the problem. What are the problem?

posted at

updated at

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

CircleCIを導入の備忘録

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

詰まった内容

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

前提

・EC2の環境構築は完了している
・CircleCIのユーザー登録は完了している

参考にした情報

※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/

主な設定の流れ

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

使用するconfig.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



1. EC2上でキーペアを作成


ローカルから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



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

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

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

terminal
[ec2-user@ip ~] $ cat id_rsa.pub


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

Titleには任意のタイトルを設定、Keyにコピーした内容を貼り付け
スクリーンショット 2022-01-15 2.35.56.png

3.Circle CI上で環境変数設定と秘密キーを登録

Github内のプロジェクト一覧が表示されるのでセットアップしたいプロジェクトを「Set Up Project」で選択します。
※画像ではすでにセットアップ済みなのでunfollow projectになってます
スクリーンショット 2022-01-15 3.16.39.png

※記事によってはGithubにCircleCI用のデプロイキーを設定しなければならないと書いてあるものもありますが、この段階で以下画像のようにデプロキーが自動で作成されます。
スクリーンショット 2022-01-15 3.26.30.png

次に、config.yml内で使用される環境変数の設定をおこないます。
以下画像内の「Project Settings」を選択し、「Environment Variables」を選択後
「HOST_NAME」と「USER_NAME」を設定します。
スクリーンショット 2022-01-15 3.32.57.png
スクリーンショット 2022-01-15 3.35.04 1.png

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



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

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

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

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

スクリーンショット 2022-01-15 3.56.57.png

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

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

スクリーンショット 2022-01-15 4.06.23.png

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


Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?