2017-08-16 2 views
4

私はここにhttps://medium.com/@tom.cook/edge-lambda-cloudfront-custom-headers-3d134a2c18a2ラムダ関数は、私は、「Hello World」のHTMLファイルCloudFrontのが正常に静的S3の前に座っていて、私が設定したいCloudFrontの

に指示に従っしようとしていますに無効な要求や応答を返しラムダエッジを使用している追加のヘッダーが、エラーが発生します。本当にイライラしていることは、間違っていることをデバッグするためにエラーのログを見つけることができないということです。ここにブラウザが示すものがあります。ここで

ERROR 

The request could not be satisfied. 

The Lambda function returned an invalid request or response to CloudFront. 
Generated by cloudfront (CloudFront) 
Request ID: 2Cqex7euzH0Iigps58i9tMVxdqAaLznL2ZjwqR1sW1AZHz6x2EwfMA== 

は私の簡単なラムダのためのコードです:

exports.handler = (event, context, callback) => { 
    console.log(event) 
    callback(null, 'Hello from Lambda'); 
}; 

トリガタイプがviewer-responseで、(それが重要ならばCache Behavior: *と、)私のCloudFrontの分布に取り付けられています。ラムダはAWSLambdaBasicExecutionRoleに対応する役割を持ち、Cloudwatchへの書き込みアクセス権を与えます。

トリガーを有効にするとすぐに、Web要求に対する応答が「Hello world」HTMLから上記のエラーに変わります。そのため、ラムダがトリガーされていることがわかります。しかし、ラムダダッシュボードでは、呼び出しやエラーは表示されません。 Cloudwatchにログは表示されません。 CloudFrontダッシュボードにはエラー(5xx)が表示されますが、ラムダからは何も表示されません。

ラムダコンソールで機能をテストし、展開された機能をクリックし、テストイベントを「CloudFront Modify Response Header」として設定し、Testを打つと、それは成功です。 Cloudwatchはテストのログとコンソール出力を表示します!しかし、ライブ呼び出しのログにはまだ何もありません。

私の唯一の理論は、CloudFrontがラムダを実際に呼び出すことができないというパーミッションに何か問題があります(ラムダダッシュボードに何もない理由を説明しています)。最後に、CloudFrontのログ(S3)は502エラーとLambdaValidationErrorのWeb要求を表示しますが、それが役立つかどうかはわかりません。

+0

私の答えがあなたの問題を解決できない場合、あなたのコードを[MCVE](https://stackoverflow.com/help/mcve)に凝縮して質問に編集してください。 –

+1

あなたの答えは私の問題を解決しました、@ sqlbot。私の残っている心配は、私が自分の機能に変更を加えると、毎回それらをあなたが走らせることができないということです!私の例の問題は文字列を返すことでしたが、CFとLambdaによって生成されたエラー/ログからその文字列を知る方法はありますか? – lordbyron

+0

まあ、あなたが知っている...あなたは私がいつでも、よく資金を確保したペイパルのアカウントを持っている限り、それらを実行することができます。 :)しかし、すべての深刻なことに、あなたは正しいです - あなたは知る方法がありません。なぜなら、ノードエラーがないのにCloudFrontがラムダ応答を拒否した場合、ログが移動する場所がないからです。ブラウザにエラーを返すことをお勧めします。しかし、ドキュメントとサンプルの間には、処理できなかったものはありませんでした。すべての "青写真"をチェックアウトしてください。彼らは、CloudFrontが好きなようにフォーマットされた有効な応答を生成します。 –

答えて

4

Lambda @ Edgeはまだプレビュー中(特定の顧客へのアクセスが制限されていますが、一般的なリリースまでには限られていました)には、あなたが見ているブログ投稿の例は有効でしたが、サービスが開始される直前に、データ構造が変更されました。

レスポンスヘッダのデータ構造は、以前のように見えた:

headers['Strict-Transport-Security'] = "max-age=31536000; includeSubdomains; preload"; 
headers['Content-Security-Policy'] = "default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'"; 
headers['X-Content-Type-Options'] = "nosniff"; 

新しい構造は次のようになり:

headers['strict-transport-security'] = [{ 
    key: 'Strict-Transport-Security', 
    value: "max-age=31536000; includeSubdomains; preload" 
}]; 

headers['content-security-policy'] = [{ 
    key: 'Content-Security-Policy', 
    value: "default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'" 
}]; 

headers['x-content-type-options'] = [{ 
    key: 'X-Content-Type-Options', 
    value: "nosniff" 
}]; 

外側のオブジェクトのキーがkey値の小文字でなければなりません内側のオブジェクトの各メンバに格納されます。 HTTP/1.xでは大文字と小文字が区別されないが、Javascriptオブジェクトではキーで大文字と小文字が区別されるため、HTTPヘッダーの処理方法をより正確に反映するためには、データ構造の変更が必要になる可能性が最も高い。

コードによって返された構造が、CloudFrontがLambda @ Edgeに返す必要があるものに適合しない場合、表示されるエラーが実際にスローされます。ログは生成されません。このエラーは、LambdaとCloudFront間のインターフェイス境界のCloudFront側で、ユーザーがアクセス可能なログを生成しないLambdaの外部で発生します。

Response Event Structureのドキュメントを参照してください。

+0

@ michael-sqlbotのAWSフォーラムでこのスレッドを継続https://forums.aws.amazon.com/thread.jspa?messageID=800313#800313 – lordbyron

+0

新しい仕様に従ってレスポンスイベント構造を修正すると、私の問題が解決しましたhttp ://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-event-structure.html –

+0

私はまだこれを動作させることはできません。誰もが問題を見つけましたか? –

関連する問題