You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 18:40:33