Невозможно найти шаблон сопоставления шлюза API для Golang

Я создал веб-перехватчик для Twilio на AWS API Gateway, который отправляет запрос в application/x-www-form-urlencodedТип содержимого. Я не могу написать или найти шаблон отображения для Голанга. Я слежу за этим документом - ссылкой для создания шлюза API. В настоящее время я использую шаблон ниже, используемый в документе -

Шаблон сопоставления шлюза API, который я использую:

#set($httpPost = $input.path('$').split("&"))
{
#foreach( $kvPair in $httpPost )
 #set($kvTokenised = $kvPair.split("="))
 #if( $kvTokenised.size() > 1 )
   "$kvTokenised[0]" : "$kvTokenised[1]"#if( $foreach.hasNext ),#end
 #else
   "$kvTokenised[0]" : ""#if( $foreach.hasNext ),#end
 #end
#end
}

JSON, созданный шаблоном сопоставления шлюза API:

{
    "ToCountry": "US",
    "ToState": "UT",
    "SmsMessageSid": "SMed65aaxxxxxx5c7938df",
    "NumMedia": "0",
    "ToCity": "",
    "FromZip": "",
    "SmsSid": "SMed65aaxxxxxx938df",
    "FromState": "",
    "SmsStatus": "received",
    "FromCity": "",
    "Body": "Testing+again",
    "FromCountry": "IN",
    "To": "%2B1xxxxxx848",
    "ToZip": "",
    "NumSegments": "1",
    "MessageSid": "SMed65aa5dxxxx7938df",
    "AccountSid": "AC23xxxd98",
    "From": "%2B9xxxxxx90",
    "ApiVersion": "2010-04-01"
}

Лямбда-код (Голанг)

func Handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {

    fmt.Printf("%+v\n", request)
    fmt.Println("request Body:", request.Body)
    fmt.Println("request HTTPMethod:", request.HTTPMethod)
    fmt.Println("request Headers:", request.Headers)
    fmt.Println("request:", request.RequestContext.RequestID)
}

Журналы шлюза API

(442f74ed-39e5-4372-bf85-42bf814f802f) Extended Request Id: EIaYxxMF3lQ=
(442f74ed-39e5-4372-bf85-42bf814f802f) Method request path: {}

(442f74ed-39e5-4372-bf85-42bf814f802f) Method request query string:    {}

