GitHub ActionsでEC2へのデプロイ自動化(CI/CD)

プログラミング
アイキャッチ
スポンサーリンク
スポンサーリンク

何をやるか

特定のブランチ(今回はmaster)へプッシュされた時に、
自動でEC2へSSH接続し、デプロイ(今回はGit pullだけ)する。

スポンサーリンク

前提

CLIに使用する、アクセスキーやシークレットアクセスキーを持っている

スポンサーリンク

問題点

EC2のセキュリティグループは普段、IP制限等していると思いますが、
Githubは固定のIPではなく、実行の度にIPが変わってしまうため、固定で許可しておくことができない。
https://github.community/t/stable-ip-addresses-range-for-actions/16515/3

問題の解決

IPアドレスを取得し、
CLIを使って、特定のIPを許可するようにすることで、
無闇にSSHポートへの接続をしないようにした。

手順

Gitのインストール

sudo yum install -y  git-all

デプロイ対象のEC2インスタンスで鍵を作成する

Githubからpullする時に、ユーザ名など毎回打つのは面倒なので、登録します。

EC2上に鍵を作成

[ec2環境]$ cd ~/.ssh
[ec2環境]$ ssh-keygen -t rsa
# 鍵の名前は、github_keyとします。
Enter file in which to save the key (): github_key
Enter passphrase (empty for no passphrase): [Enter]
Enter same passphrase again: [Enter]

EC2上の~/.ssh/configに以下を記述します。

Host github
HostName github.com
User git
IdentityFile ~/.ssh/github_key

Githubに鍵を登録する

URL:https://github.com/settings/keys

ssh-agentを有効化・鍵の登録

[ec2環境]$ eval ssh-agent
[ec2環境]$ ssh-add ~/.ssh/github_key

Gitテスト

[ec2環境]$ ssh -T github
Hi ユーザー名! You've successfully authenticated, but GitHub does not provide shell access.

Git Clone

[ec2環境]$ git clone git@github.com:○○.git

Gitにシークレットキーを登録する

プロジェクトのSettings→Secretsにて、登録する。

  • ACCESS_KEY
  • HOST_NAME
  • PRIVATE_KEY
  • SECRET_ACCESS_KEY
  • USER_NAME
  • SECURITY_GROUP

    完成したコード

    コメントに記載している通りですが、簡単な流れは

  • Github Actionsで稼働しているイメージのIPを取得

  • CLIをインストール
  • CLIの設定
  • EC2のセキュリティグループを開放
  • SSH接続し、Git pull
  • EC2のセキュリティグループを閉じる
name: TestDeploy
on:
push:
branches: [master]
jobs:
deploy:
if: github.ref == 'refs/heads/master'
runs-on: ubuntu-latest
steps:
- name: Public IP
id: ip
uses: haythem/public-ip@v1
- uses: actions/checkout@v2
- name: Deploy
env:
PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }}
USER_NAME: ${{ secrets.USER_NAME }}
HOST_NAME: ${{ secrets.HOST_NAME }}
ACCESS_KEY: ${{ secrets.ACCESS_KEY }}
SECRET_ACCESS_KEY: ${{ secrets.SECRET_ACCESS_KEY }}
SECURITY_GROUP: ${{ secrets.SECURITY_GROUP }}
run: |
# https://github.com/haythem/public-ip
IP_ADDRESS=echo ${{ steps.ip.outputs.ipv4 }}
# AWS CLIをインストール
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version
# AWS CLIに設定をする
printf "${ACCESS_KEY}\n${SECRET_ACCESS_KEY}\nap-northeast-1\njson\n" | aws configure --profile eyemovic-dev
aws configure get aws_access_key_id --profile eyemovic-dev
# SSHポートを開放する
aws --profile eyemovic-dev ec2 authorize-security-group-ingress --group-id ${SECURITY_GROUP} --protocol tcp --port 22 --cidr "$IP_ADDRESS"/32
# SSH接続して、git pullする
echo "$PRIVATE_KEY" > private_key && chmod 600 private_key
ssh -o StrictHostKeyChecking=no -i private_key ${USER_NAME}@${HOST_NAME} '
cd /home/ec2-user/Gitプロジェクト &&
git checkout master &&
git fetch --all &&
git reset --hard origin/master &&
git pull origin master
'
# SSHのポートを閉じる
aws --profile eyemovic-dev ec2 revoke-security-group-ingress --group-id ${SECURITY_GROUP} --protocol tcp --port 22 --cidr "$IP_ADDRESS"/32

主要コードの解説

Github ActionsのIPを取得する

使用しているライブラリ:https://github.com/haythem/public-ip

      - name: Public IP
id: ip
uses: haythem/public-ip@v1
run: |
IP_ADDRESS=echo ${{ steps.ip.outputs.ipv4 }}

CLIでセキュリティグループの特定ポートを開放する

これで、指定したセキュリティグループのSSHポートを開放します。
https://docs.aws.amazon.com/cli/latest/reference/ec2/authorize-security-group-ingress.html

aws --profile eyemovic-dev ec2 authorize-security-group-ingress --group-id ${SECURITY_GROUP} --protocol tcp --port 22 --cidr "$IP_ADDRESS"/32

CLIでセキュリティグループの特定ポートを閉じる

これで、指定したセキュリティグループのSSHポートを閉じます。
https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html

aws --profile eyemovic-dev ec2 revoke-security-group-ingress --group-id ${SECURITY_GROUP} --protocol tcp --port 22 --cidr "$IP_ADDRESS"/32

コメント

タイトルとURLをコピーしました