4
0

More than 3 years have passed since last update.

LambdaをALBのターゲットに指定した際のメモ

Posted at

ターゲット登録手順

  1. Lambda Function作成
  2. Lambda Function宛のTarget Group作成
  3. 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
    }
}

なんか、そんな感じ。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0