何をやるか
特定のブランチ(今回は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
コメント