け日記

SIerから転職したWebアプリエンジニアが最近のITのキャッチアップに四苦八苦するブログ

AWS API GatewayでフックされるLambdaをC#で書いてみる

最近仕事でAWSに触っています。
また、12/1にAWSのLambdaがC#に対応したこともあり、Lambdaで色々遊んでます。

AWS Lambda Supports C#

今回の投稿では、HTTPリクエストを受けたAPI GatewayがLambdaをフックしてレスポンスを返す、ということをやってみます。

準備

AWS Toolkitを使い、.NET Coreアプリケーションとして開発します。 いくつかの投稿で詳しく説明されています。

qiita.com

blog.shibayan.jp

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)へ渡します。 f:id:ohke:20161229092432j:plain

  • パスパラメータはブラケットでくくられたリソース(ここでは、/{pathparam})として定義します。
    f:id:ohke:20161229092606j:plain

  • メソッドリクエストではLmabdaの入力値として使用したいパラメータを定義します。

    • pathparam、queryparam、headerparamとします。 f:id:ohke:20161229092625j:plain:w350
  • 統合リクエストではJSON形式でLambdaへ渡るようにマッピングを定義します。

    • Content-Typeはapplication/jsonとします。
    • テンプレートでは、$input.params('メソッドリクエストで定義した名前')でパラメータへアクセスできます。
{
    "PathValue": "$input.params('pathparam')",
    "QueryValue": "$input.params('queryparam')",
    "HeaderValue": "$input.params('headerparam')"
}
  • レスポンスは何も設定しません。
    • Lambda側でJSONリアライザを指定しているので、レスポンスクラス(ここではParam)がJSON形式で返されます。

最後にテストをすると、JSONの値が返ってくるようになります。 f:id:ohke:20161229092738j:plain:w400

まとめ

簡単なJSONエコー?ではありますが、EC2などのサーバを一切使わずに、Web APIを提供できるようになりました。