我正在使用cloudformation来更新我的aws堆栈。我有几台状态机。我也使用cloudformation更新它们并获取它们的ARN并将它们作为环境变量再次放入我的云形成堆栈中的lambda函数中。
然而问题是:当我更改我的步骤函数并更新我的堆栈时,cloudformation将删除旧的状态机并创建具有随机名称的新状态机。我可以得到ARN并在我的lambda中使用它们,这不是问题,但我的旧状态机将被删除。这意味着任何正在运行的执行都会被下一个状态转换停止。我可能长时间运行状态机执行。看起来我不能在prod环境中这样做。
有什么建议吗?
编辑:
我正在为我的状态机使用AWS Step Functions。这个问题是关于AWS Step Functions和Cloudformation的。如何使用cloudformation运行执行来更新步骤函数。
答案 0 :(得分:1)
我想我发现了它是如何工作的。
DeleteStateMachine的文档说:
删除状态机。这是一个异步操作 - 它将状态机的状态设置为“DELETING”并开始删除过程。每次状态机执行都将在下次进行状态转换时被删除。完成所有执行或删除后,状态机本身将被删除。
这让我觉得在使用cloudformation更新状态机时,它会在每次执行的下一次状态转换后立即删除正在运行的状态机。我想情况并非如此。因为我尝试更换长时间运行的状态机,现在它说:
删除。 当任何执行正在进行时,删除操作将无法完成。请考虑通过控制台,API或命令行停止任何长时间运行的执行。
这与文档中有关删除状态机的内容存在冲突。但是我猜Cloudformation不使用文档中提到的相同Delete操作。
最好从AWS专家那里得到关于此问题的澄清。
答案 1 :(得分:0)
我最近关于CloudFormation + Step Functions的课程是始终首先使用boto3或任何其他SDK创建状态机,因为CloudFormation不会告诉您是否缺少任何权限。 boto3调用将立即失败,并显示一条非常清晰的错误消息。而CloudFormation(CFN)只会尝试重试将近一个小时,然后甚至无法正确回滚。我认为状态机更新的CFN实现同样糟糕。我的建议是始终删除一台计算机,然后使用新名称创建一台新计算机。对于CFN资源,这是非常典型的情况,因为在实际情况下,更新实际上并不起作用,因为删除操作是异步的,我怀疑CFN实现无法解决该问题,并且当需要替换资源时,它只是尝试直接创建一个新资源。用相同的名字消失,显然失败了。没有开放的CFN错误列表,因此所有这些都是推测。我本周初去了AWS Summit,与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: "*"