😸

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

2020/09/01に公開

何をやるか

特定のブランチ(今回は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

GitHubで編集を提案

Discussion