AWS Lambda @ Edge Nodejs“不支持环境变量。”

时间:2019-02-22 14:04:45

标签: amazon-web-services aws-lambda aws-sdk-nodejs aws-lambda-edge

在我们的AWS Lambda调整大小功能中,它调整图像的大小并将新图像存储在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(如果浏览器支持的话),然后返回新图像(如果尚未缓存)。

5 个答案:

答案 0 :(得分:2)

我有此评论,但我认为值得将其添加为答案。

为什么首先需要使用Lambda @ Edge?我理解您的无奈,但Lambda @ Edge旨在实现完全不同的目标。查看一些用例Recording Controller

在用例中,您将一个对象上传到S3,并且PUT对象事件将触发Lambda函数,该函数本质上是异步的,并且最终是一致的。您的用户确实不需要优化的缩略图生成执行时间,因为无论如何您只会获得几百毫秒的时间。到他们需要缩略图的时候,无论如何它都会在那里。

在常规Lambda函数中,您可以绝对使用环境变量,从而可以轻松地将不同的设置应用于不同的环境(开发,测试,生产)。

您可以看到如何在常规Lambda函数here

中设置环境变量

答案 1 :(得分:1)

this documentation for CloudFront Lambda limitations:

中所述
  

不支持环境变量。

您可以代替使用SSM参数存储来管理函数的变量。您可以通过控制台或programmatically编辑参数存储变量,也可以使用ssm.getParameter() function

获取变量

答案 2 :(得分:1)

使用自定义来源标头的解决方法

Lambda @ Edge不支持in the limitations documentation指定的环境变量。

但是,如果您在原始请求或原始响应中使用Lambda @ Edge,则可以对CloudFront Origin Custom Headers使用解决方法。

基本上可以代替环境变量,而可以在CloudFront来源中设置自定义标头。然后,这些“静态”标头将传递到您的原始请求/响应Lambda @ Edge。

enter image description here

然后,您可以通过以下方式在Lambda @ Edge函数代码中访问它们:

ReactDom.render(<HelpComponent data={data}/>, document.getElementById('example-container'))

或者以S3作为起点:

const foo = request.origin.custom.customHeaders["x-env-foo"][0].value;

另请参见https://medium.com/@mnylen/lambda-edge-gotchas-and-tips-93083f8b4152

答案 3 :(得分:0)

我通过将s3_bucket放在bash构建脚本中的js文件中来解决此问题。所以我指定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

答案 4 :(得分:0)

使用 lambda 函数名称的解决方法

如果您的开发/产品碰巧有单独的功能,您也可以检查 process.env.AWS_LAMBDA_FUNCTION_NAME

const getIsDev = () => {
    // lambda at edges cant set environment variables in the console.
    if (!process.env.AWS_LAMBDA_FUNCTION_NAME) {
        return true // << double check this is the behavior you want to fall back to.
    }
    if (process.env.AWS_LAMBDA_FUNCTION_NAME.indexOf("-dev") => 0) {
        // does the function name contain the word -dev?  
        return true
    }
    return false
}