Amazon web services lambda调用有效负载错误

Amazon web services lambda调用有效负载错误,amazon-web-services,go,aws-lambda,Amazon Web Services,Go,Aws Lambda,我试图用 来自另一个应用程序,但在有效负载方面遇到问题,但在我使用相同的输出通过控制台测试lambda函数时不会出现问题 以下是调用lambda的函数: type RedisPair struct { RedisKey string `json:"redis_key"` RedisValue string `json:"redis_value"` } type RedisBatch struct { RedisPairs

我试图用 来自另一个应用程序,但在有效负载方面遇到问题,但在我使用相同的输出通过控制台测试lambda函数时不会出现问题

以下是调用lambda的函数:

type RedisPair struct {
    RedisKey        string      `json:"redis_key"`
    RedisValue      string      `json:"redis_value"`
}

type RedisBatch struct {
    RedisPairs      []RedisPair
    GroupId         string      `json:"group_id"`
}

func lambdawrite (redisbatch RedisBatch) {

    //fmt.Println("invoking lambda")

    fmt.Println("Batch type: ", reflect.TypeOf(redisbatch))

    payload, err := json.Marshal(redisbatch)

    fmt.Println("Payload type: ", reflect.TypeOf(payload))

    if err != nil {
        fmt.Println("Error marshalling MyGetItemsFunction request")
    }

    svc := lambda.New(session.New())
    input := &lambda.InvokeInput{
        ClientContext:  aws.String("MyApp"),
        FunctionName:   aws.String("arn:aws:lambda:us-region:arnnum:function:testrpredis"),
        InvocationType: aws.String("RequestResponse"),
        LogType:        aws.String("Tail"),
        Payload:        payload,
        Qualifier:      aws.String("$LATEST"),
    }

    result, err := svc.Invoke(input)
    if err != nil {
        if aerr, ok := err.(awserr.Error); ok {
            //error stuff...
            }
        } else {
            // Print the error, cast err to awserr.Error to get the Code and
            // Message from an error.
            fmt.Println("error 2")
            fmt.Println(err.Error())
        }
        return
    }
    //fmt.Println("good")
    fmt.Println(result)

}
这是lambda函数本身:

package main

import (
    "github.com/go-redis/redis"
    "github.com/aws/aws-lambda-go/lambda"
    "log"
    "os"
    "time"
)

type Event struct {
    RedisPairs      []RedisPair
    GroupId         string      `json:"group_id"`
}

type Response struct {
    Message        string    `json:"message"`
    Ok            bool    `json:"ok"`
}

type RedisPair struct {
    RedisKey   string `json:"redis_key"`
    RedisValue string `json:"redis_value"`
}

func redis_pipeline(batch Event) (Response, error) {

    clientrds := redis.NewClient(&redis.Options{
        Addr:         os.Getenv("REDIS_HOST") + ":6379",
        DialTimeout:  10 * time.Second,
        ReadTimeout:  30 * time.Second,
        WriteTimeout: 30 * time.Second,
        PoolSize:     100,
        PoolTimeout:  30 * time.Second,
    })
    clientrds.FlushDB()

    log.Print("start pipe")

    pipe := clientrds.Pipeline()

    var response Response

    log.Print("starting range lop")

    for b := range batch.RedisPairs {
        //fmt.Println("adding", batch.RedisPairs[b].RedisKey, batch.RedisPairs[b].RedisValue)
        pipe.Set(batch.RedisPairs[b].RedisKey, batch.RedisPairs[b].RedisValue, 0)
    }

    //fmt.Println(uuid, "...time now start: ", time.Now(), ", start time: ", startTime)
    log.Print("write to redis")
    _, err := pipe.Exec()
    if err != nil {

        log.Print("points error")
        response = Response{
            Message: err.Error(),
            Ok:         false,
        }
    } else {

        log.Print("points written")
        response = Response{
            Message: "Points wrttien!",
            Ok:         true,
        }
    }

    log.Print("close pipe")

    pipe.Close()

    return response, err

}

func main() {
    log.Print("start main v2")
    lambda.Start(redis_pipeline)
}
当我通过第一个函数调用lambda时,每次调用该函数时,lambda日志都会显示:

invalid character ')' after top-level value: SyntaxError
null
如果我在第一个函数中将RedisBatchstruct输出到一个文件中,并使用该输出通过aws控制台手动测试lambda函数,那么它将成功工作。输出也如下所示:

