草庐IT

amazon-web-services - lambda 调用负载错误

coder 2024-07-05 原文

我正在尝试使用 Go SDK 调用一个 lambda 函数(用 Go 编写) 来自另一个应用程序,但遇到有效负载问题,但当我通过具有相同输出的控制台测试 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

如果我在第一个函数中将 RedisBatch 结构输出到文件,并使用该输出通过 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"
}

为什么当我手动输出数据并测试它时它可以工作,但当我以编程方式调用该函数时却没有?

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

刚刚意识到这适用于 Event 调用类型,但不适用于 RequestResponse 类型。两者之间发送有效负载的方式有何不同?似乎找不到合适的文档或示例...

最佳答案

错误出在InvokeInput中ClientContext的赋值上。

尝试,至少在最初,注释掉 ClientContext - 这将使它工作。 doco 指出:

ClientContext JSON 必须采用 base64 编码且最大大小为 3583 字节。

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"),
}

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

关于amazon-web-services - lambda 调用负载错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50427698/

有关amazon-web-services - lambda 调用负载错误的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby-on-rails - rails : save file from URL and save it to Amazon S3 - 2

    从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex

  3. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  4. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  5. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  6. ruby-on-rails - 错误 : Error installing pg: ERROR: Failed to build gem native extension - 2

    我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby​​'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe

  7. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  8. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  9. ruby-on-rails - Rails 5 Active Record 记录无效错误 - 2

    我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa

  10. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

随机推荐