🟨

ServerlessLandのテンプレートからIoTCoreにMQTTメッセージを連携するPOST APIをさっと作ってみる

2022/12/01に公開

普段は主にREST APIの設計・実装、AWSインフラの設計・構築を担当しています。

2022年11月に行われた(記事執筆時点では行われている)re:Invent2022に参加しています。
これまでserverlessアーキテクチャについて深く学ぶことがなかったのですが、今回のre:Inventでserverlessアーキテクチャに関するセッションに参加する度、設計時の考え方にカルチャーショックを受けました。
(既存のLambdaに実装したくなるけど、新しいLambda作るのか!!とか、StepFunctionすげーーーーー!!とかです)

今回、いくつかのserverlessアーキテクチャに関するセッションにおいてServerlessLandという入門サイトが紹介されていたので、非常に気になり試しに簡単なサンプルをAWS環境に構築してみました。

ServerlessLandとは

AWS基盤でのサーバレスアーキテクチャに関する最新の情報、ブログ記事、IaCのテンプレートや学習教材が掲載されているサイトです。

Serverlessland.com
https://serverlessland.com/

SAM, CDK, Serverless Framework, Terraform を使用したサーバレスアーキテクチャを構築するためのサンプルテンプレートやコードが豊富に掲載されています。
例えばAPI Gateway、ラムダ関数、Dynamo DBといった基本的なアーキテクチャや、LambdaとRDSの間にRDSプロキシを用意するアーキテクチャ等、様々なパターンが用意されています。
また、サーバレスアーキテクチャのオーケストレーションでのパターンとして重要なサービスである、AWS Step Functionsを使用したワークフローのサンプルも多数(記事執筆時点で48本!)掲載されています。

やること

API Gateway, Lambda, IoTCore を結合したサーバレスアーキテクチャをAWS CDKのテンプレートから作ってみました。

https://serverlessland.com/patterns/apigw-lambda-iot-cdk

前提条件

AWS CDKをインストールされていない方はこちらを参照してください。
https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/getting_started.html#getting_started_install:~:text=Prerequisites-,Install the AWS CDK

やったこと

ServerlessLandのテンプレートをクローン

ServerlessLandのページから構築したいアーキテクチャを見つけます。
https://serverlessland.com/patterns?framework=CDK

各テンプレートはserverless-patternsリポジトリから取得できます。

serverless-patternsリポジトリの取得

git clone https://github.com/aws-samples/serverless-patterns/ 
cd serverless-patterns/apigw-lambda-iot-cdk
  • IoTCoreにMQTTメッセージを送るソースコードはpythonで書かれており、src/main.pyにあります。(テンプレート紹介のページではNode.jsと書かれていますが、CDK部分がNode.jsなだけでLambdaのコードはpythonです。。)
  • インフラ構築のコードはlib/apigw-lambda-iot-stack.tsで定義されておいます。
    • Function, PolicyStatement, LambdaRestApi のインスタンスにてそれぞれ、Lambda関数、Lambda関数にアタッチするIAMポリシー、Lambda関数と結合したAPI-Gateway(REST API)を定義しています。

AWS環境へのデプロイ

デプロイの前にcdk bootstrapを実行します。
CDKによるデプロイのための必要な権限やS3バケットを事前に作成してくれます。

cdk bootstrapの実行

cdk bootstrap --profile sandbox
 ⏳  Bootstrapping environment aws://{アカウント/ap-northeast-1...
Trusted accounts for deployment: (none)
Trusted accounts for lookup: (none)
Using default execution policy of 'arn:aws:iam::aws:policy/AdministratorAccess'. Pass '--cloudformation-execution-policies' to customize.
CDKToolkit: creating CloudFormation changeset...
 ✅  Environment aws://{アカウントID}/ap-northeast-1 bootstrapped.

profile オプションを指定することで、デプロイ先のAWSアカウントを指定します。
事前に ~/.aws/credentials に設定しておく必要があります。

以下のコマンドにより、デプロイされるリソースのCloudFormationテンプレートを確認できます。

cdk bootstrap --show-template > bootstrap-template.yaml

AWS環境にデプロイしてみます。

デプロイ

cdk deploy --profile sandbox

...(中略)...
ApigwLambdaIotStack: creating CloudFormation changeset...

 ✅  ApigwLambdaIotStack

✨  Deployment time: 146.41s

Outputs:
ApigwLambdaIotStack.iotPublishApiEndpoint6C3FF294 = https://xxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod/
Stack ARN:
...(略)...

デプロイされました。簡単です。
作成されたエンドポイントが表示されるのでメモしておきます。

AWSコンソールを確認すると、API Gatewayのエンドポイント、Lambda関数が作成されています。

API Gateway

Lambda

動作確認

動作確認してみます。

cdk deploy --profile sandboxcurl -X POST -H "Content-Type: application/json" \
    -d '{"topic": "dt", "payload": {"temperature" : 97.88}}' \
    {メモしたエンドポイント}/cmds

IoTCoreのMQTTテストクライアント

無事、IoTCoreのMQTTクライアントでメッセージを受け取ることができました。

余談ですが、Propertiesの項目はIoTCoreのMessage BrokerがMQTT 5に対応したことにより追加されている項目のようです。
MQTT 5でメッセージの有効期限を設定してpublishすると、ここから確認ができることと思われます。
こちらも検証してみたいです。

https://aws.amazon.com/jp/about-aws/whats-new/2022/11/aws-iot-general-availability-version-5-mqtt-message-broker-mqtt5/

片付け

一通り遊んだ後は作成したリソースを削除します。

cdk destroy --profile sandbox

Are you sure you want to delete: ApigwLambdaIotStack (y/n)? y
ApigwLambdaIotStack: destroying...

 ✅  ApigwLambdaIotStack: destroyed

まとめ

Serverlessなアーキテクチャにおいては、何らかのIaCフレームワークを利用していつでも誰でもどの環境でも同じアーキテクチャを再現できるようにしておくことが重要です。
AWS CDKはTypeScriptやPythonなどのプログラミング言語を利用してアーキテクチャを定義できるIaCフレームワークです。
IaCのフレームワークの種類は多く学習コストが気になるところですが、テンプレートをいくつか試してみたり、ServerlessLandの学習コンテンツ(英語メインですが...)から入門するのも良いかと思います。

以上です。

GitHubで編集を提案
NCDCエンジニアブログ

Discussion