{
  "RedisPairs": [
    {
      "redis_key": "kafka9", 
      "redis_value": "{\"metric_value_number\":1,\"path\":\"/sdp/sw/logstashjmx/jmxcfgs\",\"cluster\":\"card01\",\"@timestamp\":\"2018-05-17T08:32:50.035Z\",\"@version\":\"1\",\"host\":\"localhost\",\"metric_path\":\"dsdpecard01kfk05.kafka.log:type=Log,name=NumLogSegments,topic=private.topic.lsrp.created.v1,partition=4.Value\",\"type\":null,\"region\":\"us-east-1\"}\n"
    }, 
    {
      "redis_key": "kafka10", 
      "redis_value": "{\"metric_value_number\":1,\"path\":\"/sdp/sw/logstashjmx/jmxcfgs\",\"cluster\":\"card01\",\"@timestamp\":\"2018-05-17T08:32:50.045Z\",\"@version\":\"1\",\"host\":\"localhost\",\"metric_path\":\"dsdpecard01kfk05.kafka.log:type=Log,name=NumLogSegments,topic=credit-topic.v1,partition=6.Value\",\"type\":null,\"region\":\"us-east-1\"}\n"
    }, 
    {
      "redis_key": "kafka1", 
      "redis_value": "{\"metric_value_number\":0,\"path\":\"/sdp/sw/logstashjmx/jmxcfgs\",\"cluster\":\"card01\",\"@timestamp\":\"2018-05-17T08:32:50.063Z\",\"@version\":\"1\",\"host\":\"localhost\",\"metric_path\":\"dsdpecard01kfk05.kafka.log:type=Log,name=LogEndOffset,topic=credit.test1122.created.v1,partition=3.Value\",\"type\":null,\"region\":\"us-east-1\"}\n"
    }, 
    {
      "redis_key": "kafka2", 
      "redis_value": "{\"metric_value_number\":0,\"path\":\"/sdp/sw/logstashjmx/jmxcfgs\",\"cluster\":\"card01\",\"@timestamp\":\"2018-05-17T08:32:50.074Z\",\"@version\":\"1\",\"host\":\"localhost\",\"metric_path\":\"dsdpecard01kfk05.kafka.log:type=Log,name=LogEndOffset,topic=connect-offsets-east,partition=9.Value\",\"type\":null,\"region\":\"us-east-1\"}\n"
    }, 
    {
      "redis_key": "kafka3", 
      "redis_value": "{\"metric_value_number\":0,\"path\":\"/sdp/sw/logstashjmx/jmxcfgs\",\"cluster\":\"card01\",\"@timestamp\":\"2018-05-17T08:32:50.085Z\",\"@version\":\"1\",\"host\":\"localhost\",\"metric_path\":\"dsdpecard01kfk05.kafka.log:type=Log,name=Size,topic=credit-uxtest2.created.v1,partition=9.Value\",\"type\":null,\"region\":\"us-east-1\"}\n"
    }, 
    {
      "redis_key": "kafka5", 
      "redis_value": "{\"metric_value_number\":60,\"path\":\"/sdp/sw/logstashjmx/jmxcfgs\",\"cluster\":\"card01\",\"@timestamp\":\"2018-05-17T08:32:50.097Z\",\"@version\":\"1\",\"host\":\"localhost\",\"metric_path\":\"dsdpecard01kfk05.kafka.log:type=Log,name=LogEndOffset,topic=rte.enrichment.rules,partition=7.Value\",\"type\":null,\"region\":\"us-east-1\"}\n"
    }
  ], 
  "group_id": "testehb4"
}
为什么当我手动输出数据并测试它时,它工作,而当我以编程方式调用函数时,它不工作

-----编辑------


刚刚意识到这适用于
事件
调用类型,但不适用于
请求响应
类型。这两者之间发送有效载荷的方式有什么不同?似乎找不到合适的文档或示例…

错误在InvokeInput中的ClientContext赋值中

尝试,至少在开始时,注释掉ClientContext——这会让它工作起来。doco声明:

ClientContext JSON必须是base64编码的,最大大小为3583字节

如果您想使用ClientContext,这是一个单独的练习。我还在想办法

input := &lambda.InvokeInput{
    // ClientContext:  aws.String("MyApp"),
    FunctionName:   aws.String("arn:aws:lambda:us-region:arnnum:function:testrpredis"),
    InvocationType: aws.String("RequestResponse"),
    LogType:        aws.String("Tail"),
    Payload:        payload,
    Qualifier:      aws.String("$LATEST"),
}