怠惰系エンジニアのメモ帳

勉強した内容をメモしていきます。解説ブログではないので悪しからず。

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 で定義した「本体マッピングテンプレート」になるようです。

f:id:tk5_21:20180112000146p:plain

上記マッピングテンプレートは

{
  "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');
};

クライアント側から、上記APIを呼び出します。

  • 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マッピングされています。

イベントソースによって設定値を調べる必要がある

他にも DynamoDBSNSS3Kinesis などからLambda関数を呼び出すことが可能ですが、 呼び出し元のイベントソースによって event に設定される中身は異なります。 そのため、event にどのような値が設定されるかは都度調べる必要があります。

まとめ

  • event は、イベントソースから渡されるデータが設定される。
  • event は、object 型(何でも型)である。
  • API Gateway の場合には「本体マッピングテンプレート」で定義した内容が設定される。
    • イベントソースが異なれば、event の中身も異なる。(ので都度調べる必要がある)

Spring Web Flux + Thymeleaf で画面出力する

過去に同じことやろうとしてダメだったので、リベンジ。

Spring Web Flux + Thymeleaf で画面出力したかった

内容に間違いなどがあれば指摘をお願いします。

やりたいこと

前回と同じく、SpringWebFluxThymeleaf で GetWild する。
ルーティングはアノテーションベースと、RouterFunctionsの2パターンで実施。

結論

先に結論を書くと、

  • RouterFunctionsの場合には、ServerResponse.BodyBuilder#render メソッドに、表示するビュー名を渡す。
    • 表示に必要なデータは、render メソッドの第二引数に指定する。
  • アノテーションベースの場合にはメソッドの戻り値を Mono<String> にして、ビュー名を Mono でラップする。
    • 表示に必要なデータは、SpringWebMvc の時と同じように Model 等に設定する。

です。

続きを読む