Обычно, когда люди используют вывод, если шаблон используется несколько раз в одном родительском стеке, они добавляют к экспорту префикс переменной (например, имя стека), чтобы сделать его уникальным.
Это может выполняется с помощью функции sub intrinsi c , например, как в приведенном ниже примере
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"
Затем вам нужно будет передать это значение идентификатора стека в качестве параметра во вложенный стек, который необходимо указать этот файл. Это снова будет использовать функцию sub intrinsi c для ссылки на имя экспорта.
Чтобы получить это значение в функции ImportValue
intrinsi c, вы должны ссылаться на него, как показано ниже, для этого вам потребуется для передачи имени стека в качестве параметра в стек:
Fn::ImportValue: !Sub "${NestedStack}-ExRole"
Если вы вызываете другой стек из родительского стека, вы можете игнорировать экспорт и вместо этого передавать вывод в следующий стек с помощью встроенного GetAtt c вместо функции.
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] also valid syntax
.