如何使用 yaml 格式文件在 serverless.yml 中编写嵌套 IF,同时将其用于云形成?

Posted

技术标签:

【中文标题】如何使用 yaml 格式文件在 serverless.yml 中编写嵌套 IF,同时将其用于云形成?【英文标题】:How can I write nested IF in serverless.yml using yaml format file while using it for cloud formation? 【发布时间】:2019-10-12 15:46:54 【问题描述】:

我正在尝试通过 SSM(系统管理器-https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)访问在秘密管理器(https://aws.amazon.com/secrets-manager/)中创建的秘密,即 AWS 参数存储,并将其存储在 serverless.yml 文件中的自定义 YAML 变量中? 我正在尝试通过无服务器框架(https://serverless.com/)实现云形成,并且我正在尝试在云形成中实现嵌套的 if 语句,以便使用下面的代码实现上述内容。

 stage: &stage 'dev' #Hardcoded for now
 rdsMasterPassword:
 !If
  - !Equals [*stage,"prod"]
  - $ssm:/aws/reference/secretsmanager/cred-prod~true:rdsMasterPassword
  - !If 
      - !Equals [*stage,"staging"]
      - $ssm:/aws/reference/secretsmanager/cred-staging~true:rdsMasterPassword
      - $ssm:/aws/reference/secretsmanager/cred-dev~true:rdsMasterPassword

我已经尝试过云形成内在函数 Fn::If 为此但面临这个错误: Fn::If requires a list argument with the first element being a condition

【问题讨论】:

AWS 使用 YAML 格式。 YML 与 YAML 不同,YAML 文件的推荐扩展名至少从 2006 年 9 月开始是 .yaml 无服务器框架使用 YML,从我阅读它的文档来看。我没有使用 AWS SAM 格式,而是使用无服务器框架 cli 自动创建的 serverless.yml。 你在那里呈现的是 YAM 格式的数据。 YML 是基于 XML 的,看起来完全不同。请提供支持您声明的链接,或删除标签yaml。 看看这个:serverless.com/framework/docs/providers/aws/guide/… 这都是 YAML 格式。 AWS 已经过时了,因为他们仍然没有实施在 YAML 网站 2006 年 提出的建议,即使用 .yaml 作为 YAML 格式 文件的文件扩展名。然而,命名 YAML(格式)文件(无论是推荐的 .yaml 扩展名,.yml 还是任何其他扩展名)YML 并不过时,就像调用 Java 源代码 Python 因为有人把它放在一个文件中.py 分机。如果您无法更正文件扩展名,请至少使用正确的文件格式术语。 【参考方案1】:

由于 YAML 的限制,不能对一系列内部函数使用快捷语法。

请参阅docs 中的“重要”部分以供参考。

试试这个:

stage: &stage 'dev' #Hardcoded for now
rdsMasterPassword:
  Fn::If:
    - Fn::Equals: [*stage, "prod"]
    - $ssm:/aws/reference/secretsmanager/cred-prod~true:rdsMasterPassword
    - Fn::If: 
      - Fn::Equals: [*stage, "staging"]
      - $ssm:/aws/reference/secretsmanager/cred-staging~true:rdsMasterPassword
      - $ssm:/aws/reference/secretsmanager/cred-dev~true:rdsMasterPassword

【讨论】:

【参考方案2】:

只想指出,如果您希望根据环境加载不同的 SSM 路径,您可以通过多种方式实现,outlined here

例如,通过 json 文件加载,我度过了愉快的时光

-- serverless-staging.json --

  "ssm_path": "/path/to/staging/ssm/parameter"


-- serverless-prod.json --

  "ssm_path": "/path/to/prod/ssm/parameter"


-- serverless.yml --
...
stage: $opt:stage, 'dev'
environment:
  SSM_PATH: $file(serverless-$self:provider.stage.json):ssm_path
... etc etc

希望这对通过搜索登陆这里的其他人有所帮助

【讨论】:

以上是关于如何使用 yaml 格式文件在 serverless.yml 中编写嵌套 IF,同时将其用于云形成?的主要内容,如果未能解决你的问题,请参考以下文章

我想加载一个 YAML 文件,可能编辑数据,然后再次转储。如何保留格式?

如何正确格式化 app.yaml 以使用 PHP 后端托管 Flutter Web 应用程序

Kubernetes - YAML文件解读

kubectl edit yaml 如何保存改好的yaml

SpringBoot中yaml文件配置属性

yaml文件详解