(442f74ed-39e5-4372-bf85-42bf814f802f) Method request headers: {Accept=*/*, Cache-Control=max-age=259200, X-Twilio-Signature=ZWg2v7xxxfnBlPyxE=, User-Agent=TwilioProxy/1.1, X-Forwarded-Proto=https, I-Twilio-Idempotency-Token=e5d1xxx221bc4, X-Forwarded-For=54.xxxx.227, Host=xxxxxxx.execute-api.us-east-1.amazonaws.com, X-Forwarded-Port=443, X-Amzn-Trace-Id=Root=1-5de67103-7994dbxxx0dbd872, Content-Type=application/x-www-form-urlencoded}}  

(442f74ed-39e5-4372-bf85-42bf814f802f) Method request body before transformations: ToCountry=US&ToState=UT&SmsMessageSid=SMed65axxx595c7938df&NumMedia=0&ToCity=&FromZip=&SmsSid=SMed65aa5xxccdd595c7938df&FromState=&SmsStatus=received&FromCity=&Body=Good+Day&FromCountry=IN&To=%2Bxxxx848&ToZip=&NumSegments=1&MessageSid=SMed65axxxd595c7938df&AccountSid=AC23a2cbxxx65a66d98&From=%2B9xxxx5590&ApiVersion=2010-04-01

(442f74ed-39e5-4372-bf85-42bf814f802f) Endpoint request URI: https://lambda.us-east-1.amazonaws.com/2015-03-31/functions/arn:aws:lambda:us-east-1:6xxxxxxxx6:function:Twillio_connector_test/invocations

(442f74ed-39e5-4372-bf85-42bf814f802f) Endpoint request headers: {x-amzn-lambda-integration-tag=442f74ed-39e5-4372-bf85-42bf814f802f, Authorization=*****27aa7a, X-Amz-Date=20191203T142819Z, x-amzn-apigateway-api-id=xxxxx, X-Amz-Source-Arn=arn:aws:execute-api:us-east-1:69xxxx886:xxxxxxx/v1/POST/message, Accept=application/x-www-form-urlencoded, User-Agent=AmazonAPIGateway_f7504e7yc6, X-Amz-Security-Token=IQoJbxxxhQH [TRUNCATED]

(442f74ed-39e5-4372-bf85-42bf814f802f) Endpoint request body after transformations: 
    {
        "ToCountry": "US",
        "ToState": "UT",
        "SmsMessageSid": "SMed65aaxxxxxx5c7938df",
        "NumMedia": "0",
        "ToCity": "",
        "FromZip": "",
        "SmsSid": "SMed65aaxxxxxx938df",
        "FromState": "",
        "SmsStatus": "received",
        "FromCity": "",
        "Body": "Good+Day",
        "FromCountry": "IN",
        "To": "%2B1xxxxxx848",
        "ToZip": "",
        "NumSegments": "1",
        "MessageSid": "SMed65aa5dxxxx7938df",
        "AccountSid": "AC23xxxd98",
        "From": "%2B9xxxxxx90",
        "ApiVersion": "2010-04-01"
    }

(442f74ed-39e5-4372-bf85-42bf814f802f) Endpoint response headers: {Date=Tue, 03 Dec 2019 14:28:20 GMT, Content-Type=application/json, Content-Length=43, Connection=keep-alive, x-amzn-RequestId=168394b7-c152-4434-af02-03a03b6f3090, x-amzn-Remapped-Content-Length=0, X-Amz-Executed-Version=$LATEST, X-Amzn-Trace-Id=root=1-5de67103-7994dbxxxxbe30dbd872;sampled=0}

(442f74ed-39e5-4372-bf85-42bf814f802f) Endpoint response body before transformations: "Lambda function is completed successfully"

(442f74ed-39e5-4372-bf85-42bf814f802f) Method response body after transformations: Lambda function is completed successfully

(442f74ed-39e5-4372-bf85-42bf814f802f) Method response headers: {X-Amzn-Trace-Id=Root=1-5de67103-7994dbxxxxxxd872;Sampled=0, Content-Type=application/xml}

Журналы лямбда-функции

request: {   map[] map[] map[] map[] map[] map[] {    {           }  map[]  } Good Day false}
{Resource: Path: HTTPMethod: Headers:map[] MultiValueHeaders:map[] QueryStringParameters:map[] MultiValueQueryStringParameters:map[] PathParameters:map[] StageVariables:map[] RequestContext:{AccountID: ResourceID: Stage: RequestID: Identity:{CognitoIdentityPoolID: AccountID: CognitoIdentityID: Caller: APIKey: AccessKey: SourceIP: CognitoAuthenticationType: CognitoAuthenticationProvider: UserArn: UserAgent: User:} ResourcePath: Authorizer:map[] HTTPMethod: APIID:} Body:Good Day IsBase64Encoded:false}
request Body: Good Day
request HTTPMethod: 
request Headers: map[]

В журналах Lambda я вижу, что только тело созданного JSON сопоставляется с events.APIGatewayProxyRequestа не другие параметры. И причина в том, что JSON, созданный шаблоном сопоставления, не в формате ниже -

The events.APIGatewayProxyRequest parameter in golang:
// APIGatewayProxyRequest contains data coming from the API Gateway proxy

type APIGatewayProxyRequest struct {
    Resource                        string                        `json:"resource"` // The resource path defined in API Gateway
    Path                            string                        `json:"path"`     // The url path for the caller
    HTTPMethod                      string                        `json:"httpMethod"`
    Headers                         map[string]string             `json:"headers"`
    MultiValueHeaders               map[string][]string           `json:"multiValueHeaders"`
    QueryStringParameters           map[string]string             `json:"queryStringParameters"`
    MultiValueQueryStringParameters map[string][]string           `json:"multiValueQueryStringParameters"`
    PathParameters                  map[string]string             `json:"pathParameters"`
    StageVariables                  map[string]string             `json:"stageVariables"`
    RequestContext                  APIGatewayProxyRequestContext `json:"requestContext"`
    Body                            string                        `json:"body"`
    IsBase64Encoded                 bool                          `json:"isBase64Encoded,omitempty"`
}

Я был бы признателен, если бы кто-нибудь мог указать мне на соответствующий документ. Предложения приветствуются.

1 ответ

Похоже, вы пытаетесь использовать подпись обработчика интеграции прокси для работы с событием пользовательской интеграции Lambda на определенном ресурсе. Я не верю, что шаблоны отображения актуальны в случае интеграции с прокси.

Лямбда-интеграция

Есть два основных способа использования Lambda для ответа на запросы шлюза API. Первый - использовать лямбда-интеграцию. Этот метод обычно включает преобразование запроса в настраиваемое событие Lambda на ваше усмотрение. Большая часть тяжелой работы выполняется API Gateway. Например, вы можете преобразовать параметр запроса в строку, а затем передать эту строку в обработчик Lambda.

func handler(e string) (<something>, error) {}

Или вы можете взять значение из заголовка и часть из URL-адреса, а затем создать объект JSON для подачи в свой обработчик.

type event struct {
    URLPart string `json:"url_part"`
    QueryPart string `json:"query_part"`
}

func handler(e *event) (<something>, error) {} 

Основные моменты

  • Вы контролируете событие запроса, которое полностью попадает в вашу функцию
  • Вы полностью контролируете ответ, возвращаемый вашей лямбдой
  • Более тяжелая работа выполняется API-шлюзом

Интеграция с прокси

Затем идет интеграция с прокси. Интеграция с прокси преобразует каждый запрос, отправляемый к ресурсу (обычно это ЛЮБОЙ метод на ресурсе {proxy+}), который вы указываете в шлюзе API как тип структуры events.APIGatewayProxyRequest, определенный в модуле событий. Это избавляет вас от необходимости преобразовывать ваши запросы в конкретные события, которые вы должны указать, и удаляет тяжелую нагрузку на запрос из API-шлюза и передает его в обработчик Lambda.

У обработчика интеграции прокси должна быть следующая подпись:

func handler(c context.Context, e events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {}

Основные моменты

  • Запрос и ответ всегда одинаковы: events.APIGatewayProxyRequest и events.APIGatewayProxyResponse.
  • В API Gateway требуется гораздо меньше работы.
  • Обычно используется, когда вы уже много вложили в решение Golang и не хотите разбивать его на отдельные части ресурсов для интеграции лямбда.

Вот ссылка, которая объясняет больше различий и некоторые соображения для каждого.

Другие вопросы по тегам