如何引用 SAM 模板 (YAML) 上的“元数据名称”。 我尝试使用 Fn::Sub: config/${Metadata.Name} 如下,但出现验证错误。 有人可以帮忙吗? 或者是否可以在 template.yaml 的 cloudformation 中获取“堆栈名称”?
Metadata:
AWS::ServerlessRepo::Application:
Name: My-Serverless
Description: My Serverless
SemanticVersion: 1.0.0
Resources:
ConfigurationParameter:
Type: AWS::SSM::Parameter
Properties:
Name:
Fn::Sub: config/${Metadata.Name}
Type: String
Value: false
Environment:
Variables:
NAME: !Sub config/${Fn::GetMetadata: MyResource|Name}
堆栈名称实际上是一个伪变量,并且通过
${AWS::StackName}
的常规替换“本地”可用。
对于元数据部分中声明的任何其他内容,我尝试了
!Sub
和 !GetAtt
的多种变体来注入元数据值,但没有成功,直到我偶然发现使用 YAML 锚点的建议。使用它相当简单,除非您想将它嵌入到另一个字符串中,在这种情况下您可以使用内部函数Fn::Join
。假设地显示两者:
Metadata:
AWS::ServerlessRepo::Application:
Name: My-Serverless
Description: My Serverless
SemanticVersion: &semantic_version 1.0.0 # create the anchor and default value
Parameters:
MySemanticVersion:
Type: String
Default: *semantic_version # inject the value directly,
# here demonstrating as a placeholder
# for later !Sub instead of !Join
Resources:
ConfigurationParameter:
Type: AWS::SSM::Parameter
Properties:
Name:
Fn::Sub: config/${AWS::StackName} # replaces with "config/My-Serverless"
Type: String
Value: false
Comment: !Sub My parameter from v${MySemanticVersion} # cleaner hack than the following
Description: !Join ['', [My parameter from v, *semantic_version]] # replaces with "My parameter from v1.0.0"