最近仕事でAWSに触っています。
また、12/1にAWSのLambdaがC#に対応したこともあり、Lambdaで色々遊んでます。
今回の投稿では、HTTPリクエストを受けたAPI GatewayがLambdaをフックしてレスポンスを返す、ということをやってみます。
準備
AWS Toolkitを使い、.NET Coreアプリケーションとして開発します。 いくつかの投稿で詳しく説明されています。
Lambda
AWS Lambda Projectを作成し、Lambda Functionを実装します。
ここではParamクラスをリクエストとして受け取り、そのままレスポンスとして返すだけの簡単なLambdaを定義します。
- JSONでリクエスト・レスポンスするので、シリアライゼーションに
Amazon.Lambda.Serialization.Json.JsonSerializer
を使います。 - 何も実装・継承していない素のクラスで、Lambdaで呼び出すハンドラ(この場合LambdaTestHandler)をPublish時に指定します。
using Amazon.Lambda.Core; namespace LambdaTest { public class LambdaTestFunction { [LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))] public Param LambdaTestHandler(Param input, ILambdaContext context) { return input; } public class Param { public string PathValue { get; set; } public string QueryValue { get; set; } public string HeaderValue { get; set; } } } }
API Gateway
次にコンソール画面から、"test-api"というAPIを作成していきます。
test-apiでは、GETメソッドを定義し、パスパラメータ・クエリパラメータ・リクエストヘッダの値をJSON形式にしてLambda(先程作成したLambdaTestFunction)へ渡します。
パスパラメータはブラケットでくくられたリソース(ここでは、/{pathparam})として定義します。
メソッドリクエストではLmabdaの入力値として使用したいパラメータを定義します。
- pathparam、queryparam、headerparamとします。
統合リクエストではJSON形式でLambdaへ渡るようにマッピングを定義します。
- Content-Typeはapplication/jsonとします。
- テンプレートでは、
$input.params('メソッドリクエストで定義した名前')
でパラメータへアクセスできます。
{ "PathValue": "$input.params('pathparam')", "QueryValue": "$input.params('queryparam')", "HeaderValue": "$input.params('headerparam')" }
最後にテストをすると、JSONの値が返ってくるようになります。