From bf3817d423a9d850a4615ba6b040f4c596556a11 Mon Sep 17 00:00:00 2001 From: Thomas Taylor Date: Fri, 5 Jan 2024 03:11:27 -0500 Subject: [PATCH] add `Creating a serverless API using AWS Lambda Powertools and CDK` article --- ...api-using-aws-lambda-powertools-and-cdk.md | 314 ++++++++++++++++++ static/images/hwruz7.webp | Bin 0 -> 43412 bytes 2 files changed, 314 insertions(+) create mode 100644 content/blog/2024-01-05-creating-a-serverless-api-using-aws-lambda-powertools-and-cdk.md create mode 100644 static/images/hwruz7.webp diff --git a/content/blog/2024-01-05-creating-a-serverless-api-using-aws-lambda-powertools-and-cdk.md b/content/blog/2024-01-05-creating-a-serverless-api-using-aws-lambda-powertools-and-cdk.md new file mode 100644 index 0000000..d22f5d9 --- /dev/null +++ b/content/blog/2024-01-05-creating-a-serverless-api-using-aws-lambda-powertools-and-cdk.md @@ -0,0 +1,314 @@ +--- +author: Thomas Taylor +categories: +- cloud +- programming +date: '2024-01-05T03:05:00-05:00' +description: +images: +- images/hwruz7.webp +tags: +- python +- aws +- aws-cdk +- serverless +title: 'Creating a serverless API using AWS Lambda Powertools and CDK' +--- + +![API Gateway and Lambda Logo architecture image](images/hwruz7.webp) + +Amazon API Gateway + AWS Lambda is a powerful duo for creating easy-to-deploy scalable infrastructure that is immediately accessible by thousands of users. For this post, we will create an API Gateway with an lambda proxy integration using the AWS Lambda Powertools library and the AWS CDK. + +In just a few lines of code, we'll have our API deployed and ready to go! This tutorial assumes you know what the Amazon API Gateway and AWS Lambda services are. + +## What is AWS Lambda Powertools + +[AWS Lambda Powertools][3] is an SDK released by Amazon that aims to increase developer productiviy by bundling similar functionality together: + +1. Tracing +2. Logging +3. Event handling +4. Typing / Validation +5. Middleware + +and more! + +With this SDK, we'll build a single lambda integration that will handle all the routes of our API Gateway. + +If you've used Flask, Spring Boot, express, etc., this following code snippet should look familiar: + +```python +from aws_lambda_powertools import Logger, Tracer +from aws_lambda_powertools.event_handler import APIGatewayRestResolver +from aws_lambda_powertools.logging import correlation_paths +from aws_lambda_powertools.utilities.typing import LambdaContext +from aws_lambda_powertools.utilities.data_classes import event_source +from aws_lambda_powertools.utilities.data_classes.api_gateway_authorizer_event import ( + APIGatewayAuthorizerRequestEvent, +) + +tracer = Tracer() +logger = Logger() +app = APIGatewayRestResolver() + + +@app.get("/pets") +@tracer.capture_method +def get_pets(): + return {"pets": []} + + +@logger.inject_lambda_context(correlation_id_path=correlation_paths.API_GATEWAY_REST) +@tracer.capture_lambda_handler +@event_source(data_class=APIGatewayAuthorizerRequestEvent) +def lambda_handler( + event: APIGatewayAuthorizerRequestEvent, context: LambdaContext +) -> dict: + return app.resolve(event.raw_event, context) +``` + +The `APIGatewayRestResolver` behaves like a router. The `lambda_handler` processes the API Gateway event then `resolve`s the route using the information that was passed from the lambda context. We'll reference this example when creating our own. + +## How to deploy an API Gateway with Proxy Lambda with Powertools + +Follow the instructions below to deploy a Lambda Function with Powertools bundled for an API Gateway proxy integration. + +### Create a requirements.txt + +For this tutorial, version 2.118.0 of the AWS CDK was used. + +```text +aws-cdk-lib==2.118.0 +constructs>=10.0.0,<11.0.0 +``` + +### Install the dependencies + +```shell +pip3 install -r requirements.txt +``` + +### Create /handler folder with an index.py file + +```python +import json + + +def handler(event, context): + return {"statusCode": 200, "body": json.dumps({"message": "Hello world!"})} +``` + +### Create stack.py with an API Gateway and a lambda router + +```python +from os import path + +import aws_cdk as cdk +import aws_cdk.aws_lambda as lambda_ +import aws_cdk.aws_apigateway as apigateway + + +class ApiStack(cdk.Stack): + def __init__(self, scope: cdk.App, construct_id: str, **kwargs) -> None: + super().__init__(scope, construct_id, **kwargs) + + lambda_function = lambda_.Function( + self, + "Function", + runtime=lambda_.Runtime.PYTHON_3_11, + handler="index.handler", + code=lambda_.Code.from_asset(path.join(path.dirname(__file__), "handler")), + ) + + api = apigateway.LambdaRestApi(self, "API", handler=lambda_function) +``` + +The AWS CDK [provides "L3" constructs][4]; constructs that abstract away configuration we otherwise explicitly need define. In the case above, the [L3 construct named `LambdaRestApi`][5] handles a few things: + +1. API Gateway creation +2. Lambda handler configuration +3. Resource path `{proxy+}` creation +4. `ANY` method creation + +### Create app.py + +```python +import aws_cdk as cdk + +from stack import ApiStack + +app = cdk.App() +ApiStack(app, "ApiStack") + +app.synth() +``` + +### Create cdk.json + +```json +{ + "app": "python3 app.py" +} +``` + +The directory structure should look like this: + +```text +project/ +├── app.py +├── cdk.json +├── handler +│   └── index.py +├── requirements.txt +└── stack.py +``` + +### Deploy the stack + +```shell +cdk deploy +``` + +After the stack is deployed, we're given the API endpoint in a stack output: + +```text +Outputs: +ApiStack.APIEndpoint1793E782 = https://{api_id}.execute-api.us-east-1.amazonaws.com/prod/ +``` + +### Testing the proxy integration + +At this point, we can send any HTTP request and always get back the same response: + +```shell +curl https://{api_id}.execute-api.us-east-1.amazonaws.com/prod/ +``` + +Output: + +```json +{"message": "Hello world!"} +``` + +### Add Lambda Powertools lambda layer using AWS CDK + SAR + +Rather than write our own routing function based on the API Gateway event, let's use AWS Lambda Powertools. + +I have two preferred options for adding the Lambda Powertools layer: + +1. Using the [AWS lambda layer construct provided by AWS][6] (requires Docker) +2. Explicitly using the AWS managed layer + +For the purposes of this tutorial, I'll [reference the lambda layer using the serverless application respository][7]. + +```python +from os import path + +import aws_cdk as cdk +import aws_cdk.aws_lambda as lambda_ +import aws_cdk.aws_apigateway as apigateway +import aws_cdk.aws_sam as sam + +POWERTOOLS_BASE_NAME = "AWSLambdaPowertools" +POWERTOOLS_VERSION = "2.30.2" +POWERTOOLS_ARN = "arn:aws:serverlessrepo:eu-west-1:057560766410:applications/aws-lambda-powertools-python-layer" + + +class ApiStack(cdk.Stack): + def __init__(self, scope: cdk.App, construct_id: str, **kwargs) -> None: + super().__init__(scope, construct_id, **kwargs) + + powertools_app = sam.CfnApplication( + self, + f"{POWERTOOLS_BASE_NAME}Application", + location={ + "applicationId": POWERTOOLS_ARN, + "semanticVersion": POWERTOOLS_VERSION, + }, + ) + + powertools_layer_arn = powertools_app.get_att( + "Outputs.LayerVersionArn" + ).to_string() + + powertools_layer_version = lambda_.LayerVersion.from_layer_version_arn( + self, f"{POWERTOOLS_BASE_NAME}", powertools_layer_arn + ) + + lambda_function = lambda_.Function( + self, + "Function", + runtime=lambda_.Runtime.PYTHON_3_11, + handler="index.handler", + code=lambda_.Code.from_asset(path.join(path.dirname(__file__), "handler")), + layers=[powertools_layer_version], + ) + + api = apigateway.LambdaRestApi(self, "API", handler=lambda_function) +``` + +### Using AWS Lambda Powertools + +Now that the lambda is successfully configured for AWS Lambda Powertools, let's experiment using a small todo app: + +```python +from aws_lambda_powertools import Logger, Tracer +from aws_lambda_powertools.event_handler import APIGatewayRestResolver +from aws_lambda_powertools.logging import correlation_paths +from aws_lambda_powertools.utilities.typing import LambdaContext + +tracer = Tracer() +logger = Logger() +app = APIGatewayRestResolver() + + +@app.get("/tasks") +@tracer.capture_method +def get_tasks(): + # database lookup goes here + return [{"id": "ptvWZ3", "text": "hello!"}, {"id": "cqDUr3", "text": "another!"}] + + +@logger.inject_lambda_context(correlation_id_path=correlation_paths.API_GATEWAY_REST) +@tracer.capture_lambda_handler +def handler(event: dict, context: LambdaContext) -> dict: + return app.resolve(event, context) +``` + +Now we can test the different routes: + +```shell +curl https://{api_id}.execute-api.us-east-1.amazonaws.com/prod/ +``` + +Output: + +```json +{"statusCode":404,"message":"Not found"} +``` + +and the real `/tasks` endpoint: + +```shell +curl https://{api_id}.execute-api.us-east-1.amazonaws.com/prod/tasks +``` + +Output: + +```json +[{"id":"ptvWZ3","text":"hello!"},{"id":"cqDUr3","text":"another!"}] +``` + +## Conclusion + +At this point, you will have a functioning AWS CDK application with an API Gateway Lambda Proxy integration setup! While the `/tasks` code is rudimentary, it provides the foundation for expansion for your own API! + +Happy building! + +[1]: https://aws.amazon.com/api-gateway/ +[2]: https://aws.amazon.com/lambda/ +[3]: https://docs.powertools.aws.dev/lambda/python/latest/ +[4]: https://docs.aws.amazon.com/cdk/v2/guide/constructs.html#constructs_lib +[5]: https://docs.aws.amazon.com/cdk/api/v2/python/aws_cdk.aws_apigateway/LambdaRestApi.html +[6]: https://github.com/aws-powertools/powertools-lambda-layer-cdk +[7]: https://docs.powertools.aws.dev/lambda/python/latest/#sar diff --git a/static/images/hwruz7.webp b/static/images/hwruz7.webp new file mode 100644 index 0000000000000000000000000000000000000000..be69301a2c35686efdce692db4583fe1b69f8f6f GIT binary patch literal 43412 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 xle>3yJOhm&ss0q~;BOMfKDmYB#