AWS SSMでEC2自動デプロイを行う[GitHub Actions]

Pocket

やること

特定ブランチにプッシュしたとき、AWS SSM のRun CommandでEC2へアクセスする。EC2内に事前に配置したシェルスクリプトを実行することで自動デプロイを実現する

前提

AWSコンソール画面から指定EC2へAWS SSM Run Commandが実行できることを確認済

手順

IAMユーザー作成

以下ポリシーを付与したIAMユーザーの認証情報を取得する

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "ssm:SendCommand"
         ],
         "Resource":[
            "arn:aws:ec2:*:*:instance/*",
            "arn:aws:ssm:*:*:document/*"
         ]
      }
   ]
}

GitHubの設定

Environment SecretもしくはRepository Secretに以下を登録する

INSTANCE_ID           : 対象のEC2インスタンスID
AWS_REGION            : 利用しているリージョン
AWS_ACCESS_KEY_ID     : 先ほど取得したIAMユーザーのID
AWS_SECRET_ACCESS_KEY : 先ほど取得したIAMユーザーのシークレットキー

EC2内にシェルスクリプト配置

実行したいスクリプトを記述したファイルを配置する

#!/bin/sh

cd `dirname $0`

// Run Commandの実行ユーザーはrootになる
su ec2-user << EOF > deployer.log 2>&1
echo start `date '+%y/%m/%d %H:%M:%S'`
// ここに実行したいコマンドを記述していく
EOF

GitHub Actions作成

name: deploy-EC2

on:
  push:
    branches: master

jobs:
  start:
    runs-on: ubuntu-latest
    environment:
      name: prod ← Environment Secretで設定した場合は必要

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: AWS SSM Send-Command
        uses: peterkimzz/aws-ssm-send-command@master
        id: ssm
        with:
          aws-region: ${{ secrets.AWS_REGION }}
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          instance-ids: ${{ secrets.INSTANCE_ID }}

          working-directory: /home/ec2-user ← 実行ファイルを配置したpathを記入
          command: sh deployer.sh

参考

・AWS SSM Send-Command