AWS Lambdaメモ -ハンドラの引数eventの中身-
今回はLambda関数として実行されるハンドラの引数 event
についてのメモ。
※Node.jsでLambda関数を作成する場合を想定しています。
間違っている場合はご指摘いただけると幸いです。
event
が何者なのか分からない
Lambda関数の作成はNode.jsに落ち着いたのですが、 NodeでLambda関数を作成する場合には以下のような引数を3つ受け取るハンドラを定義する必要があります。
exports.myHandler = (event, context, callback) => { // 処理 }
これら3つの引数について、公式では以下のように説明されています。
- event — AWS Lambda はこのパラメーターを使用してイベントデータをハンドラーに渡します。
- context — AWS Lambda はこのパラメーターを使用して、実行中の Lambda 関数のランタイム情報をハンドラーに提供します。詳細については、「Context オブジェクト (Node.js)」を参照してください。
- callback – コールバックオプションは呼び出し元に情報を返すために使用できます。使用しない場合戻り値は null です。詳細については、「コールバックパラメーターを使用する」を参照してください。
Lambda 関数ハンドラー (Node.js) - より引用
「何言ってる分からねぇ...。結局 event
って何者。」
静的型付け言語大好きマンなので、正体不明の値が来るのがモヤっとするといいますか...。
結論
先に結論を述べてしまうと、Lambda関数の呼び出し元によって異なる です。
※型としては object
型になるようです。(要は何でも型)
呼び出し元によって異なる、とは
Lambda関数は何かをキッカケにして呼び出されるので、必ず呼び出し元が存在します。
呼び出し元の例で言えば API Gateway
であったり、DynamoDB
であったり。
(Lambdaでは、これらの呼び出し元を イベントソース と呼んでいるようです)
- event — AWS Lambda はこのパラメーターを使用してイベントデータをハンドラーに渡します。
イベントソースのから渡されるデータ、なので イベントデータ という解釈をしています。
今回はイベントソースとして API Gateway
を例に挙げます。
※ API Gateway
は、RESTful APIを作成するサービスです。
API Gateway
の場合に設定される event
の中身
イベントソースを API Gateway
にした場合、ハンドラの引数 event
に設定されるのは
API Gateway
で定義した「本体マッピングテンプレート」になるようです。
{ "method": "$context.httpMethod", "pathParams": "$input.params('userId')", "body": $input.json('$') }
と定義しており、
- 1行目はHTTPメソッド名
- 2行目はパス・クエリ文字・ヘッダーからパラメータが
userId
の値を取得 - 3行目はボディ部のJSONを取得
となっています。
仮にこのAPIを /app/{userId}
という形式でアクセス可能にし、以下のLambda関数を実行させるとします。
exports.handler = (event, context, callback) => { console.log("event type:", typeof event); console.log("event JSON:", JSON.stringify(event, null, 2)); callback(null, 'Hello from Lambda'); };
- POSTメソッド。
- URLは
/app/0
とする。 - 以下のJSONをボディ部に含める。
{ "name": "Jane", "age": 20 }
呼び出した結果のログは以下の通り。
2018-01-11T15:21:14.555Z xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx event type: object 2018-01-11T15:21:14.559Z xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx event JSON: { "method": "POST", "pathParams": "0", "body": { "name": "Jane", "age": 20 } }
ちゃんとテンプレートに定義した形式で event
にマッピングされています。
イベントソースによって設定値を調べる必要がある
他にも DynamoDB
や SNS
、S3
、Kinesis
などからLambda関数を呼び出すことが可能ですが、
呼び出し元のイベントソースによって event
に設定される中身は異なります。
そのため、event
にどのような値が設定されるかは都度調べる必要があります。
まとめ
event
は、イベントソースから渡されるデータが設定される。event
は、object
型(何でも型)である。API Gateway
の場合には「本体マッピングテンプレート」で定義した内容が設定される。- イベントソースが異なれば、
event
の中身も異なる。(ので都度調べる必要がある)
- イベントソースが異なれば、
Spring Web Flux + Thymeleaf で画面出力する
過去に同じことやろうとしてダメだったので、リベンジ。
Spring Web Flux + Thymeleaf で画面出力したかった
内容に間違いなどがあれば指摘をお願いします。
やりたいこと
前回と同じく、SpringWebFlux
と Thymeleaf
で GetWild する。
ルーティングはアノテーションベースと、RouterFunctionsの2パターンで実施。
結論
先に結論を書くと、
- RouterFunctionsの場合には、
ServerResponse.BodyBuilder#render
メソッドに、表示するビュー名を渡す。- 表示に必要なデータは、
render
メソッドの第二引数に指定する。
- 表示に必要なデータは、
- アノテーションベースの場合にはメソッドの戻り値を
Mono<String>
にして、ビュー名をMono
でラップする。- 表示に必要なデータは、
SpringWebMvc
の時と同じようにModel
等に設定する。
- 表示に必要なデータは、
です。
続きを読む