标签: aws-lambda

lambda 调用中缺少 multiValueQueryStringParameters

我调用了连接到 Lambda 函数的 API 网关。我期望在处理程序的输入multiValueQueryStringParameters中看到一个键。event

https://aws.amazon.com/blogs/compute/support-for-multi-value-parameters-in-amazon-api-gateway/

相反,我看到了一个逗号分隔的列表queryStringParameters

例如,这个调用:

https://12324234234234.execute-api.us-east-2.amazonaws.com/dois_to_pmids?a=1&a=2&a=3

生成以下事件条目:

"queryStringParameters": {"a": "1,2,3"}

我尝试将所有内容都变成代理集成,首先要做的是:

GET /{proxy+}

然后通过执行以下操作:

ANY /{proxy+}

没有运气。

https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html

https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html

这是怎么回事?

aws-lambda aws-api-gateway

2
推荐指数
1
解决办法
4161
查看次数

无服务器| 如何将 Lambda 授权者设置为 None(公共 API)

请考虑以下代码(serverless.yml):

functions:
  exportCvToPdf:
    handler: handler.exportCvToPdf
    timeout: 20
    events:
      - http:
          path: export
          method: post
Run Code Online (Sandbox Code Playgroud)

部署到 AWS 会返回指向 API 端点的链接。对端点进行 CURL 操作会返回:

{"message":"Missing Authentication Token"}
Run Code Online (Sandbox Code Playgroud)

如何使用无服务器框架创建公共端点?

我已经尝试过以下方法:

functions:
  exportCvToPdf:
    handler: handler.exportCvToPdf
    timeout: 20
    events:
      - http:
          path: export
          method: post
          authorizer: none # None NONE "none" "NONE" "None" has also been tried
Run Code Online (Sandbox Code Playgroud)

上面在部署时返回错误:

Function none doesn't exist in this Service
Run Code Online (Sandbox Code Playgroud)

amazon-web-services aws-lambda aws-api-gateway serverless-framework

2
推荐指数
1
解决办法
765
查看次数

如何使用 AWS X-Ray 跟踪 lambda 调用 lambda?

我有一个由 API 网关事件触发的 AWS Lambda 函数。API 网关配置为使用 X-Ray。

由于 Lambda 跟踪配置默认为 PassTrough,它也显示在 X-Ray(服务地图等)中。

调用的 Lambda 使用 node.js aws-sdk 调用另一个 lambda。如果我理解正确,则必须将跟踪 ID 传递到下一个调用,以便在 X 射线中也显示此 Lambda。在SDK 的 API中我没有找到这方面的选项。

const result = await lambda
        .invoke(lambdaParamsCreateUser)
        .promise()
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现这个目标?我怎样才能跟踪原始请求的调用?

根据 @Balu Vyamajala 的提示,我将 AWS-SDK 导入更改为以下内容:

const result = await lambda
        .invoke(lambdaParamsCreateUser)
        .promise()
Run Code Online (Sandbox Code Playgroud)

当我为第二个函数开发票时,我会使用它,如下所示:

import AWS from "aws-sdk";

import AwsXRay from "aws-xray-sdk-core";
const aws = AwsXRay.captureAWS(AWS);
export default aws;
Run Code Online (Sandbox Code Playgroud)

