我在 AWS EC2 实例上有一个每天运行一次的应用程序。该应用程序从 Web 服务中获取一些文件,逐行解析文件,更新数据库,根据数据库中的更改更新 S3 文件,向客户发送通知电子邮件以及一些其他任务。
这是一系列必须按顺序发生的逻辑任务,尽管其中一些任务可以被视为可以并行执行的子任务。所有任务都是 Perl 脚本和 Java 程序的组合,单个 Perl 脚本充当依次执行每个任务的管理器。有些任务可能需要长达 45 分钟才能完成,整个过程总共可能需要长达 3 小时。
我想让整个过程成为无服务器的。我最初的想法是使用AWS Lambda,其中每个任务都将作为 Lambda 函数执行,直到我发现 Lambda 函数施加5 分钟的执行超时。看起来AWS Step Functions服务实际上更适合我的用例,但我的理解是该服务由 Lambda 支持,因此任务仍然有 5 分钟的执行限制。
(我还知道我必须将 Perl 脚本重写为 Lambda 支持的语言)。
我假设我可以通过将代码重构为较小的函数来解决执行时间限制,从而保证在 5 分钟内完成。但在我的特殊情况下,这似乎效率低下。
目前,数据库更新任务一次处理一个文件中的行。为了与 Lambda 配合使用,Lambda 函数只需处理文件中的一行(或极少量的行),以保证执行时间不超过 5 分钟。这将涉及在每次调用 Lambda 函数时打开和关闭与数据库的连接。此外,处理的每一行都应将一个条目写入文件,并存储在 S3 中。现在,我只是在内存中保留一个文件句柄,并在处理完所有行后将文件写入 S3,但使用 Lambda,我需要继续读取文件、更新文件并将其写回 S3。
我要问的是:
是否可以在 aws 步骤函数中创建循环并循环遍历 json 输入数组?
我有一个函数generateEmails可以创建包含n多个对象的数组:
{
"emails": [
{
"to": [
"willow1@aaa.co.uk"
]
},
{
"to": [
"willow2@aaa.co.uk"
]
}, {
"to": [
"willow3@aaa.co.uk"
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
现在我想sendEmail为电子邮件数组中的每个对象调用下一个函数,如下所示:
{
"email": {
"to": [
"willow@aaa.co.uk"
]
}
}
Run Code Online (Sandbox Code Playgroud)
步骤功能代码:
{
"Comment": "A state machine that prepares and sends confirmation email ",
"StartAt": "generateEmails",
"States": {
"generateEmails": {
"Type": "Task",
"Resource": "arn:aws:lambda::prepare-confirmation-email",
"Next": "sendEmail"
},
"sendEmail": {
"Type": "Task",
"Resource": "arn:aws:lambda::function:template-service",
"End" : true …Run Code Online (Sandbox Code Playgroud) 当我尝试根据状态机定义创建状态机时,出现以下错误:
botocore.exceptions.ClientError: An error occurred (AccessDeniedException) when calling the CreateStateMachine operation: 'role' is not authorized to create managed-rule.
Run Code Online (Sandbox Code Playgroud)
创建代码:
state_machine = sfn_client.create_state_machine(
name = 'state-machine',
definition = state_machine_def,
roleArn = SFN_ROLE,
)
Run Code Online (Sandbox Code Playgroud)
我使用的 IAM 角色包含此处所述的所有必要权限。它需要拥有创建什么样的托管规则的权限?
我有一个输出以下内容的任务状态:
"batch": {
"batch": "size",
"currentTimestamp": 1596205376
},
Run Code Online (Sandbox Code Playgroud)
映射状态输出输出一个数组:
"batch": [
{
"batch": "product-batch-0",
"currentTimestamp": 1596205376
},
{
"batch": "product-batch-1",
"currentTimestamp": 1596205376
}
]
Run Code Online (Sandbox Code Playgroud)
我想将它们组合起来,以便地图状态之后的状态的输入如下:
"batch": [
{
"batch": "Size",
"currentTimestamp": 1596205376
},
{
"batch": "product-batch-22",
"currentTimestamp": 1596205376
},
{
"batch": "product-batch-8",
"currentTimestamp": 1596205376
}
]
Run Code Online (Sandbox Code Playgroud)
使用 aws 步骤函数中提供的输入/输出处理是否可以实现这一点?我希望将它们包含在一个数组中,以便稍后在状态机中的附加映射状态中一起处理它们。
我是 AWS Step Functions 和 AWS Batch 的新手。我正在尝试将 AWS Batch Job 与 Step Function 集成。AWS Batch Job 执行输出字符串值的简单 python 脚本(高级简化要求)。我需要让 python 脚本输出可用于步骤函数的下一个状态。我应该如何才能完成这个任务。AWS Batch 作业输出不包含 python 脚本的结果。相反,它包含所有与输入值相关的容器信息。
示例:AWS Batch Job 执行输出“Hello World”的 python 脚本。我需要“Hello World”可用于步骤函数的下一个状态,以执行与其关联的 lambda。
我无法找到一种方法来指定“null”到结果路径。
正如此处指出的: https: //docs.aws.amazon.com/step-functions/latest/dg/input-output-resultpath.html
我想在 CDK 中实现:“丢弃结果并保留原始输入”
我已阅读此讨论: https://github.com/aws/aws-cdk/issues/1805
但虽然已经关闭,但还没有最终答案。下面是代码片段:
const verifyDeviceJob = new tasks.LambdaInvoke(this, 'VerifyDeviceJobTask', {
lambdaFunction: verifyConditionDeviceFn,
inputPath: '$.detail',
resultPath: //HOW TO DECLARE IT TO NULL??
});
Run Code Online (Sandbox Code Playgroud) 给定一个Map状态,其输出是一个类似于以下内容的数组:
[
{
"ProcessState": {
"Status": "SUCCESS"
}
},
{
"ProcessState": {
"Status": "SUCCESS"
}
},
{
"ProcessState": {
"Status": "FAILURE"
}
}
]
Run Code Online (Sandbox Code Playgroud)
我希望能够测试是否有一个 Status = 'FAILURE' 的元素。我尝试使用 a Choicewith a choice 如下:
{
"Variable": "$..ProcessState[?(Status == FAILURE)]",
"IsPresent": true,
"Next": "Items Contained Failure"
}
Run Code Online (Sandbox Code Playgroud)
当尝试这个时我得到Value is not a Reference Path: Illegal '..' ...
我正在考虑尝试使用 aPass作为中间步骤,但我认为如果没有条目匹配,它就会失败,因为它找不到任何内容。
我创建了一个包含 4 个不同活动的步骤函数,这些活动依次运行,并且还集成为从 java 应用程序触发此步骤函数。流程看起来像这样。
开始 -> Activity1 -> Activity2 -> Activity3 -> Activity4 -> 停止
当某个活动(例如 Activity2)期间执行失败时,该执行将被标记为失败。
现在,是否可以从先前失败的活动(Activity2)中恢复此失败的执行,而不是开始新的执行?
我经历了可能的操作AWSStepFunctions,但似乎没有一个能解决这个要求。
https://docs.aws.amazon.com/step-functions/latest/apireference/API_Operations.html
我早在 8 月份就在论坛上发布了这个问题,询问 V3 JavaScript API 何时会像 V2 SDK 中那样添加对 AWS Step Functions 的支持。我在该线程上没有听到任何消息。
是否有人拥有可供我从 V2 SDK 迁移的替代解决方案?
我想在发布 SNS 消息时执行我的步骤函数并使用它。对此最好的解决方案是什么?
我知道一种选择是使用 Lambda,订阅 SNS 主题,然后从 Lambda 内部触发 SF...我想知道是否有任何(更简单的)解决方案无需此中间步骤。
amazon-web-services amazon-sns aws-lambda aws-step-functions
aws-lambda ×4
amazon-sns ×1
aws-batch ×1
aws-cdk ×1
boto3 ×1
java ×1
javascript ×1
json ×1
python ×1