我有一个 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 函数上下文,并使其在下次冷启动时启动。
我的 params.json 输入中有一部分用于一组步骤函数,并且我想修改一些参数以包含在输入参数中呈现的日期时间。
"Predictor": {
"PredictorName": "normal_name_/*DATETIME HERE*/",
"ForecastHorizon": 181,
. . .
},
Run Code Online (Sandbox Code Playgroud)
我目前正在通过修改函数第一步中的输入参数来完成此操作,但是这是有问题的,因为每次运行它时,它都会重新渲染日期时间,并且我想“锁定”日期,就像步骤一样函数执行已创建。这可能吗?
我目前正在致力于在 aws lambda 上部署 python 包。使用 virtualenv 和 zip 工具,我可以轻松创建 lambda zip 文件,上传到 aws 并运行它。我使用以下博客来创建包: https: //joarleymoraes.com/hassle-free-python-lambda-deployment/。
但是,我需要使用构建工具将我的代码与公司中的 Jenkins 集成。我们使用 Maven 进行构建,我也需要遵循同样的方法。
我查看了maven-exec-plugin,了解如何按照博客中的步骤使用虚拟环境并创建 zip 文件。但是,我无法按照 Maven 教程中提到的步骤进行操作。
有人遇到过同样的问题吗?如果是这样,你是如何解决的?例如,您如何配置 pom.xml 来为 python aws lambdas 创建部署包?
快速帮助将受到高度赞赏。谢谢
在我的一个步骤中,我使用 lambda 函数作为任务,并且希望将整个输入作为 传递,以便payload它可以转换为我定义的强类型 Java 对象。
我的数据类型为对象:
@Data
public class JobMetaData {
public JobMetaData() {
}
private String jobName;
private String jobId;
Run Code Online (Sandbox Code Playgroud)
拉姆达函数:
@Override
public JobMetaData handleRequest(final JobMetaData jobMetaData,
final Context context) {
Run Code Online (Sandbox Code Playgroud)
步:
"Preparing Job": {
"Next": "Submitting Job",
"InputPath": "$",
"OutputPath": "$.bakeJobResult",
"Type": "Task",
"Comment": "Preparing Job",
"Parameters": {
"FunctionName": "MyLambdaFunctionName",
"Payload": {
"$": "$"
}
},
"Resource": "arn:aws:states:::lambda:invoke",
"ResultPath": "$.bakeJobResult"
}
Run Code Online (Sandbox Code Playgroud)
上述步骤将导致JobMetaData传入 as null。我只能通过将其更改为:
"Payload": {
"jobName.$": "$.jobName",
"jobId.$": "$.jobId"
}
Run Code Online (Sandbox Code Playgroud)
但是如果我有很多字段,这意味着我需要提取所有 …
我找不到如何根据 Go 处理程序返回的错误在 Step 函数中定义错误条件匹配器的详细说明。
这handler是一个标准的 Go 函数,error如果从上游服务获取 503 则返回:
func HandleHotelBookingRequest(ctx context.Context, booking HotelBookingRequest) (
confirmation HotelBookingResponse, err error) {
...
if statusCode == http.StatusServiceUnavailable {
err = errors.New("TransientError")
} else {
Run Code Online (Sandbox Code Playgroud)
我可以控制函数返回的内容以及它如何格式化字符串;我找不到任何关于在这里使用什么的真实信息(或者在一个Catch子句中),所以这与上面的内容相匹配:
"Retry": [
{
"ErrorEquals": [
"TransientError"
],
"BackoffRate": 1,
"IntervalSeconds": 1,
"MaxAttempts": 3,
"Comment": "Retry for Transient Errors (503)"
}
]
Run Code Online (Sandbox Code Playgroud)
当我在控制台中测试 Lambda 时,当上游返回 503 时,我得到的结果(如预期):
{
"errorMessage": "TransientError",
"errorType": "errorString"
}
Run Code Online (Sandbox Code Playgroud)
我有一个明显的印象(但不太确定如何验证这一点),如果我更改为:
"ErrorEquals": [
"errorString"
],
Run Code Online (Sandbox Code Playgroud)
有效Retry(至少,查看 …
我正在开发一个具有以下工作流程的项目:API 网关(使用开放 api 定义)触发来自 AWS 的 Step 函数。有 2 个步骤,如果出现错误,状态机定义中有一个 catch 块。
但我面临错误处理的问题。即使我的代码抛出错误(例如 400),我的 Postman(或其他 REST API 测试工具)也会响应 200。我想要 500/400...
这是代码:
Step 函数定义为无服务器
stepFunctions:
stateMachines:
PostPayment:
name: testfunction
type: EXPRESS
definition:
Comment: 'test'
StartAt: Function1
States:
Function1:
Type: Task
Resource: !GetAtt Function1.Arn
Catch:
- ErrorEquals: ['HandledError']
Next: Fallback
Next: Function2
Function2:
Type: Task
Resource: !GetAtt Function2.Arn
Catch:
- ErrorEquals: ['HandledError']
Next: Fallback
End: true
Fallback:
Type: Fail
Cause: "Error occured",
Error: "Error"
Run Code Online (Sandbox Code Playgroud)
这是我的 openapi yml
x-amazon-apigateway-request-validator: all
x-amazon-apigateway-integration:
requestParameters:
integration.request.path.id: …Run Code Online (Sandbox Code Playgroud) amazon-web-services aws-api-gateway openapi aws-step-functions
我正在尝试用状态机触发粘合作业。当它触发作业时,几秒钟后我可以从glue控制台看到作业已完成,但在状态机中它仍然停留在进行中状态,我等了1小时但它仍然保持在进行中状态。这是我的状态机,
这是状态机的代码,
{
"StartAt": "Glue: Convert Raw to JSON",
"States": {
"Glue: Convert Raw to JSON": {
"Type": "Task",
"Resource": "arn:aws:states:::glue:startJobRun.sync",
"Parameters": {
"JobName": "ConvertLandingToRaw",
"Arguments": {
"--bucket.$": "$.detail.requestParameters.bucketName",
"--key.$": "$.detail.requestParameters.key"
}
},
"Next": "Glue: Convert JSON to Parquet"
},
"Glue: Convert JSON to Parquet": {
"Type": "Task",
"Resource": "arn:aws:states:::glue:startJobRun.sync",
"Parameters": {
"JobName": "ConvertJsonToParquet"
},
"End": true
}
},
"Comment": "Re-partitioning the data and changing the data type."
}
Run Code Online (Sandbox Code Playgroud)
谁能帮我解决这个问题。我尝试了很多链接但无法得到满意的答案。谢谢
我在 AWS Step Functions 中使用回调模式,并且正在研究 AWS Step Functions 中关键“超时”和“心跳”之间的区别。
CDK代码:
queue: sqsStack.queue,
heartbeat: Duration.minutes(15),
timeout: Duration.minutes(25),
Run Code Online (Sandbox Code Playgroud)
有什么区别,有哪些最佳实践?
我创建了一个用于创建 EMR 集群的步骤函数,我希望步骤中的日期根据我执行步骤函数的日期进行更改。(如果我今天运行 - 2023 年 6 月 13 日,我希望它在 2023 年 6 月 12 日之前运行)我该怎么做?这是我的代码:
{
"Comment": "A description of my state machine",
"StartAt": "EMR CreateCluster",
"States": {
"EMR CreateCluster": {
"Type": "Task",
"Resource": "arn:aws:states:::elasticmapreduce:createCluster.sync",
"Parameters": {
"Name": "IOretrieve",
"ServiceRole": "EMR_DefaultRole",
"JobFlowRole": "EMR_EC2_DefaultRole",
"ReleaseLabel": "emr-6.8.0",
"Applications": [
{
"Name": "Spark"
}
],
"LogUri": "s3://",
"VisibleToAllUsers": true,
"Instances": {
"Ec2SubnetId": "subnet",
"Ec2KeyName": "",
"EmrManagedMasterSecurityGroup": "",
"EmrManagedSlaveSecurityGroup": "",
"KeepJobFlowAliveWhenNoSteps": true,
"InstanceFleets": [
{
"InstanceFleetType": "MASTER",
"Name": "Master",
"TargetOnDemandCapacity": 1,
"InstanceTypeConfigs": [ …Run Code Online (Sandbox Code Playgroud) 我想按照第一次调用,第二次,第三次,第四次,最后结束的顺序调用函数。
我正在使用AWS 管理控制台中的选择示例。
为什么第三个和第四个电话没有被击中?
{
"Comment": "state functionality",
"StartAt": "FirstCall",
"States": {
"FirstCall": {
"Type": "Choice",
"Choices": [
{
"Not": {
"Resource": "rnName",
"Variable": "$.response",
"InputPath": "$",
"ResultPath": "$",
"OutputPath": "$",
"StringEquals": "Success Import"
},
"Next": "SecondCall"
},
{
"Variable": "$.response",
"StringEquals": "Success Import ",
"Next": "ThirdCall"
},
{
"And": [
{
"Variable": "$.response",
"StringEquals": "Success Import"
},
{
"Variable": "$.response",
"StringEquals": "Success Import"
}
],
"Next": "FourthCall"
}
]
},
"SecondCall": {
"Type": "Task", …Run Code Online (Sandbox Code Playgroud) 我有一个用例,我想从现有的 lambda 函数之一异步启动一个步骤函数。为此,我使用 StartExecution API。( https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartExecution.html )
这个API也是异步启动step函数的。如果是这样,有人可以指出我正确的文档,其中提到了这一点。
我想根据上一步的结果动态选择 AWS Lambda 工作人员。类似的东西{"Resource": "$.worker_arn"}。
"RunWorkers": {
"Type": "Map",
"MaxConcurrency": 0,
"InputPath": "$.output",
"ResultPath": "$.raw_result",
"Iterator": {
"StartAt": "CallWorkerLambda",
"States": {
"CallWorkerLambda": {
"Type": "Task",
"Resource": "$$.worker_arn",
"End": true
}
}
},
"Next": "Aggregate"
},
Run Code Online (Sandbox Code Playgroud)
上一步的输入预期如下:
[{"worker_arn":..., "output":1}, {"worker_arn":..., "output":1}, ...],其中worker_arn所有工人都相同。
当我编写这样的管道时,linter 抱怨它需要一个 ARN。
有没有比将我的工人 lambda 包装到另一个 lambda 更好的选择?
aws-lambda ×4
python ×2
amazon-emr ×1
aws-glue ×1
aws-sam ×1
deployment ×1
go ×1
java ×1
json ×1
maven ×1
node.js ×1
openapi ×1
serverless ×1