有没有办法从 AWS Step Function 读取 S3 文件的内容?
Is there any way to read the contents of an S3 file from an AWS Step Function?
我有一个特定的工作流程,我想将 500 个 json 字符串的列表从 lambda 函数传递到步进函数 (stepFunction1
),然后在该步骤中遍历该列表函数的映射状态。从那里,我想将列表中的每个项目传递给一个单独的步骤函数 (stepFunction2
),在那里将完成额外的工作。
我的问题是我的 500 json 个字符串列表在传递给 stepFunction1
时超出了 AWS 服务限制。我曾尝试将列表拆分为几个较小的部分,但这会导致同时调用 stepFunction1
运行 ,由于其他限制,我不能这样做。我的下一个想法是尝试将 json 字符串列表存储在 S3 存储桶中,从 stepFunction1
访问它,然后从那里迭代它。有什么办法可以做到这一点?是否可以从 AWS 状态机读取 S3 中的文件?我在这里有点难过。
一种解决方案是将项目存储在 Amazon DynamoDB table 中并直接从 AWS Step Functions 访问它们。
下面是一个如何从 DynamoDB 检索项目的示例:
"Read Next Message from DynamoDB": {
"Type": "Task",
"Resource": "arn:aws:states:::dynamodb:getItem",
"Parameters": {
"TableName": "MyTable",
"Key": {
"MessageId": {"S.$": "$.List[0]"}
}
},
"ResultPath": "$.DynamoDB",
"Next": "Do something"
}
您可以在文档中找到有关 calling DynamoDB APIs with Step Functions 的更多信息。
Step 函数与 AWS Lambda 函数配合得非常好,您可以轻松设计一个漂亮的工作流程。
您可以从 lambda 中读取 S3。最后,您的 lambda 可以单独工作并成为阶跃函数的一部分。
我建议您先创建一个 lambda 函数,读取并处理 s3 文件,然后再尝试使用 stepfunction(如果它适合您的场景)。
您可以使用 GetObject S3 API。它可以读取存储在 S3 中的 JSON 文件作为状态输出的 Body 实体下的字符串,因此您可以使用内部函数“States.JsonToString”在 ResultSelector 将其转换为 JSON,例如"myJson.$": "States.StringToJson($.Body)".
代码示例可以是:
{
"StartAt": "GetObject",
"States": {
"GetObject": {
"Type": "Task",
"Parameters": {
"Bucket": "<YOUR S3 Bucket Name>",
"Key": "<YOUR JSON File Name>"
},
"Resource": "arn:aws:states:::aws-sdk:s3:getObject",
"End": true,
"ResultSelector": {
"myJson.$": "States.StringToJson($.Body)"
}
}
},
"Comment": "S3 -> JSON",
"TimeoutSeconds": 60
}
我有一个特定的工作流程,我想将 500 个 json 字符串的列表从 lambda 函数传递到步进函数 (stepFunction1
),然后在该步骤中遍历该列表函数的映射状态。从那里,我想将列表中的每个项目传递给一个单独的步骤函数 (stepFunction2
),在那里将完成额外的工作。
我的问题是我的 500 json 个字符串列表在传递给 stepFunction1
时超出了 AWS 服务限制。我曾尝试将列表拆分为几个较小的部分,但这会导致同时调用 stepFunction1
运行 ,由于其他限制,我不能这样做。我的下一个想法是尝试将 json 字符串列表存储在 S3 存储桶中,从 stepFunction1
访问它,然后从那里迭代它。有什么办法可以做到这一点?是否可以从 AWS 状态机读取 S3 中的文件?我在这里有点难过。
一种解决方案是将项目存储在 Amazon DynamoDB table 中并直接从 AWS Step Functions 访问它们。
下面是一个如何从 DynamoDB 检索项目的示例:
"Read Next Message from DynamoDB": {
"Type": "Task",
"Resource": "arn:aws:states:::dynamodb:getItem",
"Parameters": {
"TableName": "MyTable",
"Key": {
"MessageId": {"S.$": "$.List[0]"}
}
},
"ResultPath": "$.DynamoDB",
"Next": "Do something"
}
您可以在文档中找到有关 calling DynamoDB APIs with Step Functions 的更多信息。
Step 函数与 AWS Lambda 函数配合得非常好,您可以轻松设计一个漂亮的工作流程。
您可以从 lambda 中读取 S3。最后,您的 lambda 可以单独工作并成为阶跃函数的一部分。
我建议您先创建一个 lambda 函数,读取并处理 s3 文件,然后再尝试使用 stepfunction(如果它适合您的场景)。
您可以使用 GetObject S3 API。它可以读取存储在 S3 中的 JSON 文件作为状态输出的 Body 实体下的字符串,因此您可以使用内部函数“States.JsonToString”在 ResultSelector 将其转换为 JSON,例如"myJson.$": "States.StringToJson($.Body)".
代码示例可以是:
{
"StartAt": "GetObject",
"States": {
"GetObject": {
"Type": "Task",
"Parameters": {
"Bucket": "<YOUR S3 Bucket Name>",
"Key": "<YOUR JSON File Name>"
},
"Resource": "arn:aws:states:::aws-sdk:s3:getObject",
"End": true,
"ResultSelector": {
"myJson.$": "States.StringToJson($.Body)"
}
}
},
"Comment": "S3 -> JSON",
"TimeoutSeconds": 60
}