ヘッダーに埋められた値見て本番LambdaとステージングLambdaに振分け

小ネタですね。今までAPIGatewayでステージングと本番環境を分けるようなことしていたのですが、静的サイトとかする時にフロントのjsで一々書替すると事故りそうなので静的ジェネレータで書き出すときにステージング環境の場合はヘッダに何か付与するので、そのヘッダのパラメータを元にステージングと本番で見る先を1個のAPIGatewayで分けたいなぁというのがそもそものきっかけです。どこの項目のどういうキーがどういう値ならという部分は環境変数で切り出して修正できるようにしています。
そして未だにSAMとかServelessは使わずマネジメントコンソールのエディタで触っています(爆
呼出し先でデータベース抽出してきて返す様にしておけばステージングで新しいテーブルを見させつつ、本番では旧テーブル参照とかいうことも簡単にできます。

◆プログラム

とりあえずはLambdaでサクッと関数作ります。先にIAMで[lambda:InvokeFunction]を持つロールを作る必要あります。その辺はググってください。

呼出し元Lambda
--------------------
import json
import os
import boto3

def lambda_handler(event, context):
    result = ''
    param = ''
    geh = os.getenv('REFER_OBJ')
    gev = os.getenv('KEY_NAME')
    mt = os.getenv('MATCH_VAL')
    hs = event[geh]
    #ヘッダー判定
    if hs:
       if gev in hs:
          param = event[geh][gev]
    if param == mt:
       fn = 'distribution-test-back'
    else:
       fn = 'distribution-prd-back'
    #クエリストリング取得
    cp = event['company']
    ds = event['destination']

    input_event = {
        "param1": str(cp),
        "param2": str(ds)
    }

    Payload = json.dumps(input_event)          
    response = boto3.client('lambda').invoke(
        FunctionName=fn,
        InvocationType='RequestResponse',
        Payload=Payload
    )   
    body = json.loads(response['Payload'].read())
    return {
          'body': json.dumps(body)
    }
--------------------
呼出し先Lambda(2つ作る、This Changeの箇所を変更する)
--------------------
import json

def lambda_handler(event, context):
    p1 = event['param1']
    p2 = event['param2']    
    resp = ' CP:' + p1 + ' ds:' + p2
    # TODO implement
    return {
        'body': json.dumps('This Change' + resp)
    }
--------------------

環境変数は以下の様に
MATCH_VAL 判定したい値
REFER_OBJ headers
KEY_NAME ヘッダーに埋め込んだキー名

◆APIGateway

1.メソッドリクエストの[URLクエリ文字列パラメータ]追加









2.HTTPリクエストヘッダー追加










3.統合リクエストで[Lambdaプロキシ統合の使用]は外す









4.マッピングテンプレートを入力










以下の内容を登録
----------------------
{
    "headers": {
        #foreach($param in $input.params().header.keySet())
        "$param": "$util.escapeJavaScript($input.params().header.get($param))"
        #if($foreach.hasNext),#end
        #end
    },
    "company" : "$input.params('cp')",
    "destination" : "$input.params('ds')"
}
----------------------

◆参照サイト

■LambdaからLambda呼出
https://qiita.com/ume1126/items/8170a10fad6b21f0f54a
https://gist.github.com/rafty/aa695508f4d9120a5aae
https://www.magata.net/memo/index.php?AWS%20Lambda%A4%AB%A4%E9Lambda%A4%F2%B8%C6%A4%D6
https://dev.classmethod.jp/cloud/aws/lambda-python-tips-all-events-are-not-dict/
https://qiita.com/sy250f/items/7452a3067be2781035d6
https://note.kiriukun.com/entry/20190117-synchronously-invoke-other-lambda-from-lambda

■ヘッダー取得
https://cloudpack.media/49849
https://anorlondo448.hatenablog.com/entry/2018/10/22/000036
https://qiita.com/leomaro7/items/66ea3233097fa410fef9
https://qiita.com/shtnkgm/items/45b4cd274fa813d29539
https://aws.amazon.com/jp/premiumsupport/knowledge-center/custom-headers-api-gateway-lambda/

コメント

このブログの人気の投稿

証券外務員1種勉強(計算式暗記用メモ)

GASでGoogleDriveのサブフォルダとファイル一覧を出力する

マクロ経済学(IS-LM分析)