我应该如何通过 cloudformation 部署我的 aws 状态机?

Posted

技术标签:

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

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

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

有什么建议吗?

编辑:

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

【问题讨论】:

您是否在状态机中使用 aws 步进函数? 是的。也许我应该将其添加到我的问题中。让我编辑它。谢谢。 【参考方案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

【讨论】:

以上是关于我应该如何通过 cloudformation 部署我的 aws 状态机?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Cloudformation 强制重新部署我的 API 网关

通过 CloudFormation 部署 AWS UserPool 并更新属性

如何在没有内联代码的情况下使用 lambda 函数部署 cloudformation?

AWS CloudFormation 创建堆栈与部署

如何将 AWS CloudWatch 仪表板转换为 CloudFormation 模板

使用 Auto Scaling 组、CloudFormation 和 CodeDeploy 的蓝/绿部署