API Gateway+AWS Lambda(C#)でHTTPヘッダーやパスパラメータなどの情報を取得する方法

2020.12.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

API Gateway + AWS Lambda(C#)でHTTPヘッダーやパスパラメータ、ステージ変数などの各種情報を取得する方法を調べました。API Gatewayの設定でプロキシ統合にチェックを入れた場合の方法です。言語はC#で.NET Coreのバージョンは3.1です。

参照しているパッケージ

Lambdaのパッケージは以下を参照しています。

  • Amazon.Lambda.APIGatewayEvents 2.4.0
  • Amazon.Lambda.Core 1.2.0
  • Amazon.Lambda.Serialization.SystemTextJson 2.1.0
  • AWSSDK.APIGateway 3.5.2.15
  • AWSSDK.Lambda 3.5.5.3

以下がLambdaファンクションのテストコードです。クエリストリング、パスパラメータ、ステージ変数を入れて試しましたが取得できていました。

using Amazon.Lambda.Core;
using System;
using System.Net;
using System.Text.Json;
using System.Text.Json.Serialization;
using Amazon.Lambda.APIGatewayEvents;
using System.Text;

[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace Test
{
    public class Function
    {
        public APIGatewayProxyResponse FunctionHandler(Request request, ILambdaContext context)
        {
            Console.WriteLine("resource:" + request.Resource);
            Console.WriteLine("path:" + request.Path);
            Console.WriteLine("httpMethod:" + request.HttpMethod);
            Console.WriteLine("headers:" + request.Headers.ToString());
            Console.WriteLine("multiValueHeaders:" + request.MultiValueHeaders.ToString());
            Console.WriteLine("queryStringParameters:" + request.QueryStringParameters);
            Console.WriteLine("multiValueQueryStringParameters:" + request.MultiValueQueryStringParameters);
            Console.WriteLine("pathParameters:" + request.PathParameters);
            Console.WriteLine("stageVariables:" + request.StageVariables);
            Console.WriteLine("requestContext:" + request.RequestContext);
            Console.WriteLine("body:" + request.Body);
            Console.WriteLine("isBase64Encoded:" + request.IsBase64Encoded);
            return new APIGatewayProxyResponse
            {
                StatusCode = (int)HttpStatusCode.OK
            };
        }
    }

    public class Request
    {

        [JsonPropertyName("resource")]
        public string Resource { get; set; }

        [JsonPropertyName("path")]
        public string Path { get; set; }

        [JsonPropertyName("httpMethod")]
        public string HttpMethod { get; set; }

        [JsonPropertyName("headers")]
        public JsonElement Headers { get; set; }

        [JsonPropertyName("multiValueHeaders")]
        public JsonElement MultiValueHeaders { get; set; }

        [JsonPropertyName("queryStringParameters")]
        public JsonElement QueryStringParameters { get; set; }

        [JsonPropertyName("multiValueQueryStringParameters")]
        public JsonElement MultiValueQueryStringParameters { get; set; }

        [JsonPropertyName("pathParameters")]
        public JsonElement PathParameters { get; set; }

        [JsonPropertyName("stageVariables")]
        public JsonElement StageVariables { get; set; }

        [JsonPropertyName("requestContext")]
        public JsonElement RequestContext { get; set; }

        [JsonPropertyName("body")]
        public string Body { get; set; }

        [JsonPropertyName("isBase64Encoded")]
        public Boolean IsBase64Encoded { get; set; }
    }
}

以下のドキュメントを参考にしました。

プロキシ統合のための Lambda 関数の入力形式