/ #aws #cdk 

CDK(Python)でAPI Gatewayの統合レスポンスでURLパラメータの設定とステージ名を変える

もくじ

前回API GatewayをCDKで実装しました。

が、設定皆無だったので今回はそこにクエリ文字列(URLパラメータ)を設定したり、ステージ名変更したりしようと思います。

のまえに、そもそも クエリ文字列(URLパラメータ) ってなんぞや?って問題があるので先に軽くふれます。

GETとかでURLからパラメータを渡すあれです。

具体的には

https://blog.i-tale.jp/?hoge=123&hugo=456&moke=mokemoke

のこの部分(↓)

?hoge=123&hugo=456&moke=mokemoke

エンドポイントの後に?がありその後&で連結したパラメーターのことです。

前提

前回の続き

では 作っていきましょう👻

変更があるところだけ大まかに書いていきます。

stackファイル

いつものとおりメインはここですが、ほぼサンプルコードで😅

...省略...
class ApiLambdaIntegrationStack(core.Stack):
    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)
        ...省略...
        # lambda
        lambda_ = aws_lambda.Function(...省略...)

        # API Gateway
        api = aws_apigateway.RestApi(
            # ステージ名を設定
            self, "ApiLambdaIntegrationApiGateway", deploy_options=aws_apigateway.StageOptions(stage_name="hogehoge")
        )
        hoge_resources = api.root.add_resource("hoge")
        hoge_resources.add_method(
            "GET",
            aws_apigateway.LambdaIntegration(lambda_),
            request_parameters={
                # クエリ文字列(URLパラメータ)の明示的に宣言
                "method.request.querystring.hoge": True,  # 必須なパラメータ
                "method.request.querystring.hogeOption": False,  # 必須ではないパラメータ
            },
            # 下記設定を入れないと必須フラグは動作しない
            request_validator=api.add_request_validator(
                "ApiLambdaIntegrationValidator", validate_request_parameters=True
            ),
        )

Lambda

動作確認のためのおまけです。

クエリ文字列を取得してそれをレスポンスで返す、というLambdaです。

def lambda_handler(event, context):
    query = event["queryStringParameters"]

    return {
        "statusCode": 200,
        "body": f'hoge={query["hoge"]}, hogeOption={query.get("hogeOption")}',
    }

余談ですが、query["hoge"]query.get("hogeOption")で微妙に書き方を変えているのはkeyが絶対あるか無いかの差です👍

デプロイ🚀

$ cdk deploy api-lambda-integration-stack

デプロイ完了時にエンドポイントが表示されるのでそれをコピーしておいてください(笑)

動作確認

デプロイ時に表示されたURLを使います。

今回はこんなものが表示されました。

https://ydb42khx4b.execute-api.ap-northeast-1.amazonaws.com/hogehoge/

エンドポイントの末尾がステージ名で設定した値(hogehoge)になっていることがとりあえず確認できました👍

さてとりあえず一旦、可読性向上のために変数に入れます。

$ URL=https://ydb42khx4b.execute-api.ap-northeast-1.amazonaws.com/hogehoge/

ではAPIの動作確認をしていきましょう

$ curl -i ${URL}hoge
HTTP/2 400
...省略...

{"message": "Missing required request parameters: [hoge]"}

hoge無ぇぞヽ(゚Д゚)ノゴルァァア!」とお壊れました👍

必須フラグが働いてますねー。

ということでhogeを渡してみます。

$ curl -i "${URL}hoge?hoge=123"
HTTP/2 200
...省略...

hoge=123, hogeOption=None

無事期待通りのレスポンスが返ってきました👍

hogeOptionは任意なので、なくてもレスポンスは通ります👍

一応hogeOptionも渡してみます

$ curl -i "${URL}hoge?hoge=123&hogeOption=hugohugo"
HTTP/2 200
...省略...

hoge=123, hogeOption=hugohugo

はい、期待通りのふるまいですね

確認終了です。

余談ですが、hogehoge使いすぎるのもちょっと問題だなと思いました、、、

今回のエンドポイントの末尾がhogehogeしすぎてて、どこで設定したhogeがどのhogeに対応しているのか直感的にわかりにくい、、

エンドポイントの末尾、、、https://xxxxxxx/hogehoge/hoge?hoge=xxx

削除💣

$ cdk destroy api-lambda-integration-stack

まとめ

以前にAPI GatewayでデプロイしたStackにクエリ文字列とステージ名を追加してみました🎉イェーイ

今回のリポジトリはこちら

https://github.com/sisi100/cdk-my-template/tree/20201119.0

Author

Sisii

インフラが好きなエンジニアぶってるなにか