amazon-web-services - 从多个参数化模板生成用于 AWS SAM 部署的 template.yml(当前尝试使用 ytt)
问题描述
我发现ytt
这是一个模板化 YAML 的工具,并且似乎在 k8s 空间中被大量使用,该空间具有用于 YAML 配置的 gobs。
我遇到的问题是我想:
a) 将我的 SAM 部署定义组织到多个文件中;和
b) 从“外部”参数化我的 AWS SAM template.yml(如何通过 CloudFormation 在 AWS 中部署无服务器应用程序的描述),而不仅仅是使用 sed。
有没有办法可以在输出 YAML中保留!
前缀指令,如!Ref
, !Sub
,等?我试图使用反斜杠无济于事。!Join
ytt
我有一个名为的子目录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
您会注意到所有!Ref
s 都从输出中删除。如何让这些指令在使用时保留在输出中ytt
。我查看了这些示例,但找不到我所描述的场景。
我正在使用的命令是:
ytt -f ./etc --data-value-yaml deploy_env=${DEPLOY_ENV:-dev} > dist/template.yml
这允许我覆盖DeployEnv
SAM 中的参数template.yml
,但我需要能够使用!Ref
指令保留引用,以从这种方法中获得我想要的所有特征。
我的问题是:
- 如何在输出 template.yml 文件中
ytt
保留!Ref
,!Sub
,等指令?!Join
- 将重要的无服务器应用程序部署到 AWS 中的其他人如何生成他们的 template.yml,以便他们可以将资源、全局变量、参数等组织到单独的文件中并获得模板本身的一定程度的参数化?
FWIW我已经阅读了这个建议的问答,但它不能解决我的问题:如何在 SAM template.yml 中包含多个资源文件
解决方案
如何让 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
.
推荐阅读
- algorithm - 如何快速修改稀疏表?
- python-3.x - 在字符串中查找子字符串
- api - 尝试从 zoho 人那里获取记录时权限被拒绝
- string - Bash 控制台将一些不可见的字符放入字符串 var
- java - 扩展活动时点击问题的导航抽屉
- javascript - 如何在Vue中获取不是来自数据库的数组索引
- java - Log4j2.xml 配置关闭休眠调试级别日志
- javascript - 使用 socketio 时超出 Javascript 最大调用堆栈大小
- python - 如何将玩家随机分组
- node.js - NodeJS Express Sequelize 将正文值视为 Null