title | published_at | type | published | coverImage |
---|---|---|---|---|
GitHub ActionsでEC2へのデプロイ自動化(CI/CD) |
2020-09-01 |
tech |
true |
アイキャッチ.png |
特定のブランチ(今回は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ポートへの接続をしないようにした。
sudo yum install -y git-all
Githubからpullする時に、ユーザ名など毎回打つのは面倒なので、登録します。
[ec2環境]$ cd ~/.ssh [ec2環境]$ ssh-keygen -t rsa
Enter file in which to save the key (): github_key Enter passphrase (empty for no passphrase): [Enter] Enter same passphrase again: [Enter]
Host github HostName github.com User git IdentityFile ~/.ssh/github_key
URL:https://github.com/settings/keys
[ec2環境]$ eval ssh-agent
[ec2環境]$ ssh-add ~/.ssh/github_key
[ec2環境]$ ssh -T github Hi ユーザー名! You've successfully authenticated, but GitHub does not provide shell access.
[ec2環境]$ git clone git@github.com:○○.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: |
IP_ADDRESS=echo ${{ steps.ip.outputs.ipv4 }}
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86\_64.zip" -o "awscliv2.zip" unzip awscliv2.zip sudo ./aws/install aws --version
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
aws --profile eyemovic-dev ec2 authorize-security-group-ingress --group-id ${SECURITY_GROUP} --protocol tcp --port 22 --cidr "$IP_ADDRESS"/32
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 '
aws --profile eyemovic-dev ec2 revoke-security-group-ingress --group-id ${SECURITY_GROUP} --protocol tcp --port 22 --cidr "$IP_ADDRESS"/32
使用しているライブラリ:https://github.com/haythem/public-ip
- name: Public IP
id: ip
uses: haythem/public-ip@v1
run: |
IP_ADDRESS=echo ${{ steps.ip.outputs.ipv4 }}
これで、指定したセキュリティグループの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
これで、指定したセキュリティグループの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