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

OZZ*_*ZIE 15 environment-variables amazon-web-services aws-lambda-edge

这样做的动机首先来自亚马逊:https : //aws.amazon.com/blogs/compute/resize-images-on-the-fly-with-amazon-s3-aws-lambda-and-amazon -api-gateway/(在他们添加“更新”之前...)

在我们的 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()
Run Code Online (Sandbox Code Playgroud)

现在我们希望它适用于我们所有的测试/暂存环境以及生产..所以我找到了“环境变量”,我虽然很棒!但是当我尝试部署新版本时,我得到的是:

在此处输入图片说明 我们是否在 CloudFront 中设置错误?我们使用的是 Node 6.10 版。我发现很难相信我们是否必须对存储桶进行硬编码并保留不同版本的代码来处理这个问题?如果是这样,那么我们在使用 AWS Lambda 时浪费了很多时间......

编辑:我们所做的是请求像“media/catalog/product/3/0/30123/768x/lorem.jpg”这样的图像,然后我们使用位于“media/catalog/product/3/”的原始图像0/30123.jpg",如果浏览器支持,则将其调整为 768px 和 webp,然后返回新图像(如果尚未缓存)。

Yve*_* M. 26

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

Lambda@Edge 不支持限制文档中指定的环境变量。

但是,如果您在源请求或源响应中使用 Lambda@Edge,您可以使用CloudFront源自定义标头的解决方法。

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

在此处输入图片说明

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

const foo = request.origin.custom.customHeaders["x-env-foo"][0].value;
Run Code Online (Sandbox Code Playgroud)

或者当使用 S3 作为原点时:

const foo = request.origin.s3.customHeaders["x-env-foo"][0].value;
Run Code Online (Sandbox Code Playgroud)

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


小智 5

作为所选答案的替代方案......

使用Serverless FrameworkWebpackserverless-webpack插件也可以实现同样的效果。

您可以通过以下方式访问用于无服务器操作的选项:

const slsw = require('serverless-webpack');
const stage = slsw.lib.options.stage;
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用serverless.yml以下方式访问文件中的信息:

const serverless = slsw.lib.serverless;
Run Code Online (Sandbox Code Playgroud)

然后只需将其添加到文件的插件中webpack.config.js

plugins: [new EnvironmentPlugin({ VAR1: var1, VAR2: var2, STAGE: stage })]
Run Code Online (Sandbox Code Playgroud)

此方法可以为您提供一种简单的方法来管理 Lambda@Edge 函数中的环境变量。


小智 5

使用 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
}
Run Code Online (Sandbox Code Playgroud)