[小ネタ] LambdaをバックエンドにしたALBのマルチバリューヘッダー設定 #reinvent
こんにちは、中村です。
上記記事ではあまり触れませんでしたが、LambdaをバックエンドにしたALBでは高度な設定としてマルチバリューヘッダー
というものがあります。
アプリケーションロードバランサー(ALB)のターゲットにAWS Lambdaが選択可能になりましたの高度な設定に掲載されています。
このマルチバリューヘッダーは、複数の値とともに送信されるHTTPヘッダーとクエリ文字列パラメーターが、Lambdaへ送信されます。
設定は簡単です。Lambdaを登録しているターゲットグループの説明タブ内属性
で設定します。
これで終わりに思えるのですが、ターゲットのタブを見てみるとLambdaのヘルスチェックに失敗します。
エラー内容を見てみると、The response from the Lambda function is not in the expected format.と表示されています。どうやらマルチバリューヘッダーを有効にしたことで正しいLambdaのレスポンスが変更になったようです。
ちなみにLambdaの内容はこのような形になっています。Invokeされると Hello from Lambda!が返ってくる簡単なものです。
exports.handler = async (event) => { console.log(JSON.stringify((event))); const response = { 'statusCode': 200, 'statusDescription': '200 OK', 'isBase64Encoded': false, 'headers': { 'Content-Type': 'text/html; charset=utf-8' }, 'body': JSON.stringify('Hello from Lambda!'), }; console.log(JSON.stringify(response)); return response; };
ブログには記載がありませんでしたが、ドキュメントがありました。 Lambda Functions as Targets
With multi-value headers, the load balancer uses both cookies sent by the client and sends you an event that includes the following:
{ "multiValueHeaders": { "Set-cookie": ["cookie-name=cookie-value;Domain=myweb.com;Secure;HttpOnly","cookie-name=cookie-value;Expires=May 8, 2019"], "Content-Type": ["application/json"] }, }
- headersプロパティをmultiValueHeadersプロパティに変更
- 配下のヘッダー情報をArray
の2つを行う必要がありそうです。実際に変更してみましょう。
exports.handler = async (event) => { console.log(JSON.stringify((event))); const response = { statusCode: 200, statusDescription: '200 OK', isBase64Encoded: false, multiValueHeaders: { 'Content-Type': ['text/html; charset=utf-8'] }, body: JSON.stringify('Hello from Lambda!'), }; console.log(JSON.stringify(response)); return response; };
無事ヘルスチェックが通りましたので、ALBにcurlしてみます。
$ curl http://xxxxxxxxxxxxxxxxxxxxx.us-east-1.elb.amazonaws.com "Hello from Lambda!"
ALBからLambdaをInvokeできるようになりました!
まとめ
いかがでしたでしょうか。
ドキュメントを読めばすぐだったのですが、どうやら読み飛ばしていたようです。ブログを読んで同じ現象にハマった方が居ましたらLambdaのレスポンスを変更してみてください。