我如何 reuse/import 在 vtl appsync 解析器中编码?
How can I reuse/import code in vtl appsync resolvers?
我想避免在我的 vtl 模板中重复某些声明,并在 vtl 解析器之间共享它们。
假设我在 mapping_templates/shared.vtl
中有一个示例字典
#set($sample_mappings = {
"KEY1": "VALUE1",
"KEY2": "KEY2"
})
我想在 mapping_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 此请求。
我们使用嵌套堆栈来重用我们的 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 = ...
...
四处寻找后,我发现了一个 NodeJS 模板引擎,EJS. It enables to insert one plain-text file into another. However, EJS itself only support to process a single file. I had to use a cli 构建在 EJS 之上,可以递归处理 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
您还可以使用 AWS Systems Manager 从参数存储中检索模板。
将字符串保存在系统管理器中并在您的模板中引用它。
借用@ggriffin的解决方案并替换SSM值
Resolver:
Type: AWS::AppSync::Resolver
Properties:
...
RequestMappingTemplate: !Join
- ''
- - '{{resolve:ssm:/path/to/param}}'
- |
#***#
#set($items = ...
...
我想避免在我的 vtl 模板中重复某些声明,并在 vtl 解析器之间共享它们。
假设我在 mapping_templates/shared.vtl
中有一个示例字典#set($sample_mappings = {
"KEY1": "VALUE1",
"KEY2": "KEY2"
})
我想在 mapping_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 此请求。
我们使用嵌套堆栈来重用我们的 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 = ...
...
四处寻找后,我发现了一个 NodeJS 模板引擎,EJS. It enables to insert one plain-text file into another. However, EJS itself only support to process a single file. I had to use a cli 构建在 EJS 之上,可以递归处理 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
您还可以使用 AWS Systems Manager 从参数存储中检索模板。 将字符串保存在系统管理器中并在您的模板中引用它。
借用@ggriffin的解决方案并替换SSM值
Resolver:
Type: AWS::AppSync::Resolver
Properties:
...
RequestMappingTemplate: !Join
- ''
- - '{{resolve:ssm:/path/to/param}}'
- |
#***#
#set($items = ...
...