Как перехватить AWS AppSyn c события внутри бессерверных источников лямбда-данных - PullRequest
0 голосов
/ 03 февраля 2020

Я использую серверный источник лямбда-данных для AppSyn c API

Я попробовал следующий код в своей лямбда-функции

package main

import (
    "context"
    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
    "log"
)

func main() {
    lambda.Start(Handler)
}
// Handler is your serverless lambda function
func Handler(ctx context.Context, event events.AppSyncResolverTemplate) error {
    log.Println(ctx)
    log.Println(event)
    return nil
}

Когда я сделал запрос к API, контекст был зарегистрирован правильно, но событие было зарегистрировано как { []}

Я попытался изменить лямбда-код, чтобы использовать событие, которое является пустым интерфейсом

package main

import (
    "context"
    "github.com/aws/aws-lambda-go/lambda"
    "log"
)


func main() {
    lambda.Start(Handler)
}

// Handler is your serverless lambda function
func Handler(ctx context.Context, event interface{}) error {
    log.Println(ctx)
    log.Println(event)
    return nil
}

Запрос API теперь Я вижу, что в журналах есть карта map[field:getPerson arguments:map[personId:1]]

Мой вопрос: какой допустимый тип следует использовать в сигнатуре обработчика для захвата события AppSyn c?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Я решил это сейчас.

Оказывается, что форма данных, передаваемых в бессерверный источник лямбда-данных, определяется пользователем.

В SamTemplate я посмотрел на определитель этого запроса и это выглядело как

 getPersonQueryResolver:
    Type: "AWS::AppSync::Resolver"
    Properties:
      ApiId: !GetAtt accountApi.ApiId
      TypeName: "Query"
      FieldName: "getPerson"
      DataSourceName: !GetAtt PersonDatasource.Name
      RequestMappingTemplate: |
        {
          "version" : "2017-02-28",
          "operation": "Invoke",
          "payload": {
              "field": "getPerson",
              "arguments":  $utils.toJson($context.args)
          }
        }
      ResponseMappingTemplate: |
        $utils.toJson($context.result)

Я изменил этот преобразователь на

getPersonQueryResolver:
    Type: "AWS::AppSync::Resolver"
    Properties:
      ApiId: !GetAtt accountApi.ApiId
      TypeName: "Query"
      FieldName: "getPerson"
      DataSourceName: !GetAtt PersonDatasource.Name
      RequestMappingTemplate: |
        {
          "version" : "2017-02-28",
          "operation": "Invoke",
          "payload": $utils.toJson($context.args)
        }
      ResponseMappingTemplate: |
        $utils.toJson($context.result)

, а затем я изменил лямбда-код на

package main

import (
    "context"
    "log"

    "github.com/aws/aws-lambda-go/lambda"
)

type GetPerson struct {
    PersonID string `json:"personId"`
}

func main() {
    lambda.Start(Handler)
}

// Handler is your serverless lambda function
func Handler(ctx context.Context, event GetPerson) error {
    log.Println(ctx)
    log.Println(event)

    return nil
}

Это успешно упорядочило событие и зарегистрировано как {1}

0 голосов
/ 03 февраля 2020

Я не верю, что events.AppSyncResolverTemplate - это правильное значение, которое должно существовать в объекте событий, передаваемом в источник данных.

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

query {
  getPerson(personId: "1")
}

Это может быть использовано по разным причинам в лямбда-выражении.

Можете ли вы предоставить больше информацию о том, что вы подразумеваете под событием AppSyn c, которое вы хотите записать?

Что вы ожидаете увидеть в этом событии?

...