在aws步骤函数中,我需要使用先前状态值的路径参数来调用api网关端点。

步骤功能代码(Api网关调用)
"API Gateway Request": {
"Type": "Task",
"Resource": "arn:aws:states:::apigateway:invoke",
"Parameters": {
"ApiEndpoint": "****.amazonaws.com",
"Method": "GET",
"Headers": {
"Accept": [
"application/json"
]
},
"Stage": "dev",
"Path": "/sample/$.id",
"AuthType": "IAM_ROLE"
},
"InputPath": "$.id",
"Next": "Lambda Invoke",
"ResultPath": "$.myStateInput"
}
Run Code Online (Sandbox Code Playgroud)
该状态的输入:
{ "id": "1231" }
Run Code Online (Sandbox Code Playgroud)
它不是将“$.id”替换为“1231”,而是像下面这样调用 url
API网关:
请告诉我做错了什么?
在测试时我收到以下消息:
Serverless Warning --------------------------------------
A valid service attribute to satisfy the declaration
'self:resources.Outputs.StateMachine.Value' could not be found.
Run Code Online (Sandbox Code Playgroud)
serverless.yml 的摘录
name: aws
runtime: nodejs12.x
stage: ${opt:stage, 'dev'}
region: us-east-1
lambdaHashingVersion: 20201221
versionFunctions: false
environment:
statemachine_arn: ${self:resources.Outputs.StateMachine.Value}
Run Code Online (Sandbox Code Playgroud)
国家职能
stepFunctions:
stateMachines:
updateMetric:
name: updateMetric
definition:
Comment: "A state machine to update data"
StartAt: getMetric
........
........
Run Code Online (Sandbox Code Playgroud)
resources:
- ${file(./resources/dynamodb-table.yml)}
- Outputs:
StateMachine:
Value:
Ref: UpdateMetric
Run Code Online (Sandbox Code Playgroud)
我只是试图传递状态机的 ARN,以便我可以从 lamda 函数启动状态机。
看来我在输出部分的参考不起作用,或者我没有在这里正确调用它:
environment:
statemachine_arn: ${self:resources.Outputs.StateMachine.Value}
Run Code Online (Sandbox Code Playgroud) aws-lambda serverless-framework aws-step-functions serverless-framework-step-functions
我在 CloudFormation 中定义了一个步骤函数,它使用arn:aws:states:::ecs:runTask.waitForTaskToken. 此任务采用子网列表作为参数,并且需要至少定义 1 个子网。例子:
# Step Function
MyECSTask:
Type: Task
Resource: arn:aws:states:::ecs:runTask.waitForTaskToken
Parameters:
...
NetworkConfiguration:
AwsvpcConfiguration:
...
Subnets:
- <subnet 1>
- <subnet 2>
Run Code Online (Sandbox Code Playgroud)
我在 StringList SSM 参数中定义了多个子网,我试图通过属性使用 Cloud Formation 将其传递到步骤函数DefinitionSubstitutions。但是,我无法将 SSM StringList 参数作为列表传递到 Step Function 工作流程。将值按原样直接传递到 Step Functions 中不起作用:它要么出错,要么将其作为单个字符串值传递(这是不久前的事,所以我无法准确记住结果)。
相反,唯一对我有用的解决方案是在 CloudFormation 中拆分 StringList 值,并将每个子网作为单独的替换传递到 Step Function:
# Step Function
MyECSTask:
Type: Task
Resource: arn:aws:states:::ecs:runTask.waitForTaskToken
Parameters:
...
NetworkConfiguration:
AwsvpcConfiguration:
...
Subnets:
- ${Subnet1}
- ${Subnet2}
- ${Subnet3}
Run Code Online (Sandbox Code Playgroud)
# Cloud Formation
Parameters:
ListOfSubnets:
Type: AWS::SSM::Parameter::Value<CommaDelimitedList> …Run Code Online (Sandbox Code Playgroud) 在我的步骤函数中,我想执行 Athena 查询。我能够定义一个步骤并成功执行查询。但是,我想传递一些参数作为输入并在查询字符串中使用它们。例如。
假设我的查询字符串是:
select * from <Data Source>.<database>.<tablename> where partition_0 = '2021';
我希望能够将年份作为输入 json 传递给步骤函数,例如:
{
"YYYY": 2021
}
Run Code Online (Sandbox Code Playgroud)
是否可以在查询字符串中插入输入“YYYY”?如果是这样,怎么办?
步骤函数配置示例:
{
"Comment": "Start athena exececution",
"StartAt": "athena",
"States": {
"athena": {
"Type": "Task",
"InputPath": "$",
"Resource": "arn:aws:states:::athena:startQueryExecution.sync",
"Parameters": {
"QueryString": "select * from mycatalog.mydatabase.mytable where partition_0 = '2021'",
"WorkGroup": "primary",
"ResultConfiguration": {
"OutputLocation": "s3://mys3bucket"
}
},
"Next": "Pass"
},
"Pass": {
"Comment": "A Pass state passes its input to its output, without performing work. Pass states are useful …Run Code Online (Sandbox Code Playgroud) 在 AWS Step Functions 中,我们可以使用以下语法将之前步骤中的参数用作输入。
"Parameters": {
"Details": {
"weight.$": "$.product.weight",
"unit": "grams"
}
}
Run Code Online (Sandbox Code Playgroud)
举个例子,说product.weight.是500。我可以配置一个将接收值的参数500 grams吗?
例如,这样的事情:
"Parameters": {
"Details": {
"formatted_weight.$": "{$.product.weight} grams",
}
}
Run Code Online (Sandbox Code Playgroud) 我目前正在创建一个 Step Functions 工作流程,其中包含一些 Lambda 和其他在一个任务与其他任务之间共享状态的服务。
我主要是在 Lambda 上执行一些外部请求,并在任务之间共享来处理这些数据。
当我尝试测试 Step Functions 工作流程时,收到以下错误:States.DataLimitExceeded,但当我在 Lambda 控制台上测试时,一切正常。
错误:
谁能帮助我了解我在 Step Functions 工作流程中做错了什么?
如何等待 CodeBuild 在 Step Functions 状态机内完成?
我现在能想到的唯一等待是使用循环和计时器,就像下面的流程一样,但这是唯一的方法吗?没有“WaitForBuild”操作或类似的操作吗?
拼写错误:BatchGetBuildBatches 应该是 BatchGetBuilds。
我有一个由 aws 步骤函数中的状态调用的外部服务,现在我想从这个外部服务发送“sendTaskSuccess”到特定的 aws 步骤机器。我怎样才能做到这一点。我知道我们可以从 lambda 调用“sendSuccessToken”,但想知道如何在没有 lambda 的情况下使用“sendSuccessToken”。
假设我有一个状态,其输入是
{'myList': ['foo', 'bar']}
Run Code Online (Sandbox Code Playgroud)
其结果是hello,我想将结果附加到列表中,以便状态的输出变为
{'myList': ['foo', 'bar', 'hello']}
Run Code Online (Sandbox Code Playgroud)
我实际上想对几个连续的状态执行此操作,以便每个状态将其结果附加到存储在输入对象中的列表中。
我创建了这样的东西:
{
"Comment": "A description of my awesome state machine",
"StartAt": "Splitter",
"States": {
"Splitter": {
"Type": "Pass",
"End": true,
"Parameters": {
"out.$": "States.ArrayGetItem(States.StringSplit($.url, '//'), 1)"
},
"ResultPath": "$.test"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我需要在分割字符串后获取第二个元素,但它失败并出现以下错误:
An error occurred while executing the state 'Splitter' (entered at the event id #2).
There was an error while evaluating the intrinsic function: States.ArrayGetItem(States.Array(States.StringSplit($.url, '//')),1).
Invalid arguments in States.ArrayGetItem
Run Code Online (Sandbox Code Playgroud)
我也尝试过这样的:
"States.ArrayGetItem(States.Array(States.StringSplit($.url, '//')),1)"
Run Code Online (Sandbox Code Playgroud)
但错误仍然存在。
我想这可以在两种状态下完成Pass,但应该可以在一种状态下完成。
aws-lambda ×3