3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

株式会社ACCESSAdvent Calendar 2024

Day 9

TypeScriptで書いたLambda関数でAWS IoTのイベントを受ける時の型について

Last updated at Posted at 2024-12-08

はじめに

  • アレ?っと思って調べる時間をもしかしたら若干短縮できるかもしれない簡単な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}`);

  ...

以上になります。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?