Я пытаюсь вызвать лямбда-функцию (написанную на Go) с помощью Go SDK из другого приложения, но сталкиваюсь с проблемами с полезной нагрузкой, но не при тестировании лямбда-функции через консоль стот же вывод.
вот функция, которая вызывает лямбду:
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)
}
, а вот сама лямбда-функция:
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)
}
когда я вызываю лямбду через первую функцию,Лямбда-логи показывают это каждый раз, когда я вызываю функцию:
invalid character ')' after top-level value: SyntaxError
null
Если я выведу RedisBatch
struct в файл в первой функции, и использую этот вывод для ручного тестирования лямбда-функции через консоль aws,это работает успешно тогда.вывод также выглядит следующим образом:
{
"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"
}
почему он работает, когда я вручную выводю данные и проверяю их, а не когда я вызываю функцию программным способом?
-----РЕДАКТИРОВАТЬ ------
только что понял, что это работает с типом вызова Event
, но не с типом RequestResponse
.Какая разница в том, как вы отправляете полезную нагрузку между ними?не могу найти правильные документы для этого или пример ...