如何在 vtl appsync 解析器中重用/导入代码?

Posted

技术标签:

【中文标题】如何在 vtl appsync 解析器中重用/导入代码?【英文标题】:How can I reuse/import code in vtl appsync resolvers? 【发布时间】:2020-03-15 22:42:16 【问题描述】:

我想避免在我的 vtl 模板中重复某些声明并在 vtl 解析器之间共享它们。

假设我在 ma​​pping_templates/shared.vtl

中有一个示例字典
#set($sample_mappings = 
    "KEY1": "VALUE1",
    "KEY2": "KEY2"
)

我想在ma​​pping_templates/sample_request_mapping_template.vtl中使用,例如:

$sample_mappings.get("KEY1")

我尝试了以下但没有成功:

#parse("shared.vtl")
OR
#include("shared.vtl")

$sample_mappings.get("KEY1")

看起来确实是一个非常基本的功能,但我没有看到它记录在 aws 的解析器指南中,而且我认为这可能不受支持,因为 AppSync vtl 甚至不支持 vtl 的所有标准功能。

【问题讨论】:

【参考方案1】:

您还可以使用 AWS 系统管理器从参数存储中检索模板。 将字符串保存在系统管理器中并在模板中引用它。

借用 @ggriffin 的解决方案并替换 SSM 值

  Resolver:
    Type: AWS::AppSync::Resolver
    Properties:
      ...
      RequestMappingTemplate: !Join
        - ''
        - - 'resolve:ssm:/path/to/param'
          - |
            #***#
            #set($items = ...
            ...

【讨论】:

【参考方案2】:

看了一圈,发现了一个NodeJS模板引擎,EJS。它可以将一个纯文本文件插入另一个文件。但是,EJS 本身只支持处理单个文件。我不得不使用建立在 EJS 之上的a cli,它可以递归地处理 VTL 脚本的文件夹。

输入:
# File: src/vtl/Query.query1.vtl
<%- include('level1/level1-scriptA.vtl'); %>
// perform query1.vtl
<%- include('level1/level1-scriptB.vtl'); %>
输出:
# File: dist/vtl/Query.query1.vtl
// perform level2-script.vtl
// perform level1-scriptA.vtl
// perform query1.vtl
// perform level2-script.vtl
// perform level1-scriptB.vtl

完整的例子可以在here找到

【讨论】:

【参考方案3】:

我们使用嵌套堆栈来重用我们的 VTL 代码。

嵌套堆栈模板../cfn/shared/vtl/template.yml:

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Vtl Functions

Parameters:
  VtlSomeCheckFunction:
    Type: String
    Default: |
      #***#
      #if($util.isNullOrBlank($ctx.args.input.someArg))
        $util.error("Some error occurred")
      #end
      #***#
...

Outputs:
  VtlSomeCheckFunction:
    Description: VtlSomeCheckFunction
    Value: !Ref VtlSomeCheckFunction

使用嵌套 VTL 堆栈的堆栈:

Resources:
  VtlStack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: ../cfn/shared/vtl/template.yml
...
  MutationUpdateResolver:
    Type: AWS::AppSync::Resolver
    Properties:
      ...
      RequestMappingTemplate: !Join
        - ''
        - - !GetAtt VtlStack.Outputs.VtlSomeCheckFunction
          - |
            #***#
            #set($items = ...
            ...

【讨论】:

这个效果很好【参考方案4】:

很遗憾,目前不支持此功能。

我会代表你对该请求 +1 给团队。

【讨论】:

嗨,有这方面的消息吗?如果我们可以在 vtl 模板中重用代码,那将非常有用。

以上是关于如何在 vtl appsync 解析器中重用/导入代码?的主要内容,如果未能解决你的问题,请参考以下文章

是否有用于使用 VTL 的 AWS Appsync 的 Model.objects.update_or_create()?

解析器中的 AppSync GraphQL 变异服务器逻辑

AWS AppSync 解析器内部超时配置

AWS AppSync Lambda 解析器字段

AWS Appsync 一个 dynamodb 解析器中的多个 dynamodb 请求

在 aws appsync 解析器中添加额外字段