ENGINEER BLOG ENGINEER BLOG
  • 公開日
  • 最終更新日

【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)の関数を起動

構成図1.png

前編ではローカルで以下の処理を行う機器を作成しました。

  • スイッチを押したらLEDが点灯

構成図2.png

参考資料

今回の内容のうち、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]名称の モノが作成されて、モノに証明書がアタッチされ、証明書にポリシーがアタッチされていることが確認できます。

モノ モノ.png

証明書/ポリシー ポリシー.png

引き続きビルダーセンターの手順を進めます。

証明書を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ディレクトリにアップロード

新しいディレクトリ.png

certsにアップロード.png

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側で[現在のスクリプトを実行]で処理を起動した場合はシェルに送信メッセージが表示されます。 シェルに表示されるメッセージ送信ログ_mask.png

マネジメントコンソールでIoT Core > MQTTテストクライアント > トピックをサブスクライブする > トピックのフィルターに[/RaspberryPiPicoW/temperature]と入力し、サブスクライブを押下します。

スクリーンショット 2025-09-09 20.45.13.png

5秒おきに送信されるメッセージが確認できればOKです。 スクリーンショット 2025-09-09 20.45.35.png

ボタンを押したら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にメッセージが送信されるようになりました。

ボタンをぽちり。 ボタンぽちー.jpg

5秒おきではなくボタンを押したタイミングでメッセージを受信! 押した時間にMQTT.png

IoT Coreのメッセージ受信からLambdaを起動するように設定

続いてIoT CoreがMQTTメッセージを受け取ったタイミングでLambdaを起動するように設定します。
これにより『押したらLamba関数が起動するボタン』を実現します。

マネジメントコンソール側でLambda > 関数を作成を押下します。
関数名/ランタイムは何でもよいです。

スクリーンショット 2025-09-09 21.32.35.png

関数作成後、作成したLambda関数 > 設定 > トリガーからLambdaを起動するトリガーを設定します。

スクリーンショット 2025-09-09 21.35.09.png

  • AWS IoT
  • カスタムIoTルール
  • 新規のルールを作成
  • ルールクエリステートメントは SELECT * FROM "/RaspberryPiPicoW/temperature" と設定

これでLambda関数にIoT Coreで[/RaspberryPiPicoW/temperature]のメッセージを受信したときに起動するトリガーが設定されました。

最後にLambdaがちゃんとメッセージ受信のタイミングで起動することをCloudWatchログから確認。 ボタン押下でLambda起動ログ.png いいかんじ!

おわりに

以上、『押したらLambda関数が起動するボタン』の実装でした。
Lambdaが起動できればAWS上の操作はほぼ何でもできるので、今回の構成を応用した『押したらAWS上でXXXするボタン』は色々できるかなと思います。

ちょっとした興味でPico Wを触ってみましたがIoTの手触り感、得も言われぬ満足感があります。
この調子で引き続きIoTを触っていきたいなと思いました。今回は以上です。ありがとうございました!

この記事は私が書きました

松原 唯介

記事一覧

2024年4月入社 サービスG所属

松原 唯介

この記事を共有する

クラウドのご相談

CONTACT

クラウド導入や運用でお悩みの方は、お気軽にご相談ください。
専門家がサポートします。

サービス資料ダウンロード

DOWNLOAD

ビジネスをクラウドで加速させる準備はできていますか?
今すぐサービス資料をダウンロードして、詳細をご確認ください。