#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}
Но примите во внимание:
- эта переменная должна существовать в SSM.
- в том месте, где существует параметр ssm:, должна быть установлена соответствующая область.
Комментарии:
1. Извиняюсь, в этом сообщении неверно заполнение, на самом деле оно правильное. Таким образом, все еще доходит до того, что переменная SSM должна быть presend. Проблема в том, что мы ограничили доступ к этим параметрам ssm на основе сред.