但在 X-Ray 中没有调用链:-(

https://i.stack.imgur.com/8FsWT.jpg

我犯错了吗?

amazon-web-services node.js aws-lambda aws-xray

2
推荐指数
1
解决办法
2505
查看次数

AWS-Lambda 导出默认功能不起作用

我正在练习 aws lambda 函数和无服务器 yml。我正在使用 typescript 和 javascript es6。我通过离线插件测试我的无服务器 yml 文件。当我导出 lambda 函数并在无服务器 yml 文件中调用它时,如下所示:handler: src/handlers/hello.hello,我的 lambda 触发该函数并且它按预期工作。我正在尝试将我的 lambda 函数作为导出默认函数并像这样调用它handler: src/handlers/hello.default。我收到错误:hello is not a function。我不知道我的导出默认值做错了什么。

这个逻辑有效

import { APIGatewayEvent } from "aws-lambda";

export async function hello(event: APIGatewayEvent) {

  console.log(event);

  try {
    return {
      statusCode: 200,
      body: JSON.stringify("hello emmy"),
    };
  } catch (error) {
    return {
      statusCode: 500,
      body: JSON.stringify(error),
    };
  }

}
Run Code Online (Sandbox Code Playgroud)

此导出默认不起作用

import { APIGatewayEvent } from "aws-lambda";

export default async function hello(event: …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services aws-lambda aws-serverless

2
推荐指数
1
解决办法
2025
查看次数

调用 Lambda 的 API 网关上出现间歇性内部服务器错误 - StatusCode 500

我在 AWS API Gateway 中有一个 REST API,它调用 Python Lambda 函数并返回一些结果。大多数情况下,此工作流程工作正常,这意味着执行 Lambda 函数并将结果传递回 API,API 又返回 200 OK 响应。

然而,有几次我从 API 收到 500 错误代码,而 Lambda 似乎甚至没有被执行。上面response.reason写着:“内部服务器错误”,并且没有给出其他信息。

对于 API 的失败请求和成功请求在方法或参数格式方面没有区别。

另一项评论是 API 启用了缓存设置。我看过类似的帖子,其中一些答案提到了 Lambda 函数返回的 JSON 对象的格式,其他答案则指出了 IAM 权限问题,但这些似乎都不是这里的原因。事实上,正如这篇文章的标题所说,这是一种间歇性行为:大多数时候它工作正常,但偶尔我会收到此错误。

任何提示将不胜感激。

amazon-web-services aws-lambda aws-api-gateway

2
推荐指数
1
解决办法
6004
查看次数

本地启动 API 时未设置 AWS SAM APIGatewayProxyRequestEvent HttpMethod

我使用 a 创建了一个应用程序AWS::SERVERLESS::FUNCTION,其中附加了一个 HttpApi 事件。我认为为每个资源创建一个 lambda 是一个好主意,因此例如 Post、Get 和 Put on /customer 都由单个 lambda 处理,该 lambda 决定使用

switch (input.getHttpMethod()) {
    case "GET": ...
    case "POST: ...
}
Run Code Online (Sandbox Code Playgroud)

现在来解决我的问题:当使用sam local start-api我的 lambda 启动应用程序时,它被正确调用,但既没有input.getHttpMethod()设置也没有input.getRequestContext().getHttpMethod()设置。

鉴于 SAM 支持多个 HttpApi 事件,在本地运行应用程序时未能提供 http 方法实际上会完全减轻本地开发的负担。是我做错了什么,还是这真的不起作用?顺便说一句,我使用的是 Java,我无法判断使用其他语言是否也存在这个问题。

以防万一:我的“每个资源一个 lambda”方法是否错误,每个操作都应该有自己的 lambda 吗?

sam aws-lambda aws-http-api

2
推荐指数
1
解决办法
675
查看次数

AWS Step Functions:如何使用“传递”步骤“重命名”输入参数

我有一个状态机,其中包含以下相关状态:

States:
  'Analyze Report':
    Type: Task
    Resource: 'arn:aws:states:::lambda:invoke'
    Parameters:
      FunctionName: '(redacted)'
    OutputPath: '$.Payload'
    Next: 'Setup Email'
  'Setup Email':
    Type: Pass
    Result:
      recipients: '$.accounts'
      subject: 'some email subject'
      body: 'some email body'
    ResultPath: '$'
    Next: 'Send Email'
  'Send Email':
    Type: Task
    Resource: 'arn:aws:states:::lambda:invoke'
    Parameters:
      FunctionName: '(redacted)'
    OutputPath: '$.Payload'
    Next: '(some downstream task)'
Run Code Online (Sandbox Code Playgroud)

与该步骤关联的 lambda 函数的输出Analyze Report具有以下形式:

{
  "accounts": ["foo", "bar", "baz"],
  "error_message": null,
  "success": true
}
Run Code Online (Sandbox Code Playgroud)

与步骤关联的 lambda 函数Send Email需要以下形式的输入:

{
  "recipients": ["foo", "bar", "baz"],
  "subject": "some …
Run Code Online (Sandbox Code Playgroud)

aws-lambda aws-step-functions

2
推荐指数
1
解决办法
1820
查看次数

终止 AWS Lambda 函数的上下文

我有一个 AWS Lambda 函数,当它出现特定错误时,我需要终止它的上下文,因为如果上下文与上次调用相同,再次调用该错误将使 Lambda 函数无法正常工作。

根据我的理解,如果我抛出一个新的,RuntimeException它应该杀死上下文,但它并没有这样做。

知道如何从代码内部杀死上下文吗?

public class IncorrectFileExtensionException 
  extends RuntimeException {
    public IncorrectFileExtensionException(String errorMessage, Throwable err) {
        super(errorMessage, err);
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道 Lambda 函数上下文没有被破坏/杀死,因为在我下次调用它时抛出该自定义运行时异常后,它使用相同的上下文,我可以确认这一点,因为它使用相同的 CloudWatch 日志流并且不再执行冷启动。

我需要实现的是杀死该调用的 Lambda 函数上下文,并使其在下次冷启动时启动。

java amazon-web-services aws-lambda aws-step-functions

2
推荐指数
1
解决办法
1504
查看次数

为什么 JavaScript aws-sdk ssm getParameter 需要所有参数的权限,而不仅仅是我需要的参数?

我在我的 aws lambda 中使用 javascript,它调用 SSM getParameter,并且 lambda 的执行角色对我想要获取其值的密钥具有适当的权限。

最初,我收到了这个特定的错误:

ERROR   AccessDeniedException: User: arn:aws:sts::123456789:assumed-role/my-role/my-lambda is not authorized to perform: ssm:GetParameter on resource: arn:aws:ssm:us-east-1:123456789:parameter/my/parameter
Run Code Online (Sandbox Code Playgroud)

具体错误是有道理的,因此我更正了我的策略,因为我不小心将 GetParameters 放在了 GetParameters 中。但现在,我收到了这个可疑的错误(请注意末尾的*):

ERROR   AccessDeniedException: User: arn:aws:sts::123456789:assumed-role/my-role/my-lambda is not authorized to perform: ssm:GetParameter on resource: arn:aws:ssm:us-east-1:123456789:*
Run Code Online (Sandbox Code Playgroud)

这个错误对我来说没有任何意义。为什么我需要访问每个参数?我只需要我想要的那个。

这是相关代码:

ERROR   AccessDeniedException: User: arn:aws:sts::123456789:assumed-role/my-role/my-lambda is not authorized to perform: ssm:GetParameter on resource: arn:aws:ssm:us-east-1:123456789:parameter/my/parameter
Run Code Online (Sandbox Code Playgroud)

以及权限策略(在 CloudFormation 模板中创建)

ERROR   AccessDeniedException: User: arn:aws:sts::123456789:assumed-role/my-role/my-lambda is not authorized to perform: ssm:GetParameter on resource: arn:aws:ssm:us-east-1:123456789:*
Run Code Online (Sandbox Code Playgroud)

编辑:

更改权限策略以匹配错误消息后,我现在遇到这个奇怪的错误:

ERROR   ValidationException: Parameter name: can't be …
Run Code Online (Sandbox Code Playgroud)

javascript amazon-web-services aws-lambda aws-parameter-store

2
推荐指数
1
解决办法
1592
查看次数

AWS AppFlow Salesforce 到 Lambda 不完整事件

我有一个 AWS AppFlow 流设置,旨在接收 Salesforce 更改事件并在 Redshift 表上进行处理,以便在 Salesforce 中全天发生更改时保持 Redshift 表最新。

仅使用 AppFlow 并将源映射到 Redshift 中的目标字段似乎并不能达到我想要的效果,因为它似乎只是将更改附加到目标 Redshift 表 - 没有更新、删除等。

我认为解决这个问题的方法是将 AppFlow 的目标更改为 Amazon EventBridge,设置规则来侦听更改,定位 Lambda 函数,并根据事件详细信息对相应的表执行 Redshift 操作。

然而,在 Lambda 中进行这些更改和测试后,我遇到了事件问题。根据 Salesforce 的说法,更改事件消息应如下所示:

{
  "data": {
    "schema": "<schema_ID>", 
    "payload": {
      "ChangeEventHeader": {
         "entityName" : "...",
         "recordIds" : "...",
         "changeType" : "...",
         "changedFields": [...],
         "changeOrigin" : "...",
         "transactionKey" : "...",
         "sequenceNumber" : "...",
         "commitTimestamp" : "...",
         "commitUser" : "...",
         "commitNumber" : "..."
      }, 
     "field1":"...",
     "field2":"...",
     . . …
Run Code Online (Sandbox Code Playgroud)

salesforce amazon-web-services aws-lambda aws-event-bridge

2
推荐指数
1
解决办法
758
查看次数