---
layout: docs
page_title: Manual Lambda Function Registration
description: >-
  Register AWS Lambda functions with Consul service mesh using the Consul Lambda registrator. The Consul Lambda registrator automates Lambda function registration.
---

# Manual Lambda Function Registration

This topic describes how to manually register Lambda functions into Consul. Refer to [Automate Lambda Function Registration](/docs/lambda/registration/automate) for information about using the Lambda registrator to automate registration. 

## Requirements

Verify that your environment meets the requirements specified in [Lambda Function Registration Requirements](/docs/lambda/registration).

To manually register Lambda functions so that mesh services can invoke them, you must create and apply a service registration configuration for the Lambda function and write a [service defaults configuration entry](/docs/connect/config-entries/service-defaults) for the function. 

## Register a Lambda function

You can manually register Lambda functions if you are unable to automate the process using the Lambda registrator.

1. Create a configuration for registering the service. You can copy the following example and replace `<SERVICE_NAME>` with your Consul service name for the Lambda function:

   <CodeBlockConfig filename="lambda.json">

   ```json
   {
     "Node": "lambdas",
     "SkipNodeUpdate": true,
     "NodeMeta": {
       "external-node": "true",
       "external-probe": "true"
     },
     "Service": {
       "Service": "<SERVICE_NAME>"
     }
   }
   ```

    </CodeBlockConfig>

1. Save the configuration to `lambda.json`.

1. Send the configuration to the `catalog/register` API endpoint to register the service, for example:
   ```shell-session
   $ curl --request PUT --data @lambda.json localhost:8500/v1/catalog/register
   ```

1. Create the `service-defaults` configuration entry and include the AWS tags used to invoke the Lambda function in the `Meta` field (refer to [Supported `Meta` fields](#supported-meta-fields). The following example creates a `service-defaults` configuration entry named `lambda`:

   <CodeBlockConfig filename="lambda-service-defaults.hcl">

   ```hcl
   Kind = "service-defaults"
   Name = "lambda"
   Protocol  = "http"
   Meta = {
     "serverless.consul.hashicorp.com/v1alpha1/lambda/enabled" = "true"
     "serverless.consul.hashicorp.com/v1alpha1/lambda/arn" = "<INSERT ARN HERE>"
     "serverless.consul.hashicorp.com/v1alpha1/lambda/payload-passthrough" = "true"
     "serverless.consul.hashicorp.com/v1alpha1/lambda/region" = "us-east-2"
   }
   ```

   </CodeBlockConfig>

1. Issue the `consul config write` command to store the configuration entry. For example:
   ```shell-session
   $ consul config write lambda-service-defaults.hcl
   ```

### Supported `Meta` fields

The following tags are supported. The path prefix for all tags is `serverless.consul.hashicorp.com/v1alpha1/lambda`. For example, specify the following tag to enable Consul to configure the service as an AWS Lambda function: 

`serverless.consul.hashicorp.com/v1alpha1/lambda/enabled`.

| Tag | Description |
| --- | --- |
| `<prefix-path>/enabled` | Determines if Consul configures the service as an AWS Lambda. |
| `<prefix-path>/payload-passthrough` | Determines if the body Envoy receives is converted to JSON or directly passed to Lambda. |
| `<prefix-path>/arn` | Specifies the [AWS ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) for the service's Lambda. |
| `<prefix-path>/invocation-mode` | Determines if Consul configures the Lambda to be invoked using the `synchronous` or `asynchronous` [invocation mode](https://docs.aws.amazon.com/lambda/latest/operatorguide/invocation-modes.html). |
| `<prefix-path>/region` | Specifies the AWS region the Lambda is running in. |
