我调用了连接到 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
这是怎么回事?
请考虑以下代码(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
我有一个由 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
我犯错了吗?
我正在练习 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) 我在 AWS API Gateway 中有一个 REST API,它调用 Python Lambda 函数并返回一些结果。大多数情况下,此工作流程工作正常,这意味着执行 Lambda 函数并将结果传递回 API,API 又返回 200 OK 响应。
然而,有几次我从 API 收到 500 错误代码,而 Lambda 似乎甚至没有被执行。上面response.reason写着:“内部服务器错误”,并且没有给出其他信息。
对于 API 的失败请求和成功请求在方法或参数格式方面没有区别。
另一项评论是 API 启用了缓存设置。我看过类似的帖子,其中一些答案提到了 Lambda 函数返回的 JSON 对象的格式,其他答案则指出了 IAM 权限问题,但这些似乎都不是这里的原因。事实上,正如这篇文章的标题所说,这是一种间歇性行为:大多数时候它工作正常,但偶尔我会收到此错误。
任何提示将不胜感激。
我使用 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 吗?
我有一个状态机,其中包含以下相关状态:
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 函数,当它出现特定错误时,我需要终止它的上下文,因为如果上下文与上次调用相同,再次调用该错误将使 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 函数上下文,并使其在下次冷启动时启动。
我在我的 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
我有一个 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) aws-lambda ×10
aws-http-api ×1
aws-xray ×1
java ×1
javascript ×1
node.js ×1
salesforce ×1
sam ×1