如何在不修改所有资源文件结构的情况下启用AWS::LanguageExtensions?
因需使用Fn::ToJsonString,必须启用AWS::LanguageExtensions。当前项目结构如下:
serverless.yml
resources: ${file(./src/resources.yml)}
src/resources.yml
- ${file(./src/resources/resources1.yml)} - ${file(./src/resources/resources2.yml)} # ...
单个资源文件示例(src/resources/resources1.yml):
Resources: MyResource1: Type: AWS::IAM::Role Properties: # ...
启用AWS::LanguageExtensions的标准配置格式为:
# serverless.yml resources: Transform: AWS::LanguageExtensions Resources: MyResource1: Type: AWS::IAM::Role Properties: # ...
我尝试修改src/resources.yml为以下内容:
# src/resources.yml Transform: AWS::LanguageExtensions Resources: - ${file(./src/resources/resources1.yml)} - ${file(./src/resources/resources2.yml)} # ...
但触发错误:
Transform AWS::LanguageExtensions failed with: Error parsing the template
看起来resources.Resources下不能使用资源数组。随后我又尝试:
# src/resources.yml Transform: AWS::LanguageExtensions Resources: ${file(./src/resources/resources1.yml)} ${file(./src/resources/resources2.yml)} # ...
同样报错:
Cannot resolve variable at "resources.Resources": String value consist of variable which resolve with non-string value
请问是否可以在不修改所有资源文件结构的前提下启用AWS::LanguageExtensions?
可以实现,无需修改现有资源文件的结构,只需调整src/resources.yml的写法,利用Serverless Framework的变量引用特性直接提取每个资源文件内的Resources对象:
修改后的src/resources.yml:
Transform: AWS::LanguageExtensions Resources: ${file(./src/resources/resources1.yml):Resources} ${file(./src/resources/resources2.yml):Resources} # 其他资源文件按此格式依次添加
原理是通过:Resources后缀,直接引用每个资源文件中定义的Resources键值对,而非引入整个文件。这样所有资源会被合并到顶层Resources下,既符合CloudFormation模板对Resources格式的要求(必须是键值对而非数组),又能保留原有资源文件的结构,同时成功启用AWS::LanguageExtensions。
内容的提问来源于stack exchange,提问作者fstaine

