aws lambda:使用来自 cli 的有效负载调用

Jor*_*rdi 14 amazon-web-services aws-cli aws-lambda

我正在尝试使用 aws cli 调用我的 lambda:

$ aws lambda invoke \
    --function-name soc-update-dynamodb-java \
    --invocation-type Event \
    --payload file://invoke-payload.json \
   response.json
Run Code Online (Sandbox Code Playgroud)

但是,我收到此消息:

调用 Invoke 操作时发生错误 (InvalidRequestContentException):无法将请求正文解析为 json:[Source: (byte[])"E?(?????U???? ?????k.....

payload.json 内容是一个类似 s3 事件的 json:

{
"Records": [
  {
    "eventVersion": "2.0",
    "eventSource": "aws:s3",
    "awsRegion": "eu-central-1",
    "eventTime": "1970-01-01T00:00:00.000Z",
    "eventName": "ObjectCreated:Put",
    "userIdentity": {
      "principalId": "EXAMPLE"
    },
    "requestParameters": {
      "sourceIPAddress": "127.0.0.1"
    },
    "responseElements": {
      "x-amz-request-id": "EXAMPLE123456789",
      "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
    },
    "s3": {
      "s3SchemaVersion": "1.0",
      "configurationId": "testConfigRule",
      "bucket": {
        "name": "soc-connect",
        "ownerIdentity": {
          "principalId": "EXAMPLE"
        },
        "arn": "arn:aws:s3:::example"
      },
      "object": {
        "key": "example.key",
        "size": 1024,
        "eTag": "0123456789abcdef0123456789abcdef",
        "sequencer": "0A1B2C3D4E5F678901"
      }
    }
  }
]
}
Run Code Online (Sandbox Code Playgroud)

我可以使用此事件从 aws Web 控制台执行它,但是我在尝试使用 aws cli 调用它时遇到问题。

我从 invoke-payload.json 得到编码:

$ file -i invoke-payload.json 
invoke-payload.json: text/plain; charset=us-ascii
Run Code Online (Sandbox Code Playgroud)

如您所见,编码是us-ascii.

编辑

我还尝试发送嵌入命令的有效载荷。正如您在图片上看到的,我收到了相同的消息:

在此处输入图片说明

有任何想法吗?

joh*_*all 18

从 CLI 使用简单的 JSON 调用 Lambda

以下是如何通过向 Lambda 提供简短的 JSON 负载并在终端中显示结果来测试 Lambda:

aws lambda invoke \
--payload '{"beer": "tasty"}' --function-name myfunc \
--cli-binary-format raw-in-base64-out \
/dev/stdout
Run Code Online (Sandbox Code Playgroud)

以antklim 的答案为基础


小智 15

对有效负载参数使用 fileb://(“文件二进制”)语法,这样您就不必通过 base64 运行它

... --payload fileb://invoke-payload.json

  • AWS 的文章解释了 file 和 fileb 是什么:https://aws.amazon.com/blogs/developer/best-practices-for-local-file-parameters/ (3认同)

ant*_*lim 6

对于 AWS CLI 版本 2,添加--cli-binary-format标志以确保正确解释有效负载。

$ aws lambda invoke \
    --function-name soc-update-dynamodb-java \
    --invocation-type Event \
    --payload file://invoke-payload.json \
    --cli-binary-format raw-in-base64-out \
    response.json
    
Run Code Online (Sandbox Code Playgroud)