Posted at

AWS IoTを使用してGitHubのコードをraspberry piに自動デプロイする


概要

これまでは、GitHubにpushしたコードをraspberry piからgit pullしていたが、

この作業が面倒なので、pushしたら自動でraspberry piに反映させるというものを作りました。

C言語のコードも利用するので、コード反映後にコンパイルやrebootなどのコマンドも自動実行できるようになっています。


仕組み

Untitled (1).png


  • 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設定

webhook.JPG


  • Payload URL は AWS APIGateway のエンドポイントを指定します


AWS APIGateway設定

apigateway.JPG


  • リソースのメソッドは「post」にします

  • 統合タイプは「Lambda関数」にします

  • Lambda関数は作成したものを指定します。ここでは「DeployIoT」としてました

  • masterブランチを判定するために「マッピングテンプレート」を編集します

  • マッピングテンプレートのリクエスト本体のパススルーを「テンプレートが定義されていない場合」を選択します

  • Content-Typeの「マッピングテンプレートの追加」をクリックして「application/json」と入力します

  • 値は以下の通りです

{    

"name" : "$input.params('name')",
"body" : $input.json('$')
}

apigateway2.JPG


  • エンドポイントはステージ(ここではprodとしました)の-post-/に「URLの呼び出し:」となっている箇所です

  • このエンドポイントをGitHubのwebhook Payload URL欄に設定します


AWS Lambda設定

lambda.JPG


lambda_function code

https://github.com/shigeru-yokochi/DeployIoT/blob/master/lambda_function.lambda_handler.py


  • ここでは、関数名「DeployIot」、ランタイム「python3.6」、ハンドラ「lambda_function.lambda_handler」としました

  • カスタムロールを作成して、AWS IoT接続用のポリシーを追加でアタッチします。


Lambda IAMロール

ロールlambda.JPG


IoT接続用 IAMポリシー

ポリシーiot.JPG

{

"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で動作確認したことにより容易に実装できた。