我应该如何通过 cloudformation 部署我的 aws 状态机?
How should I deploy my aws state machines through cloudformation?
我正在使用 cloudformation 更新我的 aws 堆栈。我有几个状态机。我也使用 cloudformation 更新它们并获取它们的 ARN,并将它们作为环境变量再次放入我的云形成堆栈中的 lambda 函数。
但问题是:当我更改步骤函数并更新堆栈时,cloudformation 将删除旧状态机并创建具有随机名称的新状态机。我可以获得 ARN 并在我的 lambda 中使用它们,这不是问题,但我的旧状态机将被删除。这意味着任何 运行 次执行都会在下一次状态转换时停止。我可能有很长的 运行 状态机执行。看起来我不能在产品环境中执行此操作。
有什么建议吗?
编辑:
我正在为我的状态机使用 AWS Step Functions。这个问题是关于 AWS Step Functions 和 Cloudformation 的。如何使用 cloudformation 运行 次执行来更新步进函数。
我想我知道这是怎么回事了。
DeleteStateMachine 的文档说:
Deletes a state machine. This is an asynchronous operation-- it sets the state machine's status to "DELETING" and begins the delete process. Each state machine execution will be deleted the next time it makes a state transition. After all executions have completed or been deleted, the state machine itself will be deleted.
这让我想到,当使用 cloudformation 更新状态机时,它会在每次执行的下一次状态转换后立即删除 运行 状态机。我想情况并非如此。因为我尝试更换一个长 运行 状态机,现在它说:
Deleting.
The deletion operation will not complete while any Executions are In Progress. Consider stopping any long-running Executions via the console, API, or command line.
这与文档中关于删除状态机的内容相冲突。但是我猜 Cloudformation 不使用与文档中提到的相同的 Delete 操作。
如果有 AWS 专家对此事进行澄清,那就太好了。
我最近关于 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: "*"
这个问题和接受的答案是在 UpdateStateMachine API 发布之前写的,它允许您更新现有的状态机。
您可以编辑 AWS::StepFunctions::StateMachine
除了 StateMachineName
和 StateMachineType
的属性,CloudFormation 将不间断地更新现有资源(删除状态机并重新创建它)。
我正在使用 cloudformation 更新我的 aws 堆栈。我有几个状态机。我也使用 cloudformation 更新它们并获取它们的 ARN,并将它们作为环境变量再次放入我的云形成堆栈中的 lambda 函数。
但问题是:当我更改步骤函数并更新堆栈时,cloudformation 将删除旧状态机并创建具有随机名称的新状态机。我可以获得 ARN 并在我的 lambda 中使用它们,这不是问题,但我的旧状态机将被删除。这意味着任何 运行 次执行都会在下一次状态转换时停止。我可能有很长的 运行 状态机执行。看起来我不能在产品环境中执行此操作。
有什么建议吗?
编辑:
我正在为我的状态机使用 AWS Step Functions。这个问题是关于 AWS Step Functions 和 Cloudformation 的。如何使用 cloudformation 运行 次执行来更新步进函数。
我想我知道这是怎么回事了。
DeleteStateMachine 的文档说:
Deletes a state machine. This is an asynchronous operation-- it sets the state machine's status to "DELETING" and begins the delete process. Each state machine execution will be deleted the next time it makes a state transition. After all executions have completed or been deleted, the state machine itself will be deleted.
这让我想到,当使用 cloudformation 更新状态机时,它会在每次执行的下一次状态转换后立即删除 运行 状态机。我想情况并非如此。因为我尝试更换一个长 运行 状态机,现在它说:
Deleting. The deletion operation will not complete while any Executions are In Progress. Consider stopping any long-running Executions via the console, API, or command line.
这与文档中关于删除状态机的内容相冲突。但是我猜 Cloudformation 不使用与文档中提到的相同的 Delete 操作。
如果有 AWS 专家对此事进行澄清,那就太好了。
我最近关于 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: "*"
这个问题和接受的答案是在 UpdateStateMachine API 发布之前写的,它允许您更新现有的状态机。
您可以编辑 AWS::StepFunctions::StateMachine
除了 StateMachineName
和 StateMachineType
的属性,CloudFormation 将不间断地更新现有资源(删除状态机并重新创建它)。