Amazon web services 我可以在状态机定义文件中使用全局变量吗?

Amazon web services 我可以在状态机定义文件中使用全局变量吗?,amazon-web-services,aws-step-functions,Amazon Web Services,Aws Step Functions,我正在使用AWS SAM进行一个无服务器项目,该项目由lambda和状态机资源组成(请参见下面的SAM模板)。我想知道是否有一种方法可以在我的状态机定义文件中定义一个“全局”变量,就像我们在SAM模板中使用的方法一样 我想这样做的原因是缩短我的状态机定义。现在,有一些状态使用了完全相同的属性,例如我的Fargate任务的NetworkConfiguration块: definition.asl.json { "StartAt": "Generate Conf

我正在使用AWS SAM进行一个无服务器项目,该项目由lambda和状态机资源组成(请参见下面的SAM模板)。我想知道是否有一种方法可以在我的状态机定义文件中定义一个“全局”变量,就像我们在SAM模板中使用的方法一样

我想这样做的原因是缩短我的状态机定义。现在,有一些状态使用了完全相同的属性,例如我的Fargate任务的
NetworkConfiguration
块:

definition.asl.json

{
    "StartAt": "Generate Config",
    "States": {
        "Generate Config": {
            "Type": "Task",
            "Resource": "${GenerateConfigFunctionArn}",
            "Next": "ETL"
        },
        "ETL": {
            "Type": "Task",
            "Resource": "arn:aws:states:::ecs:runTask.sync",
            "Next": "ETL",
            "Parameters": {
                "LaunchType": "FARGATE",
                "Cluster": "arn:aws:ecs:region:11111111:cluster/clustername",
                "TaskDefinition": "arn:aws:ecs:region:11111111:task-definition/taskdef",
                "NetworkConfiguration": {
                    "AwsvpcConfiguration": {
                        "Subnets": [
                            "subnet-00d610225d369486e"
                        ],
                        "SecurityGroups": [
                            "sg-016650ff9ecd28a9a"
                        ],
                        "AssignPublicIp": "ENABLED"
                    }
                },
                "Overrides": {
                    "ContainerOverrides": [
                        {
                            "Name": "Phase-1-start",
                            "Environment": [
                                {
                                    "Name": "COMMAND",
                                    "Value": "etl"
                                }
                            ]
                        }
                    ]
                }
            }
        },
        "Well_Calc": {
            "Type": "Task",
            "Resource": "arn:aws:states:::ecs:runTask.sync",
            "End": true,
            "Parameters": {
                "LaunchType": "FARGATE",
                "Cluster": "arn:aws:ecs:region:11111111:cluster/clustername",
                "TaskDefinition": "arn:aws:ecs:region:11111111:task-definition/taskdef",
                "NetworkConfiguration": {
                    "AwsvpcConfiguration": {
                        "Subnets": [
                            "subnet-00d610225d369486e"
                        ],
                        "SecurityGroups": [
                            "sg-016650ff9ecd28a9a"
                        ],
                        "AssignPublicIp": "ENABLED"
                    }
                },
                "Overrides": {
                    "ContainerOverrides": [
                        {
                            "Name": "Phase-1-start",
                            "Environment": [
                                {
                                    "Name": "COMMAND",
                                    "Value": "calculation"
                                }
                            ]
                        }
                    ]
                }
            }
        }
    }
}
SAM模板

AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31

Resources:
  MySAMPOC:
    Type: AWS::Serverless::StateMachine
    Properties:
      DefinitionUri: stateMachine/definition.asl.json
      DefinitionSubstitutions:
        GenerateConfigFunctionArn: !GetAtt GenerateConfigFunction.Arn
  GenerateConfigFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: functions/generate_config
      Handler: app.lambda_handler
      Runtime: python3.8


状态机定义是否支持使用全局变量(或类似变量)?

全局变量目前不支持
AWS::Serverless::StateMachine
。您可以考虑的一些备选方案:

  • 对某些值使用
    定义替换
  • Step函数现在在开发工具中支持YAML,所以从JSON切换到YAML至少可以节省一点缩进和大括号
  • 使用CDK定义您的状态机。您可以创建封装公共属性的自定义构造。显然,这不是山姆,但您可以将山姆资源与CDK应用程序集成在一起,或者考虑将应用程序的部分迁移到CDK。李>
感谢您的回答和详细建议!我想我会尝试一下定义替换,看看在我的案例中它是如何工作的。