はじめに
- アレ?っと思って調べる時間をもしかしたら若干短縮できるかもしれない簡単なtips
- なんか調べても見つからなかったのでメモとして残しておく・・
- Lambda関数をTypeScriptで書くときの、handlerのeventの型定義に関する内容です
aws-lambda ライブラリが定義するIoTEvent型
aws-lambda
をimportすることで、handler関数のeventの型を指定することができます。
AWS IoTのイベントの場合、型は IoTEvent
が用意されています。
import type { IoTEvent } from "aws-lambda";
ある程度型の定義が決められている場合は特に考えることは無いのですが、
IoTEvent
は、内容を任意に定義できる型になっており、
仕様は
type IoTEvent<T = never> = string | number | T
です。
なので、Objectとして利用したい場合は T
の部分を自分で定義してあげる必要があります。
使用例
topicに送信されるメッセージの他に、topic文字列、証明書IDを一緒に受け取りたい時の例です。
ルールのSQLステートメント
下記のように定義した場合を想定します。
SELECT *, topic() as topic, principal() as certificateId FROM 'sdk/test/js'
型の定義
ペイロードのtype(or interface)をEventPayload
として定義した時、IoTEvent<EventPayload>
になります。
eventはstring, numberの場合もあるので、それ以外の場合としてハンドリングしてあげて
topic, message, certificateId
を参照します。
type EventPayload = {
topic: string;
message: Message;
certificateId: string;
};
export async function handler(
event: IoTEvent<EventPayload>,
_context: Context | undefined,
callback: Callback,
) {
// IoTEvent は number, string, object のいずれかの型を取る
if (typeof event === "string" || typeof event === "number") {
callback(null, "Invalid event type.");
return;
}
const { topic, message, certificateId } = event;
console.log(`topic: ${topic}`);
console.log(`certificateId: ${certificateId}`);
console.log(`message: ${message}`);
...
以上になります。