Допустимый параметр SSM, удовлетворяющий объявлению ‘ssm:MY_ENV_VAR’, не найден

#serverless-framework #serverless-offline

#бессерверный фреймворк #бессерверный-автономный

Вопрос:

Я запускаю бессерверную платформу в автономном режиме и настроил переменные среды на основе этапов.

 provider:
    name: aws
    stage: ${opt:stage,'dev'}
    environment:
      MY_ENV_VAR: ${self:custom.myEnvVar.${self:provider.stage}}
custom:
stages:
    - dev
    - prod
myEnvVar:
    dev: ${env:MY_ENV_VAR}
    prod: ${ssm:MY_ENV_VAR}
  

Когда я запускаю serverless offline start , он выдает предупреждение о

Не удалось найти допустимый параметр SSM, удовлетворяющий объявлению ‘ssm:MY_ENV_VAR’.

по умолчанию этап dev так почему же он пытается получить доступ к хранилищу параметров SSM?

Любая помощь будет оценена по достоинству

Спасибо

Ответ №1:

У меня такая же проблема при использовании последней версии serverless (2.70.0).

У меня также есть параметры SSM, на которые ссылаются как пользовательские переменные для каждого этапа.

Бессерверный пытается получить значения для тех, которые ему не нужны (в зависимости от этапа). И поэтому это не удается. Потому что у него нет разрешения на их получение.

Например, со старыми переменными он выдаст предупреждение (все еще неверное, но, по крайней мере, оно выполняется):

 sls invoke local -f app -s local -p test/events/test.json

#variablesResolutionMode: 20210326

 Serverless Warning --------------------------------------
 
  A valid SSM parameter to satisfy the declaration 'ssm:production-variable-here' could not be found.
  

И с новым разрешением переменной …

 variablesResolutionMode: 20210326
  

… вы получаете сообщение об ошибке:

 Cannot resolve variable at "custom.production-variable-here": User: arn:aws:iam::etc is not authorized to perform: ssm:GetParameter on resource: arn:aws:ssm:etc because no identity-based policy allows the ssm:GetParameter action
  

Ошибка верна: пользователю не разрешено получать значение. Но ему не нужно получать значение. Поскольку переменная SSM не нужна для этапа.

Ответ №2:

Согласно вашему файлу YAML, первой проблемой является интервал / заполнение переменной myEnvVar в пользовательском режиме.

Когда я попробовал печать sls, я получил ту же ошибку, проблема в том, что sls пытается проверить / прочитать переменную из SSM. Таким образом, если он не существует, созданный sls завершается с ошибкой, независимо от того, на каком этапе он был выполнен.

Следующий скрипт работает для меня должным образом:

 provider:
    name: aws
    runtime: python3.8
    environment:
        MY_ENV_VAR: ${self:custom.myEnvVar.${self:provider.stage}}
    region: eu-west-1

custom:
    myEnvVar:
        dev: 'some value'
        prod: ${ssm:some-custom-config}
  

Но примите во внимание:

  1. эта переменная должна существовать в SSM.
  2. в том месте, где существует параметр ssm:, должна быть установлена соответствующая область.

Комментарии:

1. Извиняюсь, в этом сообщении неверно заполнение, на самом деле оно правильное. Таким образом, все еще доходит до того, что переменная SSM должна быть presend. Проблема в том, что мы ограничили доступ к этим параметрам ssm на основе сред.