以前、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"]}'
コメント