- 公開日
- 最終更新日
【IoT】『押したらLambda関数が起動するボタン』を作成してみる(後編)
この記事を共有する

目次
サービスG松原です。 今回はRaspberry Pi Pico W(以下 Pico W)とAWS IoT Core(以下IoT Core)を使用して『押したらLambda関数が起動するボタン』を作っていきます。
※すこし長いので前後編で分けます。この記事は後編です。前編はこちら
やりたいこと
最終的に目指すのは『押したらLambda関数が起動するボタン』です。以下のような処理を行います。
- Pico W に接続したタクトスイッチを押すとIoT CoreにMQTTメッセージを送信
- MQTTメッセージの受信を起因としてAWS Lambda(以下Lambda)の関数を起動
前編ではローカルで以下の処理を行う機器を作成しました。
- スイッチを押したらLEDが点灯
参考資料
今回の内容のうち、IoT Coreに接続するまでの手順はAWSビルダーセンターの以下記事を参考にしました。
Getting started with your Raspberry Pi Pico W and AWS IoT Core in under 30 minutes
IoT Coreに接続するまではこちらの記事のとおりのため、簡易な説明のみとします。詳細については元記事をご確認ください。
AWS IoT Coreへの接続設定
CloudShellにOpenSSLをインストール
AWSマネジメントコンソールからCloudShellを開き以下コマンドを実行します。 ここから続く一連のコマンド操作は元記事のとおりです。
sudo yum install -y openssl
モノの名前を定義
IoT Coreで使用するモノの名前を環境変数に定義し、モノを作成します。
THING_NAME=RaspberryPiPicoW aws iot create-thing --thing-name $THING_NAME
モノの認証用の鍵と証明書の作成
デバイス認証用の鍵と証明書を作成します。
aws iot create-keys-and-certificate --set-as-active \ --public-key-outfile ${THING_NAME}-public.key \ --private-key-outfile ${THING_NAME}-private.key \ --certificate-pem-outfile ${THING_NAME}-certificate.pem > ${THING_NAME}_response # 環境変数を定義 CERTIFICATE_ARN=$(jq -r ".certificateArn" ${THING_NAME}_response) CERTIFICATE_ID=$(jq -r ".certificateId" ${THING_NAME}_response)
IoTポリシーを作成
POLICY_NAME=${THING_NAME}_Policy aws iot create-policy --policy-name $POLICY_NAME --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:*", "Resource": "*" } ] }'
IoTポリシーを証明書にアタッチ/証明書をモノにアタッチ
aws iot attach-policy --policy-name $POLICY_NAME --target $CERTIFICATE_ARN aws iot attach-thing-principal --thing-name $THING_NAME --principal $CERTIFICATE_ARN
ここまで実施するとマネジメントコンソール上で[RaspberryPiPicoW]名称の モノが作成されて、モノに証明書がアタッチされ、証明書にポリシーがアタッチされていることが確認できます。
モノ
証明書/ポリシー
引き続きビルダーセンターの手順を進めます。
証明書をDER形式に変換/ローカルにダウンロード
openssl rsa -in ${THING_NAME}-private.key -out key.der -outform DER openssl x509 -in ${THING_NAME}-certificate.pem -out cert.der -outform DER
上記のコマンドでCloudShell上にDER形式の鍵と証明書が作成されました。 作成されたkey.derとcert.derファイルをCloudShellからローカルにダウンロードします。
IoTエンドポイントのURLを取得
このエンドポイントURLは後で使用するためメモしておきます。
IOT_ENDPOINT=$(aws iot describe-endpoint --endpoint-type iot:Data-ATS --output text) echo "AWS IoT EndPoint: $IOT_ENDPOINT"
MQTTクライアントのインストール
- PCにPico Wを接続した状態でThonnyを起動
- Thonnyのウィンドウ右下でMicro Python (Raspberry Pi Pico)を選択
- ツール > パッケージの管理を選択、検索ボックスで[umqtt.simple]と検索し、検索結果の[umqtt.simple]を選択
- umqtt.simpleの最新の安定板をインストール
※参考記事の手順ではバージョン1.3.4でしたが2025/9現在は1.6.0が最新版でした。
証明書をPico Wにアップロード
- Thonnyにて、表示 > ファイルを選択しファイルパネルを表示
- ファイルパネル下部(Pico W側)のハンバーガーメニューを選択し、[新しいディレクトリ]を選択、Pico Wに[/certs]ディレクトリを作成
- ファイルパネル下部(Pico W側) の/certsディレクトリを開いた状態で、ファイルパネル上部(PC側)で証明書ファイルの[key.der]ファイルを選択し、ハンバーガーメニューから[/certsにアップロード]を選択してファイルをアップロード
- 同様の手順で[cert.der]ファイルもPico Wの/certsディレクトリにアップロード
main.pyの修正①
参考記事の[Appendix 1: main.py]のコードから以下の項目を修正します。
※コード全文の記載は割愛/変更箇所のみ記載します。
# 自宅のネットワークのSSIDに置き換え SSID = b'自宅WifiのSSID' # 自宅のネットワークのパスワードに置き換え PASS = b'自宅Wifiのパスワード' # [IoTエンドポイントのURLを取得]で確認したエンドポイント名に置き換え AWS_ENDPOINT = b'前段手順で確認したエンドポイントURL'
上記を修正したコードをmain.pyとしてPico Wに保存することでIoT Coreとの接続が可能になります。
※前編で作成したmain.pyは適宜PC上に退避しておきます。
IoT Coreへの接続確認
サンプルコードを元に修正したmain.pyをPico Wに保存した状態でPico Wを起動すると 5秒に1度、PicoWに内蔵された温度センサーから温度を取得してMQTTプロトコルでIoT Coreにメッセージ送信する処理が稼働します。 このメッセージをIoT Core側で確認します。
Thonny側で[現在のスクリプトを実行]で処理を起動した場合はシェルに送信メッセージが表示されます。
マネジメントコンソールでIoT Core > MQTTテストクライアント > トピックをサブスクライブする > トピックのフィルターに[/RaspberryPiPicoW/temperature]と入力し、サブスクライブを押下します。
5秒おきに送信されるメッセージが確認できればOKです。
ボタンを押したらLambda関数が起動する処理の設定
main.pyの修正②
ここまでは参考記事の手順をなぞって実施してきました。
この処理をボタンを押すとLambda関数が起動する処理に変更していきます。
まずはmain.pyを以下のように改修します。 ※改修箇所のみ記載します。
# import行の後に以下を追加 led = machine.Pin('GP10',machine.Pin.OUT) button = machine.Pin('GP16',machine.Pin.IN, machine.Pin.PULL_UP) # Main loop処理を以下に変更 while True: if button.value(): led.off() else: led.on() message = b'{"temperature":%s, "temperature_unit":"Degrees Celsius"}' % get_rpi_temperature() print('Publishing topic %s message %s' % (PUB_TOPIC, message)) mqtt.publish(topic=PUB_TOPIC, msg=message, qos=0) mqtt.check_msg() time.sleep(5) time.sleep (0.1)
前回のLED点灯のループ処理の中にIoT Coreへのメッセージ送信処理を入れ込んだかたちです。
これでボタンを押すとMQTTメッセージがIoT Coreに送信されるようになりました。
ボタンを押してIoT Coreにメッセージが送られることを確認
修正したmain.pyをPico Wに保存した状態でPico Wを起動。 今度は何もしなければメッセージは送られず、ボタンを押すと5秒間LEDが点灯してIoT Coreにメッセージが送信されるようになりました。
ボタンをぽちり。
5秒おきではなくボタンを押したタイミングでメッセージを受信!
IoT Coreのメッセージ受信からLambdaを起動するように設定
続いてIoT CoreがMQTTメッセージを受け取ったタイミングでLambdaを起動するように設定します。
これにより『押したらLamba関数が起動するボタン』を実現します。
マネジメントコンソール側でLambda > 関数を作成を押下します。
関数名/ランタイムは何でもよいです。
関数作成後、作成したLambda関数 > 設定 > トリガーからLambdaを起動するトリガーを設定します。
- AWS IoT
- カスタムIoTルール
- 新規のルールを作成
- ルールクエリステートメントは SELECT * FROM "/RaspberryPiPicoW/temperature" と設定
これでLambda関数にIoT Coreで[/RaspberryPiPicoW/temperature]のメッセージを受信したときに起動するトリガーが設定されました。
最後にLambdaがちゃんとメッセージ受信のタイミングで起動することをCloudWatchログから確認。
いいかんじ!
おわりに
以上、『押したらLambda関数が起動するボタン』の実装でした。
Lambdaが起動できればAWS上の操作はほぼ何でもできるので、今回の構成を応用した『押したらAWS上でXXXするボタン』は色々できるかなと思います。
ちょっとした興味でPico Wを触ってみましたがIoTの手触り感、得も言われぬ満足感があります。
この調子で引き続きIoTを触っていきたいなと思いました。今回は以上です。ありがとうございました!
この記事は私が書きました
松原 唯介
記事一覧2024年4月入社 サービスG所属
