Amazon web services 名为ExRole的导出已由堆栈根角色导出

Amazon web services 名为ExRole的导出已由堆栈根角色导出,amazon-web-services,amazon-cloudformation,amazon-iam,Amazon Web Services,Amazon Cloudformation,Amazon Iam,我想重用此模板,但当我使用嵌套堆栈启动此模板时,会出现错误名为ExRole的导出已由堆栈根角色导出。如何提高模板的可重用性。这样我就可以在Prod、dev和其他环境中部署相同的模板。我曾尝试在角色名称中使用环境变量,但如何在输出中使用它?如果要在下一个模板中使用该输出,语法应该是什么 角色: 任务: 根目录: 通常,当人们使用输出时,如果模板在同一父堆栈中被多次使用,他们会在导出前加上一个变量(例如堆栈名称)以使其唯一 这可以使用以下示例中的 Outputs: ExRole: Des

我想重用此模板,但当我使用嵌套堆栈启动此模板时,会出现错误
名为ExRole的导出已由堆栈根角色导出
。如何提高模板的可重用性。这样我就可以在Prod、dev和其他环境中部署相同的模板。我曾尝试在角色名称中使用环境变量,但如何在输出中使用它?如果要在下一个模板中使用该输出,语法应该是什么

角色:

任务:

根目录:


通常,当人们使用输出时,如果模板在同一父堆栈中被多次使用,他们会在导出前加上一个变量(例如堆栈名称)以使其唯一

这可以使用以下示例中的

Outputs:
  ExRole:
    Description: Task excution role
    Value: !Ref ExRole
    Export:
        Name: !Sub "${AWS::StackName}-ExRole"
  InstanceProfile:
    Description: profile for container instances
    Value: !Ref InstanceProfile
    Export:
        Name: !Sub "${AWS::StackName}-InstanceProfile"
然后需要将此堆栈ID值作为参数传递到需要引用此文件的嵌套堆栈中。这将再次使用子内在函数引用导出名称

要在
ImportValue
内在函数中获取此值,您可以像下面那样引用它,为此,您需要将堆栈名称作为参数传递给堆栈:

Fn::ImportValue: !Sub "${NestedStack}-ExRole"
如果从父堆栈调用另一个堆栈,则可以忽略导出,而是使用GetAtt内在函数将输出传递到下一个堆栈

Resources:
  Vpcstack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: !Sub "https://${bucketname}.s3.us-east-2.amazonaws.com${bucketpath}/vpc.yml"
      Parameters:  
        Env: !Ref Env
        Cidr: !Ref Cidr
        Publicsubnet1: !Ref Publicsubnet1
        Publicsubnet2: !Ref Publicsubnet2
        Privatesubnet1: !Ref Privatesubnet1
        Privatesubnet2: !Ref Privatesubnet2  

  role:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: !Sub "https://${bucketname}.s3.us-east-2.amazonaws.com${bucketpath}/role.yml"
      Parameters:  
        Env: !Ref Env
        
  dbStack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: !Sub "https://${bucketname}.s3.us-east-2.amazonaws.com${bucketpath}/db.yml"
      Parameters:  
        Role: !GetAtt role.Outputs.ExRole

您还可以使用
Fn::GetAtt:[role,Outputs.ExRole]的语法也可以使用有效的语法

我在使用角色模板输出的问题中添加了另一个模板,将输出提取到另一个模板的语法是什么?添加了两个示例,一个用于独立堆栈,另一个用于嵌套堆栈。如果你使用嵌套堆栈,你实际上可以忽略导出:)我在问题中添加了根模板,我实际上是在传递根模板的输出,我不理解的是,如果我想从根传递值,我将如何像这样传递它<代码>!GetAtt MyStack.Outputs.${AWS::StackName}-ExRole
语法是什么?它应该是指从根堆栈开始的,假设具有角色的堆栈是名为
role
的堆栈,您将作为参数引用。您将不再需要使用导出。这用于在不属于同一嵌套堆栈的CloudFormation堆栈之间提供全局变量:)作为参数的CIDR只能是字符串。如果它失败,当你把它作为一个字符串,它会给出什么错误?
Outputs:
  ExRole:
    Description: Task excution role
    Value: !Ref ExRole
    Export:
        Name: !Sub "${AWS::StackName}-ExRole"
  InstanceProfile:
    Description: profile for container instances
    Value: !Ref InstanceProfile
    Export:
        Name: !Sub "${AWS::StackName}-InstanceProfile"
Fn::ImportValue: !Sub "${NestedStack}-ExRole"
Resources:
  Vpcstack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: !Sub "https://${bucketname}.s3.us-east-2.amazonaws.com${bucketpath}/vpc.yml"
      Parameters:  
        Env: !Ref Env
        Cidr: !Ref Cidr
        Publicsubnet1: !Ref Publicsubnet1
        Publicsubnet2: !Ref Publicsubnet2
        Privatesubnet1: !Ref Privatesubnet1
        Privatesubnet2: !Ref Privatesubnet2  

  role:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: !Sub "https://${bucketname}.s3.us-east-2.amazonaws.com${bucketpath}/role.yml"
      Parameters:  
        Env: !Ref Env
        
  dbStack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: !Sub "https://${bucketname}.s3.us-east-2.amazonaws.com${bucketpath}/db.yml"
      Parameters:  
        Role: !GetAtt role.Outputs.ExRole