AWS Lambda @ Edge Nodejs «Переменные среды не поддерживаются». - PullRequest
0 голосов
/ 22 февраля 2019

В нашей функции AWS Lambda Resize он изменяет размеры изображения и сохраняет его в новом образе на S3.

  const s3_bucket = process.env.s3_bucket;
  S3.putObject({
    Body: buffer,
    Bucket: s3_bucket,
    ContentType: contentType,
    CacheControl: 'max-age=31536000',
    Key: key,
    StorageClass: 'STANDARD'
  }).promise()

Теперь мы хотим, чтобы это работало для всех наших сред тестирования / подготовки, а также для производства.Так что я нашел "Переменные среды", хотя я отлично!Но когда я пытаюсь развернуть новую версию, все, что я получаю, это:

enter image description here Мы неправильно настроили что-то в CloudFront?Мы используем Node версии 6.10.Мне трудно поверить, нужно ли нам жестко кодировать сегменты и хранить разные версии кода, чтобы справиться с этим?Если это так, то мы потратили много времени, используя AWS Lambda ...

Редактировать: Что мы делаем, так это принимаем запрос на изображение типа "media / catalog / product /3/0/30123 / 768x / lorem.jpg ", затем мы используем исходное изображение, расположенное по адресу" media / catalog / product / 3/0 / 30123.jpg ", изменим его размер до 768px и webp, если браузер это поддерживает, а затемвернуть новое изображение (если оно еще не кэшировано).

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

У меня было это как комментарий, но я думаю, что стоит добавить его в качестве ответа.

Почему для начала вам нужно использовать Lambda @ Edge?Я понимаю ваше разочарование, но Lambda @ Edge был разработан для достижения совершенно другого набора вещей.См. Некоторые варианты использования здесь

В вашем случае использования вы загружаете объект в S3, и событие объекта PUT запускает вашу функцию Lambda, которая по своей природе асинхронна и в конечном итоге непротиворечива.Ваши пользователи действительно не нуждаются в оптимизированном времени выполнения миниатюр, так как вы все равно получите всего несколько сотен миллисекунд.К тому времени, когда им понадобится миниатюра, она уже будет там, независимо от того.

В обычных лямбда-функциях вы можете абсолютно использовать переменные окружения, что упрощает применение различных настроек к различным средам (dev, test, prod).

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

0 голосов
/ 08 марта 2019

Я решил это, добавив s3_bucket к файлу js в скрипте сборки bash.Поэтому я указываю build.sh [s3_bucket] [environment-name]

if [ ! $# -eq 2 ]; then
    echo 'You need to provide two parameters: [s3_bucket] [environment]'
    echo 'example: build.sh imagetest-us-east-1 next'
    echo 'example: build.sh [s3_bucket_to_be_defined] production'
    exit 1
fi

filename='index.js'
setCurrentEnvironment() {
    jsEnv="const s3_bucket='$1';"
    mv "$filename" "$filename".orig && cp "$filename".orig "$filename"
    echo -e "$jsEnv\n\n$(cat ${filename})" > "$filename"
}
restoreDefault() {
    rm -rf "$filename"
    mv "$filename".orig "$filename"
}

setCurrentEnvironment $1
zip -FS -q -r "../../dist/resize__$2.zip" *
restoreDefault
0 голосов
/ 22 февраля 2019

Как упомянуто в этой документации для ограничений CloudFront Lambda:

Переменные окружения не поддерживаются.

Вместо этого вы можете сделать следующее:используйте SSM Parameter Store для управления переменными вашей функции.Вы можете редактировать переменные хранилища параметров через консоль или программно , а переменные можно получить с помощью функции ssm.getParameter ()

...