首页 > 解决方案 > 从多个参数化模板生成用于 AWS SAM 部署的 template.yml(当前尝试使用 ytt)

问题描述

我发现ytt这是一个模板化 YAML 的工具,并且似乎在 k8s 空间中被大量使用,该空间具有用于 YAML 配置的 gobs。

我遇到的问题是我想:

a) 将我的 SAM 部署定义组织到多个文件中;和

b) 从“外部”参数化我的 AWS SAM template.yml(如何通过 CloudFormation 在 AWS 中部署无服务器应用程序的描述),而不仅仅是使用 sed。

有没有办法可以在输出 YAML中保留!前缀指令,如!Ref, !Sub,等?我试图使用反斜杠无济于事。!Joinytt

我有一个名为的子目录etc/,其中包含此文件:

#@ load("@ytt:data", "data")
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: My REST API

#! Parameters

Parameters:

  DeployEnv:
    Type: String
    Default: #@ data.values.deploy_env
  UsagePlanType:
    Type: String
    Default: PER_API

#! Conditions

#! Globals

Globals:
  HttpApi:
    Auth:
      ApiKeyRequired: true
      UsagePlan:
        CreateUsagePlan: !Ref UsagePlanType

#! Resources

Resources:


  RestApi:
    Type: AWS::Serverless::HttpApi
    Properties:
      StageName: !Ref DeployEnv


#! Outputs

这里是values.yml

#@data/values
---
deploy_env: dev

以下是它产生的内容:

AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
Description: My REST API
Parameters:
  DeployEnv:
    Type: String
    Default: dev
  UsagePlanType:
    Type: String
    Default: PER_API
Globals:
  HttpApi:
    Auth:
      ApiKeyRequired: true
      UsagePlan:
        CreateUsagePlan: UsagePlanType
Resources:
  RestApi:
    Type: AWS::Serverless::HttpApi
    Properties:
      StageName: DeployEnv

您会注意到所有!Refs 都从输出中删除。如何让这些指令在使用时保留在输出中ytt。我查看了这些示例,但找不到我所描述的场景。

我正在使用的命令是:

ytt -f ./etc --data-value-yaml deploy_env=${DEPLOY_ENV:-dev} > dist/template.yml

这允许我覆盖DeployEnvSAM 中的参数template.yml,但我需要能够使用!Ref指令保留引用,以从这种方法中获得我想要的所有特征。

我的问题是:

  1. 如何在输出 template.yml 文件中ytt保留!Ref, !Sub,等指令?!Join
  2. 将重要的无服务器应用程序部署到 AWS 中的其他人如何生成他们的 template.yml,以便他们可以将资源、全局变量、参数等组织到单独的文件中并获得模板本身的一定程度的参数化?

FWIW我已经阅读了这个建议的问答,但它不能解决我的问题:如何在 SAM template.yml 中包含多个资源文件

标签: amazon-web-servicesyamlaws-serverless

解决方案


如何让 ytt 在输出 template.yml 文件中保留 !Ref、!Sub、!Join 等指令?

正如这个ytt 问题中提到的,您可以使用更详细的 CloudFormation 格式,如下所示:{Ref: DeployEnv}. 因此,对于您上面的示例,它将如下所示:

#@ load("@ytt:data", "data")
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: My REST API

#! Parameters

Parameters:

  DeployEnv:
    Type: String
    Default: #@ data.values.deploy_env
  UsagePlanType:
    Type: String
    Default: PER_API

#! Conditions

#! Globals

Globals:
  HttpApi:
    Auth:
      ApiKeyRequired: true
      UsagePlan:
        CreateUsagePlan: {Ref: UsagePlanType}

#! Resources

Resources:


  RestApi:
    Type: AWS::Serverless::HttpApi
    Properties:
      StageName: {Ref: DeployEnv}


#! Outputs

将重要的无服务器应用程序部署到 AWS 中的其他人如何生成他们的 template.yml,以便他们可以将资源、全局变量、参数等组织到单独的文件中并获得模板本身的一定程度的参数化?

不太清楚如何回答这部分问题,但上面的 GitHub 问题在使用ytt.


推荐阅读