Mat*_*att 18 amazon-web-services aws-cloudformation amazon-iam aws-step-functions aws-sam
我在 SAM/CloudFormation 模板中创建了一个 Step Function(父),它调用另一个 Step Function(子)。我正在按照使用服务集成模式从 Parent 调用 Child 的说明进行操作。但是我遇到了一个与 IAM 相关的(我认为)错误,我在通过 CLI 部署时无法解决。(错误显示在 CLI 输出中,因此它从未真正进入 AWS。之前有很多部署,因此changeset只是尝试使用此部署修改 Step Function。)
'arn:aws:iam::{Account-Number}:role/{Parent-Step-Function-Role-Name}' is not authorized to create managed-rule. (Service: AWSStepFunctions; Status Code: 400; Error Code: AccessDeniedException; Request ID: {Long-Id-Number})
为了获得我想要的同步行为(父调用子,等待子的执行完成,然后移动到下一个状态)我使用建议(来自上面的服务集成模式链接)创建一个任务(在我的 SAM 模板中)如下所示:
...More States...
"Call Child State": {
"Type": "Task",
"Next": "The Next State",
"Resource": "arn:aws:states:::states:startExecution.sync",
"Parameters": {
"Input": {
"comment": "Hello World!"
},
"StateMachineArn": "${ChildStepFunction}",
"Name": "ChildExecutionFromParent"
}
},
...More States...
Run Code Online (Sandbox Code Playgroud)
我已经为 Parent 定义了 IAM 角色,如下所示,确保它只对 Parent 中的 Lambda 函数具有 Lambda 执行权限,并且更适用于该问题,具有StartExecutionChild 的权限。我按照下面链接中的说明进行操作,其中指出 StartExecution 是使用服务集成模式时所需的唯一权限。
https://docs.aws.amazon.com/step-functions/latest/dg/stepfunctions-iam.html
ParentStepFunctionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
-
Effect: Allow
Principal:
Service:
- !Sub states.${AWS::Region}.amazonaws.com
Action: sts:AssumeRole
Policies:
-
PolicyName: ChildStepFunctionExecution
PolicyDocument:
Version: 2012-10-17
Statement:
-
Effect: Allow
Action: states:StartExecution
Resource: !Ref ChildStepFunction
-
Effect: Allow
Action: lambda:InvokeFunction
Resource:
- !GetAtt Function1.Arn
...
- !GetAtt FunctionX.Arn
Run Code Online (Sandbox Code Playgroud)
我已经尝试用一个简单的PassState替换上面的 State,以确保 Step Function 中没有其他错误阻止部署,并且它部署得很好。所以我知道这与那个国家有关。(另外值得注意的是,当与PassState 一起部署进行测试时,我离开了上面定义的角色,所以,我再次知道这不是导致这种情况的策略的语法错误。显然,这与可能具有的错误或遗漏的政策。)
And*_*ttz 18
[根据@Matt 的帖子和@Joe.CK 的评论于 2020 年 5 月 22 日更新,将范围缩小到所需的特定资源。]
这个 Stack Overflow 问题为我指明了正确的方向。botocore.exceptions.ClientError: 调用 CreateStateMachine 操作时发生错误 (AccessDeniedException)
该问题似乎源于 CloudWatch,我能够通过将以下语句添加到我的 IAM 策略来解决它。
- Effect: Allow
Action:
- events:PutTargets
- events:PutRule
- events:DescribeRule
Resource:
- !Sub arn:${AWS::Partition}:events:${AWS::Region}:${AWS::AccountId}:rule/StepFunctionsGetEventsForStepFunctionsExecutionRule
Run Code Online (Sandbox Code Playgroud)
AWS Step Functions 示例项目“在工作流中启动工作流”包括类似但仅限于它调用的单个 Lambda 函数的内容。
添加解决问题的完整角色定义,结合 Andrew 提供的内容和文档中的内容。它分为四个部分:
ParentStepFunctionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
-
Effect: Allow
Principal:
Service:
- !Sub states.${AWS::Region}.amazonaws.com
Action: sts:AssumeRole
Policies:
-
PolicyName: ParentStepFunctionExecutionPolicy
PolicyDocument:
Version: 2012-10-17
Statement:
-
Effect: Allow
Action: states:StartExecution
Resource: !Ref ChildStepFunction
-
Effect: Allow
Action:
- states:DescribeExecution
- states:StopExecution
Resource: "*"
-
Effect: Allow
Action:
- events:PutTargets
- events:PutRule
- events:DescribeRule
Resource: !Sub arn:aws:events:${AWS::Region}:${AWS::AccountId}:rule/StepFunctionsGetEventsForStepFunctionsExecutionRule
-
Effect: Allow
Action: lambda:InvokeFunction
Resource:
- !GetAtt Function1.Arn
...
- !GetAtt FunctionX.Arn
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7229 次 |
| 最近记录: |