# Functions

Functions are units of execution in the AssemblyLift framework. They are grouped into services, and are themselves structured according to the chosen language (e.g with Rust each function is a Cargo crate).

Each function is compiled to a WebAssembly module, compatible with the AssemblyLift ABI.

## Make a New Function

You can create a new function in an existing service with the `make` command:

```
$ asml make function myservice.myfunction
```

where `myservice` is the name of the service in which you would like to make the function named `myfunction`.

## Defining an API

AssemblyLift functions can be exposed via an HTTP API. When using the AWS Lambda backend, this API is deployed to [Amazon API Gateway](https://aws.amazon.com/api-gateway/).

{% code title="service.toml" %}

```
[service]
name = "myservice"

[api.functions.myfunction]
name = "myfunction"
http = { verb = "GET", path = "/" }
```

{% endcode %}

You define an API for a function using the `http` field, which accepts `verb` and `path`.

## Defining an Authorizer

AssemblyLift supports defining authorizers and attaching them per-function. Authorizers *require* an HTTP API to be defined for the function.

The Lambda backend currently supports IAM and JWT authorizers.

{% code title="service.toml" %}

```
[service]
name = "myservice"

[api.functions.myfunction]
name = "myfunction"
http = { verb = "GET", path = "/" }
authorizer_id = "cognito"

[api.authorizers.cognito]
auth_type = "JWT"
audience = ["clientid"]
issuer = "https://cognito-idp.us-east-1.amazonaws.com/myuserpoolid"
```

{% endcode %}
