概要
これまでは、GitHubにpushしたコードをraspberry piからgit pullしていたが、
この作業が面倒なので、pushしたら自動でraspberry piに反映させるというものを作りました。
C言語のコードも利用するので、コード反映後にコンパイルやrebootなどのコマンドも自動実行できるようになっています。
仕組み
- GitHubのmasterにpush
- GitHubのwebhookによりAWS APIGateway を呼び出す
- AWS APIGatewayより AWS LAmbda Functionを呼び出し、masterリポジトリであれば AWS Iotブローカへパブリッシュする
- raspberry pi上では専用エージェント(DeployIoT)によりAWS IoTブローカからのサブスクライブを受信する
- サブスクライブを受信した専用エージェント(DeployIoT)は予め定義されているコマンドを実行する(git pull,make,reboot,等)
各所説明
GitHubのwebhook設定
- Payload URL は AWS APIGateway のエンドポイントを指定します
AWS APIGateway設定
- リソースのメソッドは「post」にします
- 統合タイプは「Lambda関数」にします
- Lambda関数は作成したものを指定します。ここでは「DeployIoT」としてました
- masterブランチを判定するために「マッピングテンプレート」を編集します
- マッピングテンプレートのリクエスト本体のパススルーを「テンプレートが定義されていない場合」を選択します
- Content-Typeの「マッピングテンプレートの追加」をクリックして「application/json」と入力します
- 値は以下の通りです
{
"name" : "$input.params('name')",
"body" : $input.json('$')
}
- エンドポイントはステージ(ここではprodとしました)の-post-/に「URLの呼び出し:」となっている箇所です
- このエンドポイントをGitHubのwebhook Payload URL欄に設定します
AWS Lambda設定
lambda_function code
- ここでは、関数名「DeployIot」、ランタイム「python3.6」、ハンドラ「lambda_function.lambda_handler」としました
- カスタムロールを作成して、AWS IoT接続用のポリシーを追加でアタッチします。
Lambda IAMロール
IoT接続用 IAMポリシー
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "iot:Publish",
"Resource": "*"
}
}
AWS IoT設定
「AWS IoTを使用してRaspberry PiとのMQTT通信をC言語で動作させる 」に投稿している内容を参照してください
raspberry pi側の設定
「専用エージェント(DeployIoT)」の設定になりますのでこのGitHubのリポジトリを参照してください
考察
- AWS CodeBuildでLinuxエージェントをインストールして実現可能と推測できるが、デプロイ毎のAWS費用とlinux側の負荷を考慮して却下
- raspberry pi 側はあえて pythonではなく C言語のAWS SDK を使用した。最初にpythonで動作確認したことにより容易に実装できた。