自宅内Raspberry Piへのデプロイ自動化 その② -Github ActionsからAWS System Managerスクリプト実行-

以前、Raspberry Piへのデプロイ自動化のために、

ラズパイをAWSのインスタンスとしてAWS System Managerで管理できるようにし

自宅内Raspberry Piへのデプロイ自動化 その① -AWS System Managerへの登録-
自宅内でスマートホーム用のサーバとして動かしているRaspberry Piは今のところ手動でデプロイ、アプリケーション実行などの管理をしており、このあたりを自動化したい。現状やり方として見つかったのは2つAWSCodePi...

Github Actionsを使ってラズパイ向けにクロスビルドしたバイナリのリリースを自動化した。

ラズパイ向けにGithub Actionsでgolangのクロスビルドしたバイナリをアップロードさせる その② -Github Release自動化-
先日のエントリで、CI/CD向けにgithub上にファイルをアップロードする方法としてUpload-Artifactアクションを使う方法を記述したが、デプロイで外部からダウンロードするには不適切だったことがわかった。そこで...

これにより、ようやく自宅内ラズパイへのデプロイ自動化へ漕ぎ着けることとなった。

Github ActionsでAWS System Managerのスクリプト実行

デプロイスクリプトの作成

まずは、AWS System Managerで実行したいスクリプトを作成。
普通にシェルスクリプトが使えることがわかったので、これでいくことにした。

deploymentsディレクトリにdeploy-pi.shを作成。
githubから半ば無理やりバイナリダウンロード、systemdを使って起動。

#!/bin/sh

# setup
sudo apt-get -y install jq

# get latest binary
url=`curl https://api.github.com/repos/u-one/go-el-controller/releases/latest | jq '.assets[] | select(.name == "elexporter_linux_arm") | .browser_download_url' | sed 's/"//g'`
echo $url 
wget -q $url
chmod +x ./elexporter_linux_arm

# stop service
systemctl stop el-exporter.service

# install
DIR=/opt/u-one/el-exporter
mkdir -p $DIR
mv elexporter_linux_arm $DIR/elexporter
mv el-exporter.service /etc/systemd/system/

systemctl enable el-exporter.service

# start service
systemctl start el-exporter.service

なお、プロセス管理をsystemdでやらせると起動・停止や落ちたときの自動再起動など便利なのでそれを使うようにしている。
(また、当初起動スクリプトをnohupでバックグランド実行させようとしたのだが、AWS System Managerのコマンド実行処理が完了せず待ちのままとなってしまった。)
serviceファイルはとりあえず下記のように。

[Unit]
Description=EchonetLite exporter

[Service]
ExecStart=/opt/u-one/el-exporter/elexporter

[Install]
WantedBy=multi-user.target

AWS System Managerのスクリプト実行をgithub actionsから実行できるようにする。

そしてようやく、github actionsから上記デプロイスクリプトをAWSのSystem Managerを介して実行させることで自動デプロイが完成。

一旦手動でトリガをかけるようにしている。
AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY は作成しておく必要がある。

スクリプトの実行は最後の

aws ssm send-command --document-name "AWS-RunRemoteScript" --instance-ids "mi-000xxxxxxxxxxxxxx" --parameters '{"sourceType":["GitHub"],"sourceInfo":["{\"owner\":\"u-one\", \"repository\":\"go-el-controller\", \"path\": \"deployments\"}"],"commandLine":["deploy-pi.sh"]}'

のaws cliを叩いている部分。instance-idsで実行したいRaspberry Piを指定、指定したgithubリポジトリの指定したpathにあるスクリプトを実行している。

on:
  workflow_dispatch:
    inputs:

name: Deploy to Raspberry Pi

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest

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

    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ap-northeast-1

    - name: Deploy
      run: |
        aws ssm send-command --document-name "AWS-RunRemoteScript" --instance-ids "mi-000b9eb42911d6950" --parameters '{"sourceType":["GitHub"],"sourceInfo":["{\"owner\":\"u-one\", \"repository\":\"go-el-controller\", \"path\": \"deployments\"}"],"commandLine":["deploy-pi.sh"]}'

コメント

タイトルとURLをコピーしました