/ #cdk #APIGateway 

CDK(Python)でAPIGatewayの統合レスポンスなLambdaを作る

もくじ

cdkを使ってAPIGatewayを作ってみます。

Lambdaは統合レスポンスで行きます👍

全体の構成はこんな感じです。

前提

cdkのシリーズの続き。

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

requirements.txt

今回使うリソースはLambdaとAPI Gatewayなので、必要なモジュールはこんな感じです👍

aws-cdk.core==1.72.0

aws-cdk.aws-lambda==1.72.0
aws-cdk.aws_apigateway==1.72.0

stackファイルの実装

ここがメインですが、説明文よりサンプルコードのほうがきっとわかりやすいと思います。

内容しては、Lambdaを1つ作って、API Gatewayからhogeというリソースを1つ生やし、そこのGETメソッドに統合レスポンスでLambdaを設定してます👍

from aws_cdk import aws_apigateway, aws_lambda, core


class ApiLambdaIntegrationStack(core.Stack):
    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        # lambda
        lambda_ = aws_lambda.Function(
            self,
            "ApiLambdaIntegrationLambda",
            code=aws_lambda.Code.asset("lambdas/api_lambda_integration"),
            runtime=aws_lambda.Runtime.PYTHON_3_8,
            handler="lambda_function.lambda_handler",
        )

        # API Gateway
        api = aws_apigateway.RestApi(self, "ApiLambdaIntegrationApiGateway")
        hoge_resources = api.root.add_resource("hoge")
        hoge_resources.add_method("GET", aws_apigateway.LambdaIntegration(lambda_))

lambdaの実装

Lambdaの実装はおまけです。

今回はeventの入力を完全に無視したLambdaですが、その理由としては今回は統合レスポンスなのでlambdaのレスポンスが固定になります。そこを強調するためにこんな実装にしてみました😊

def lambda_handler(event, context):

    return {
        "statusCode": 200,
        "headers": {
            "Content-Disposition": 'attachment;filename="hoge.txt"',
            "Content-Type": "text/plain",
        },
        "body": "hogehogeなのだよ",
    }

Lambdaのレスポンスの詳細は公式をご確認ください👍

エントリーポイントに追加

下記な感じで追記します

...省略...
from stacks.api_lambda_integration import ApiLambdaIntegrationStack
...省略...
ApiLambdaIntegrationStack(app, "api-lambda-integration-stack", env=env)
...省略...

動作確認

コンソールなりから今回deployしたAPIのエントリーポイントを取得してきてください😉

ちなみにcli経由で取得しようとすると結構たいへんなのでコンソールから取得したほうが早いです。

CLIの場合はこんな感じ❓🤔

# APIの一覧を取得して、そこから今回deployしたAPIのidを取得
$ aws apigateway get-rest-apis
...APIの一覧が表示されるので頑張って探す...

# 可読性向上のために変数に入力。下記のIDは例
$ API_ID=cggnai5wi8

# どこかからリージョンを取得してきてください😰
$ REGION=ap-northeast-1

# URI合成
$ URI=`echo https://$API_ID.execute-api.$REGION.amazonaws.com/prod/hoge`
$ echo $URI
https://cggnai5wi8.execute-api.ap-northeast-1.amazonaws.com/prod/hoge

はい、色々イケてないですね😅

# curlで動作確認
$ curl $URI
hogehogeなのだよ

ブラウザで叩くとこんな感じです👍

以上👍

stackの削除

$ cdk destroy --all

まとめ

今回はCDKを使ってAPI Gatewayの統合レスポンスを使うLambdaをデプロイしてみました👍

ブラウザとcurlで動作確認をしてました

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

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

Author

Sisii

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