Skip to content

Latest commit

 

History

History
160 lines (117 loc) · 5.45 KB

2020-09-02-000000.md

File metadata and controls

160 lines (117 loc) · 5.45 KB
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ポートへの接続をしないようにした。

手順

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: |

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