# Lambda function URLs: deploy and test with CDK

In this article, we are going to discover a new feature from AWS Lambda : function URLs.

### Definition

 A function URL is a dedicated HTTP(S) endpoint for your Lambda function.  
The endpoints have the following format:  

`https://<url-id>.lambda-url.<region>.on.aws`

### Pricing

Function URLs are included in Lambda’s request and duration pricing.

### Difference with API Gateway

Function URLs are best for use cases where you must implement a single-function microservice with a public endpoint that doesn’t require the advanced functionality of API Gateway, such as request validation, throttling, custom authorizers, custom domain names, usage plans, or caching.  
For example, when you are implementing webhook handlers, form validators, static html file...   
It is also the simplest way to invoke your Lambda functions during development without leaving the Lambda console or integrating additional services.


### Create and deploy the lambda with CDK

Let's create a new project


```
mkdir lambda-url
cd lambda url
cdk init
``` 

lib/lambda-url-stack.ts

```
import { CfnOutput, Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as lambda from 'aws-cdk-lib/aws-lambda';

export class LambdaHttpStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here

    const myFunction= new lambda.Function(this, 'LambdaHandler', {
      runtime: lambda.Runtime.NODEJS_14_X,    // execution environment
      code: lambda.Code.fromAsset('lambda'),  // code loaded from "lambda" directory
      handler: 'index.handler'                // file is "index", function is "handler"
    });

    const fnUrl = myFunction.addFunctionUrl({  // your function url
      authType: lambda.FunctionUrlAuthType.NONE,
    });

    new CfnOutput(this, 'TheUrl', {
      value: fnUrl.url,
    });
  }
}
``` 

At the root of your project, (next to lib and bin), create a lambda folder and inside it, an index.js file


```
# at the root of your project
mkdir lambda
cd lambda
touch index.js
``` 

lambda/index.js (let's render some html ! )

```
exports.handler = async function(event) {
    console.log("request:", JSON.stringify(event, undefined, 2));
    const body = '<html><head><title>HTML from Lambda URL</title></head>' + 
    '<body><h1>Hello you ! This is served by a Lambda function URL</h1></body></html>'
    return {
      statusCode: 200,
      headers: { "Content-Type": "text/html" },
      body
    };
  };
``` 

Everything is ready ! Now let's deploy

```
❯ cdk deploy

✨  Synthesis time: 14.84s

LambdaUrlStack: deploying...
[0%] start: Publishing XXXXXXXXXXXXXXXXX:current_account-current_region
[0%] start: Publishing XXXXXXXXXXXXXXXXX:current_account-current_region
[50%] success: Published XXXXXXXXXXXXXXXXX:current_account-current_region
[100%] success: Published :XXXXXXXXXXXXXXXXXcurrent_account-current_region
LambdaUrlStack: creating CloudFormation changeset...

 ✅  LambdaUrlStack

✨  Deployment time: 45.96s

Outputs:
LambdaUrlStack.TheUrl = https://XXXXXXXXXXXXXXXXX.lambda-url.us-east-1.on.aws/
Stack ARN: XXXXXXXXX:stack/LambdaUrlStack/XXXXXXXX

✨  Total time: 60.79s

```

You can find the code on this [repository](https://github.com/SoniaisMad/lambda-function-url-example-cdk)

### On the console

Go to Lambda , you should see the one you just created.

Click on it, and you should see your function URL (see capture)

![Capture d’écran 2022-05-26 à 14.45.18.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1653569410742/NbAAGwFv6.png align="left")


### Test our lambda 

Copy the function URL and paste in your browser, hit enter and you should see this : 

![Capture d’écran 2022-05-26 à 14.51.18.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1653569532759/5oRxWTB0f.png align="left")

### Conclusion

Congrats ! You know now how to use Function URLs for Lambda.

To go further : [AWS Documentation](https://docs.aws.amazon.com/lambda/latest/dg/lambda-urls.html)

See you in the next one :) 
