Как я могу написать вложенный IF в serverless.yml, используя файл формата yaml, используя его для формирования облака?

Я пытаюсь получить доступ к секретам, созданным в диспетчере секретов ( https://aws.amazon.com/secrets-manager/) через SSM (системный менеджер - https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) т.е. хранить параметры AWS и сохранять его в пользовательской переменной YAML в файле serverless.yml? Я пытаюсь реализовать формирование облака через безсерверную инфраструктуру ( 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}

Я пробовал Cloud формирования внутренних функций Fn::If для этого, но сталкивается с этой ошибкой:Fn::If requires a list argument with the first element being a condition

2 ответа

Просто хочу отметить, что если вы хотите загрузить разные пути SSM в зависимости от среды, вы можете добиться этого многими способами, описанными здесь.

Мне было приятно загружать через 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 невозможно использовать сокращенный синтаксис для последовательности встроенных функций.

См. Раздел «Важно» в документации .

Попробуй это:

      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}