如何从SAM模板提取AppSync解析器的映射模板至外部文件?
问题解答
直接在RequestMappingTemplate和ResponseMappingTemplate字段中填写文件路径的方式不可行,因为AWS CloudFormation(SAM基于其构建)的AWS::AppSync::Resolver资源要求这两个字段必须传入内联的VTL模板字符串,而非文件路径。不过你可以通过SAM提供的内置函数实现“引用外部文件”的需求,具体方法如下:
正确实现方式:使用SAM的!File函数
SAM支持!File简写函数(对应CloudFormation的Fn::File),它会在部署阶段自动读取指定路径的文件内容,并将其作为字符串传入字段,完全符合AppSync解析器的要求。
修改后的SAM模板配置示例:
AppSyncResolver: Type: "AWS::AppSync::Resolver" Properties: TypeName: "Query" FieldName: "my_resolver" DataSourceName: !GetAtt AppSyncDataSource.Name # 使用!File加载外部VTL文件 RequestMappingTemplate: !File src/resolvers/my-resolver-request.vtl ResponseMappingTemplate: !File src/resolvers/my-resolver-response.vtl Kind: "UNIT" ApiId: !GetAtt AppSyncGraphQLApi.ApiId
配套文件注意事项
- 文件路径:路径是相对于SAM模板文件的相对路径,确保你的文件结构符合预期(比如SAM模板在项目根目录,
src/resolvers目录也在根目录下)。 - 文件内容:外部VTL文件只需保留纯模板内容,不需要添加内联时的管道符(
|)或引号,比如my-resolver-request.vtl的内容直接写:#set($SCHEMA = $ctx.args.schema) #set($limit = $ctx.args.limit) #set($table = ".customers") #set($customers = $SCHEMA$table_ordendscto_lote) { "version": "2018-05-29", "statements": [ "SELECT * FROM $customers LIMIT $limit ;" ] } - 纯CloudFormation兼容:如果使用纯CloudFormation而非SAM,需要写完整的函数语法:
RequestMappingTemplate: Fn::File: Path: src/resolvers/my-resolver-request.vtl
内容的提问来源于stack exchange,提问作者WhiteAB
相关产品推荐
相关产品推荐

