由于未定义的资源策略,IAM 嵌套堆栈无法完成



>我创建了一个嵌套的 IAM 堆栈,其中包含 3 个模板: - IAM政策 - IAM角色 -IAM 用户/组

主堆栈模板如下所示:

Resources:
Policies:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: https://s3.amazonaws.com/xxx/iam/iam_policies.yaml
UserGroups:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: https://s3.amazonaws.com/xxx/iam/iam_user_groups.yaml

Roles:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: https://s3.amazonaws.com/xxx/iam/iam_roles.yaml

策略 ARN 通过输出部分导出,如下所示:

Outputs:
StackName:
Description: Name of the Stack
Value: !Ref AWS::StackName
CodeBuildServiceRolePolicy:
Description: ARN of the managed policy
Value: !Ref CodeBuildServiceRolePolicy

在角色模板中,导入策略 ARN,如下所示

CodeBuildRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Sub ${EnvironmentName}-CodeBuildRole
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Action: 
- 'sts:AssumeRole'
Effect: Allow
Principal:
Service: 
- codebuild.amazonaws.com
Path: / 
ManagedPolicyArns:
- !GetAtt 
- Policies
- Outputs.CodeBuildServiceRolePolicy

但是当我尝试创建堆栈时,它失败了,说无法创建角色堆栈,因为

Template error: instance of Fn::GetAtt references undefined resource Policies

如何先强制创建策略,以便第二个和第三个模板可以使用策略创建角色和用户/组?还是问题在别处?

怜悯 A

你的问题,

如何首先强制创建策略,以便第二个和 第三个模板可以使用策略来创建角色和用户/组吗? 还是问题在别处?

您可以使用"依赖"属性。它会自动确定模板中的哪些资源可以并行化,哪些资源具有需要其他操作才能首先完成的依赖项。您可以使用 DependsOn 显式指定依赖关系,这将覆盖默认并行性,并指示 CloudFormation 按指定顺序对这些资源进行操作。

在您的情况下,第二个和第三个模板依赖于策略

更多详情 : 依赖

无法访问输出的原因是,您没有公开其他堆栈的输出。

使用要导出的数据更新输出。参考 - 相同的输出。

然后,使用依赖堆栈中的函数 Fn::ImportValue 来使用所需的数据。参考 - 相同的导入值。

希望这有帮助。

最新更新