ServerlessLandのテンプレートからIoTCoreにMQTTメッセージを連携するPOST APIをさっと作ってみる
普段は主にREST APIの設計・実装、AWSインフラの設計・構築を担当しています。
2022年11月に行われた(記事執筆時点では行われている)re:Invent2022に参加しています。
これまでserverlessアーキテクチャについて深く学ぶことがなかったのですが、今回のre:Inventでserverlessアーキテクチャに関するセッションに参加する度、設計時の考え方にカルチャーショックを受けました。
(既存のLambdaに実装したくなるけど、新しいLambda作るのか!!とか、StepFunctionすげーーーーー!!とかです)
今回、いくつかのserverlessアーキテクチャに関するセッションにおいてServerlessLandという入門サイトが紹介されていたので、非常に気になり試しに簡単なサンプルをAWS環境に構築してみました。
ServerlessLandとは
AWS基盤でのサーバレスアーキテクチャに関する最新の情報、ブログ記事、IaCのテンプレートや学習教材が掲載されているサイトです。
Serverlessland.com
SAM, CDK, Serverless Framework, Terraform を使用したサーバレスアーキテクチャを構築するためのサンプルテンプレートやコードが豊富に掲載されています。
例えばAPI Gateway、ラムダ関数、Dynamo DBといった基本的なアーキテクチャや、LambdaとRDSの間にRDSプロキシを用意するアーキテクチャ等、様々なパターンが用意されています。
また、サーバレスアーキテクチャのオーケストレーションでのパターンとして重要なサービスである、AWS Step Functionsを使用したワークフローのサンプルも多数(記事執筆時点で48本!)掲載されています。
やること
API Gateway, Lambda, IoTCore を結合したサーバレスアーキテクチャをAWS CDKのテンプレートから作ってみました。
前提条件
AWS CDKをインストールされていない方はこちらを参照してください。
やったこと
ServerlessLandのテンプレートをクローン
ServerlessLandのページから構築したいアーキテクチャを見つけます。
各テンプレートは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すると、ここから確認ができることと思われます。
こちらも検証してみたいです。
片付け
一通り遊んだ後は作成したリソースを削除します。
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の学習コンテンツ(英語メインですが...)から入門するのも良いかと思います。
以上です。
NCDC株式会社( ncdc.co.jp/ )のエンジニアチームです。 募集中のエンジニアのポジションや、採用している技術スタックの紹介などはこちら( github.com/ncdcdev/recruitment )をご覧ください! ※エンジニア以外も記事を投稿することがあります
Discussion