【问题标题】:How should I deploy my aws state machines through cloudformation?我应该如何通过 cloudformation 部署我的 aws 状态机?
【发布时间】:2017-08-14 03:37:33
【问题描述】:

我正在使用 cloudformation 来更新我的 aws 堆栈。我有几个状态机。我也用 cloudformation 更新它们并获取它们的 ARN,并将它们作为环境变量再次放入我的云形成堆栈中的 lambda 函数。

但是问题是这样的:当我更改步进函数并更新堆栈时,cloudformation 将删除旧状态机并创建具有随机名称的新状态机。我可以获得 ARN 并在我的 lambda 中使用它们,这不是问题,但我的旧状态机将被删除。这意味着任何正在运行的执行都将在下一个状态转换时停止。我可能有长时间运行的状态机执行。看起来我无法在 prod 环境中执行此操作。

有什么建议吗?

编辑:

我正在为我的状态机使用 AWS Step Functions。这个问题是关于 AWS Step Functions 和 Cloudformation 的。如何通过 cloudformation 运行执行来更新步进函数。

【问题讨论】:

  • 您是否在状态机中使用 aws 步进函数?
  • 是的。也许我应该将其添加到我的问题中。让我编辑它。谢谢。

标签: amazon-web-services amazon-cloudformation aws-step-functions


【解决方案1】:

我想我知道这是如何工作的。

DeleteStateMachine 的文档说:

删除状态机。这是一个异步操作——它将状态机的状态设置为“DELETING”并开始删除过程。 下一次进行状态转换时将删除每个状态机执行。在所有执行完成或被删除后,状态机本身将被删除。

这让我想到,当使用 cloudformation 更新状态机时,它会在每次执行的下一次状态转换后立即删除正在运行的状态机。我想情况并非如此。因为我尝试更换一个长时间运行的状态机,现在它说:

删除。 当任何执行正在进行时,删除操作将不会完成。考虑通过控制台、API 或命令行停止任何长时间运行的执行。

这种与文档中关于删除状态机的说法相冲突。但是我猜 Cloudformation 不使用文档中提到的相同删除操作。

如果 AWS 专家就此事进行澄清会很好。

【讨论】:

    【解决方案2】:

    我最近使用 CloudFormation + Step Functions 的课程是始终首先使用 boto3 或任何其他 SDK 创建状态机,因为 CloudFormation 不会告诉您是否缺少任何权限。 boto3 调用将立即失败,并显示非常清晰的错误消息。而 CloudFormation (CFN) 只会尝试并重试近一个小时,然后甚至无法正确回滚。我认为状态机更新的 CFN 实现同样糟糕。我的建议是始终删除一台机器,然后用新名称创建一台新机器。这对于 CFN 资源来说是非常典型的,因为删除是异步的,所以更新在实际场景中并不真正起作用,我怀疑 CFN 实现没有考虑到这一点,当需要替换资源时,它只是尝试直接创建一个新的离开同名,显然失败了。没有开放的 CFN 错误列表,所以这一切都是猜测。本周早些时候我参加了 AWS 峰会,与一位 AWS 架构师(AWS 员工)交谈,他只是脸红了。

    这是我的状态机创建没有失败的 IAM 角色:

    StateMachineRole:
        Type: AWS::IAM::Role
        Properties:
            AssumeRolePolicyDocument:
            Version: 2012-10-17
            Statement:
                - Effect: Allow
                Principal:
                    Service:
                    - !Sub "states.${AWS::Region}.amazonaws.com"
                Action: sts:AssumeRole
            ManagedPolicyArns:
            - arn:aws:iam::aws:policy/service-role/AWSLambdaRole
            - arn:aws:iam::aws:policy/AWSStepFunctionsFullAccess
            Policies:
            - PolicyName: StateMachineAccessPolicy
                PolicyDocument:
                Statement:
                    - Effect: Allow
                    Action:
                        - events:*
                    Resource: "*"
    

    【讨论】:

      【解决方案3】:

      这个问题和接受的答案是在UpdateStateMachine API 发布之前编写的,它允许您更新现有的状态机。

      您可以编辑AWS::StepFunctions::StateMachine 的属性except StateMachineNameStateMachineType,CloudFormation 将不间断地更新现有资源(删除状态机并重新创建它)。

      https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-19
        • 2019-01-22
        • 2017-05-06
        • 2020-04-10
        • 2018-03-21
        • 2020-05-30
        • 2014-02-21
        • 2017-10-21
        相关资源
        最近更新 更多