Не удается получить доступ к переменным среды в лямбда-функции

#java #amazon-web-services #aws-lambda #environment-variables

#java #amazon-веб-сервисы #aws-lambda #переменные среды

Вопрос:

Я хочу получить доступ к переменным среды из моей лямбда-функции, однако у меня возникли проблемы с выполнением этого.

Я использую serverless для управления созданием и развертыванием моих лямбда-функций. В одном из определений функции в моем бессерверном файле я определил 2 переменные среды:

 functions:
    update-item:
        handler: ...
        environment:
            FUNCTION_NAME: updateItemById
            TOPIC_NAME: ${self:custom.topicName}
        events: ...
  

В моей лямбда-функции я получаю доступ к переменной среды TOPIC_NAME вот так:

 Optional<String> topicName = Optional.of(System.getenv("TOPIC_NAME"));
  

Этот код выдает исключение каждый раз при выполнении лямбда-функции, поскольку TOPIC_NAME переменная среды не существует. Однако я вижу, что переменная среды существует в:

  • Бессерверный файл.yml
  • Файлы CloudFormation, которые генерирует serverless
  • Файлы CloudFormation, как показано в консоли AWS
  • Лямбда-функция, показанная в консоли AWS

Внутри лямбда-функции я использую небольшой цикл для распечатки всех переменных среды:

 Map<String, String> envVars = System.getenv();
for (String s : envVars.keySet()) {
    System.out.println(s   " - "   envVars.get(s));
}
  

FUNCTION_NAME Переменная среды отображается, однако TOPIC_NAME переменной нет. Я пробовал переименовывать, добавлять и удалять переменные среды, и в выводе этого цикла печати нет изменений. Я повторно развертывал свой код множество раз, с изменениями кода и без изменений, с изменениями файла конфигурации, я вручную добавил переменную среды через консоль. Я проверил, что запущена последняя версия лямбда-функции. Ничего из того, что я делал, не сработало.

Судя по поведению, похоже, что контейнер, в котором выполняется моя лямбда-функция, никогда не обновляется и, следовательно, всегда содержит старые переменные среды. Однако это противоречит всему, что я прочитал, и тому, как я ожидаю, что лямбда-контейнеры будут работать.

Ответ №1:

 ${self:custom.topicName}
  

Вам нужно убедиться, что у вас настроена следующая ссылка верхнего уровня в вашем serverless.yml :

 ...
provider: aws
custom:
  topicName: <some-topic-name>
  

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

1. Это существует в моем бессерверном файле. Переменная среды успешно сгенерирована serverless; она находится в файлах CloudFormation и отображается как присутствующая в лямбда-функции в соответствии с консолью AWS. Это просто не существует внутри самой лямбда-функции.

2. @Puffin — значит, даже ручное добавление переменной в пользовательский интерфейс не возвращает результат из цикла? Можете ли вы связать вставку с вашим полным бессерверным файлом.yml (конфиденциальные данные запутываются по мере необходимости).