web-dev-qa-db-ja.com

AWS Lambda @ Edge Nodejs「環境変数はサポートされていません。」

そもそもこのアプローチを行う動機は、Amazonからです。 https://aws.Amazon.com/blogs/compute/resize-images-on-the-fly-with-Amazon-s3-aws-lambda -および-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()

これで、すべてのテスト/ステージング環境と本番環境でこれが機能するようになりました。「環境変数」が見つかりました。しかし、新しいバージョンをデプロイしようとすると、次のようになります。

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
OZZIE

Bashビルドスクリプトのjsファイルにs3_bucketを追加することで解決しました。したがって、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
OZZIE

CloudFront Lambdaの制限に関するこのドキュメントで述べたように:

環境変数はサポートされていません。

代わりに、SSMパラメータストアを使用して関数の変数を管理できます。パラメーターストア変数は、コンソールまたは プログラムで編集できます 。ま​​た、 ssm.getParameterを使用して変数を取得できます。 ()関数

1
Deiv

私はこれをコメントとして持っていましたが、答えとしてそれを追加する価値があると思います。

最初にLambda @ Edgeを使用する必要があるのはなぜですか?ご不便をおかけして申し訳ございませんが、Lambda @ Edgeはまったく異なるものを実現するように設計されています。いくつかのユースケースを見る ここ

ユースケースでは、オブジェクトをS3にアップロードし、PUTオブジェクトイベントがLambda関数をトリガーします。これは、本質的に非同期であり、結果的に一貫しています。とにかく数百ミリ秒しか得られないので、ユーザーは本当に最適化されたサムネイル生成の実行時間を必要としません。彼らがサムネイルを必要とするときまでに、それは関係なくすでにそこにあります。

通常のLambda関数では、環境変数を完全に利用できるため、さまざまな環境(dev、test、prod)にさまざまな設定を非常に簡単に適用できます。

通常のLambda関数で環境変数を設定する方法を見ることができます here

1
Thales Minussi

カスタムOriginヘッダーを使用する回避策

環境変数は、指定されたLambda @ Edgeではサポートされていません 制限のドキュメント

ただし、OriginリクエストまたはOriginレスポンスのいずれかでLambda @ Edgeを使用している場合は、 CloudFront Originカスタムヘッダー で回避策を使用できます。

基本的に、環境変数の代わりに、CloudFrontオリジン内にカスタムヘッダーを設定できます。これらの「静的」ヘッダーは、Originリクエスト/レスポンスLambda @ Edgeに渡されます。

enter image description here

次に、Lambda @ Edge関数コードで次のようにアクセスできます。

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

または、S3をオリジンとして使用する場合:

const foo = request.Origin.s3.customHeaders["x-env-foo"][0].value;

参照 https://medium.com/@mnylen/lambda-Edge-gotchas-and-tips-93083f8b4152

1
Yves M.