ターゲット登録手順
- Lambda Function作成
- Lambda Function宛のTarget Group作成
- ALBのリスナールールで転送先にTarget Groupを指定
MultiValueHeaderの使用
- Target Group で設定。 後からでも変更可。
- Attributes -> Multi value headers
- デフォルトは Disabled
リクエスト・レスポンス
- API Gateway だとメソッドリクエスト・メソッドレスポンスで色々設定できるが、ALBにそんなものはない
- ので Lambda でよしなにやる
リクエスト
- Lambda Function の event から取得
- MultiValueHeaderの設定によって構造が変わる
MultivalueHeader:Disabled
{
"requestContext": {
"elb": {
"targetGroupArn": "***"
}
},
"httpMethod": "GET",
"path": "/",
"queryStringParameters": {
"redirect_uri": "***",
},
"headers": {
~
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36 Edg/85.0.564.63",
"x-amzn-trace-id": "Root=***",
~
},
"body": "",
"isBase64Encoded": false
}
MultiValueHeader:Enabled
{
"requestContext": {
"elb": {
"targetGroupArn": "***"
}
},
"httpMethod": "GET",
"path": "/",
"multiValueQueryStringParameters": {
"redirect_uri": [
"***"
]
},
"multiValueHeaders": {
~
"user-agent": [
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36 Edg/85.0.564.63"
],
"x-amzn-trace-id": [
"Root=***"
],
},
"body": "",
"isBase64Encoded": false
}
なおGetパラメータは queryStringParameters ないし multiValueQueryStringParameters で取得できるが、
Postパラメータは body にBase64エンコードされた状態で渡されるので適当にデコードする
# Postパラメータをデコードして整形
tmp = parse_qs(base64.b64decode(event.get('body')).decode())
for key in tmp:
post_params[key] = tmp[key][0]
# こんな感じになる
post_params = {
'param1': 'value1',
'param2': 'value2',
}
レスポンス
- httpレスポンス内容をreturnしてやる
- MultiValueHeaderによって若干変わる
- 必須項目
- StatusCode
- isBase64Encoded (リダイレクトの場合はいらない)
- headers
sample:MultiValueHeader:Disableの場合
response = {
'statusCode': 200,
'statusDescription': '200 OK.',
'isBase64Encoded': False,
'headers': {
'Content-Type': 'application/json; charset=utf-8'
}
'body': json,
}
sample:MultiValueHeader:Enableの場合
response = {
'statusCode': 200,
'statusDescription': '200 OK.',
'isBase64Encoded': False,
'multiValueHeaders': {
'Content-Type': ['text/html'],
'Set-Cookie': [
'cookie-1=value; Expires=3600',
'cookie-2=value;',
]
},
'body': html,
}
sample:リダイレクト
response = {
'statusCode': 302,
'headers': {
'Location': redirect_url
}
}
なんか、そんな感じ。