GitHub
AWS
deploy
RaspberryPi
IoT

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