Amazon web services 自动气象站Lambda@EdgeNodejs“;不支持环境变量。”;

Amazon web services 自动气象站Lambda@EdgeNodejs“;不支持环境变量。”;,amazon-web-services,environment-variables,aws-lambda-edge,Amazon Web Services,Environment Variables,Aws Lambda Edge,采用这种方法的动机首先来自亚马逊:(在他们添加“更新”之前…) 在我们的AWS Lambda resize函数中,它调整图像大小并将其存储到S3上的新图像 const s3_bucket = process.env.s3_bucket; S3.putObject({ Body: buffer, Bucket: s3_bucket, ContentType: contentType, CacheControl: 'max-age=31536000',

采用这种方法的动机首先来自亚马逊:(在他们添加“更新”之前…)

在我们的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()
现在,我们希望它适用于我们所有的测试/登台环境以及生产环境。。所以我找到了“环境变量”,我觉得很棒!但当我尝试部署新版本时,我得到的只是:

我们是否在CloudFront中设置了错误的内容?我们使用的是节点版本6.10。我发现很难相信我们是否必须硬编码存储桶并保留不同版本的代码来处理这个问题?如果是这样的话,那么我们浪费了很多时间使用AWS Lambda

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

如中所述

不支持环境变量


您可以改为使用SSM参数存储来管理函数的变量。您可以通过控制台编辑参数存储变量,也可以使用

获取变量。我将此作为注释,但我认为值得添加它作为答案

为什么你需要使用Lambda@Edge首先?我理解你的沮丧,但是Lambda@Edge是为了实现一套完全不同的东西。请参阅一些用例

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

在常规的Lambda函数中,您完全可以使用环境变量,从而非常容易地将不同的设置应用于不同的环境(dev、test、prod)


您可以看到如何在常规Lambda函数中设置环境变量

我通过在bash构建脚本的js文件中预先添加
s3_bucket
解决了这个问题。因此我指定
build.sh[s3\u 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
使用自定义源标题的变通方法 不支持环境变量Lambda@Edge按规定

但是如果你正在使用Lambda@Edge无论是原始请求还是原始响应,都可以使用解决方法

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

然后你可以在你的电脑中访问它们Lambda@Edge功能代码通过:

const foo=request.origin.custom.customHeaders[“x-env-foo”][0]。值;
或者使用S3作为原点时:

const foo=request.origin.s3.customHeaders[“x-env-foo”][0]。值;

另请参见

作为所选答案的备选答案

使用、和插件也可以实现同样的效果

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

const slsw = require('serverless-webpack');
const stage = slsw.lib.options.stage;
或者,您可以通过以下方式访问
serverless.yml
文件中的信息:

const serverless = slsw.lib.serverless;
然后简单地将其添加到
webpack.config.js
文件的插件中:

plugins: [new EnvironmentPlugin({ VAR1: var1, VAR2: var2, STAGE: stage })]

此方法可以为您提供在中管理环境变量的简单方法Lambda@Edge函数-阅读以了解无服务器框架为何如此出色。

使用lambda函数名的解决方法

如果您的开发/产品恰好有单独的函数,您还可以检查
process.env.AWS\u LAMBDA\u FUNCTION\u 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
}
const getIsDev=()=>{
//边缘处的lambda无法在控制台中设置环境变量。
if(!process.env.AWS\u LAMBDA\u FUNCTION\u NAME){
返回true//0){
//函数名是否包含单词-dev?
返回真值
}
返回错误
}

我真的很讨厌lambda..我从来没有见过一个工具如此不直观、难以使用和耗时..但谢谢我会尝试一下!只是花了一个多星期的时间来实现这个..我太厌倦了..如果不支持,为什么还要在界面中显示环境变量?只是浪费人们的时间?环境变量不是只支持Lambda@Edge.在常规函数中,它们通常是受支持的。您真的需要使用吗Lambda@Edge?一个普通的Lambda不能做到这一点?我的意思是,它是一个由S3Event触发的调整大小功能,本质上是异步的,最终是一致的。为什么还要麻烦Lambda@Edge要做到这一点?我不确定我是否理解这一点完全回答:(好的,我可以在那里存储一些东西,我可以获取它.。但是它如何帮助确定当前请求是来自暂存还是生产,例如?它们也可能有并发请求.。老实说,我不知道.我们所做的是获取一个像“media/catalog/product/3/0/30123/768x/lorem.jpg”这样的图像请求,然后我们使用位于“media/catalog/product/3/0/30123.jpg”的原始图像,如果浏览器支持,将其大小调整为768px和webp,然后返回新图像(如果尚未缓存)-我们不需要@Edge吗?我认为你的应用程序可以让我在这里更主动而不是被动。为什么不在上传时触发调整大小?那么你的应用程序在请求生命周期内不需要处理任何事情,让最终用户更快。你能让我知道这个图像上传的时间点吗?是决定缩略图大小的用户,还是预定义的应用程序规则?如果用户决定,我建议异步处理大小调整,并返回类似以下内容:“正在处理您的请求。它将可用。”