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 "
aws configure get aws_access_key_id --profile eyemovic-dev
SSHポートを開放する
aws --profile eyemovic-dev ec2 authorize-security-group-ingress --group-id
SSH接続して、git pullする
echo "$PRIVATE_KEY" > private_key && chmod 600 private_key
ssh -o StrictHostKeyChecking=no -i private_key
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
主要コードの解説
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
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
Discussion