> ## Documentation Index
> Fetch the complete documentation index at: https://docs.conduktor.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Conduktor deployment on AWS — Console and Gateway on ECS

> Deploy Conduktor Console and Gateway on AWS. Covers EC2, EKS, RDS PostgreSQL, and networking setup for a production-ready Kafka operations platform.

## Overview

This guide will show how to deploy Console in your AWS environment with all the mandatory dependencies. It will demonstrate how to deploy Conduktor as a Docker container on ECS with Fargate and configure it alongside a PostgreSQL database via RDS.

Our recommendation is to [deploy with Kubernetes](/guide/conduktor-in-production/deploy-artifacts/deploy-console/kubernetes).

You can follow this guide or [view the instructions for Marktetplace listing (AWS CloudFormation)](#deploy-on-aws-cloudformation).

<Info>
  While this guide will help you get started, you may need to make additional configurations to ensure your deployment is [production-ready](/guide/conduktor-in-production).
</Info>

<Note>
  Before you start, make sure that you've already created a new Virtual Private Cloud (VPC) with a public subnet and two private subnets (needed for RDS) or are planning to use an existing one.

  This is important to ensure that your environment is secure and isolated. We also **strongly recommend** avoiding the use of the default VPC, as it can pose a security risk due to its common configuration.
</Note>

<img src="https://mintcdn.com/conduktor/dKeHsjTOLvuHVG-Z/images/conduktor.ecs.png?fit=max&auto=format&n=dKeHsjTOLvuHVG-Z&q=85&s=83b24ea17c8540b9ff9aeaa32c007cac" alt="AWS Deployment" width="1266" height="910" data-path="images/conduktor.ecs.png" />

Within the VPC ensure to create a public security group that allows access to port `8080` from the internet to give Conduktor Console access.

<img src="https://mintcdn.com/conduktor/pjEpkgdZT0NwjvhM/images/aws-guide-0.png?fit=max&auto=format&n=pjEpkgdZT0NwjvhM&q=85&s=4468defbedc4b9a6bbacc4c3b9ba8e79" alt="AWS Public Subnet" width="1644" height="467" data-path="images/aws-guide-0.png" />

You'll also need to create a private security group that allows access to port `5432` from the public security group to give Conduktor Console access to the RDS database.

<img src="https://mintcdn.com/conduktor/pjEpkgdZT0NwjvhM/images/aws-guide-1.png?fit=max&auto=format&n=pjEpkgdZT0NwjvhM&q=85&s=3a1f588b2157be6b1304a6b5b6bd9c28" alt="AWS Private Subnet" width="1638" height="467" data-path="images/aws-guide-1.png" />

### Step 1: Create a PostgreSQL database via Amazon RDS

<Info>
  You can skip this step if you already have an RDS database running you want to use.
</Info>

Let's start by deploying a database on RDS that Conduktor will use to store its state.

As per the system requirements, the PostgreSQL DB needs to be version **13 or higher**.

Please be aware that Console is compatible only with PostgreSQL engines of version 14.8 or 15.3 and above **within RDS**; other versions may not be fully supported.

Go to the RDS menu and create a new database.

* Select **PostgreSQL**
* In the **Template** section, select **Free Tier** if you are just evaluating Conduktor.

Under Settings, configure:

* **Master username**: `conduktor`
* **Master password**: `change_me`

The default PostgreSQL database port is **5432**.

<img src="https://mintcdn.com/conduktor/44Tt3Hho7H0Qb3Es/images/aws-guide-2.png?fit=max&auto=format&n=44Tt3Hho7H0Qb3Es&q=85&s=083fba11fd07ba51f331f66b164b6b50" alt="AWS Guide RDS" width="933" height="822" data-path="images/aws-guide-2.png" />

Under **Additional configuration**, configure:

* **Initial database name**: `postgres`

<img src="https://mintcdn.com/conduktor/-jWj5PZy5xVb4uBy/images/aws-guide-3.png?fit=max&auto=format&n=-jWj5PZy5xVb4uBy&q=85&s=279ea939194a7a0a61b58056af7caf18" alt="AWS Guide RDS Config" width="1811" height="738" data-path="images/aws-guide-3.png" />

Once your database instance is up and running (it takes a few minutes), click on your new database and copy the endpoint generated by AWS in the **Connectivity & Security** panel, e.g. `conduktor.xxx.eu-central-1.rds.amazonaws.com`.

<img src="https://mintcdn.com/conduktor/-jWj5PZy5xVb4uBy/images/aws-guide-4.png?fit=max&auto=format&n=-jWj5PZy5xVb4uBy&q=85&s=c1d12c7621e7df7f6835fc688ebf1c9d" alt="AWS Guide RDS Endpoint" width="1538" height="619" data-path="images/aws-guide-4.png" />

### Step 2: Create a new Task definition on ECS

Now that we have our database, it's time to deploy Conduktor using Docker containers and ECS (Amazon Elastic Container Service).

Go to Amazon Elastic Container Service:

* Select **Task Definitions**
* Click on **Create new task definition**

In the **Infrastructure Requirements** section:

* Define the ECS family name as `conduktor`, this will be useful to update our deployment with newer versions of Conduktor.
* Specify the infrastructure requirements relevant to your deployment. As per system requirements, we recommend a minimum of **2x CPU cores** and **4GB of RAM**.

### Step 2.1: Add the core console container

In the **Container Details** section:

* Define the name of the container to `conduktor-console`
* Specify the Image URI and version for Conduktor Console. You should use the most recent major/minor version. E.g.: `conduktor/conduktor-console:<tag>`.
* Add a Port mapping on **8080**. This is the port of the UI of Conduktor Console.

<img src="https://mintcdn.com/conduktor/41vwoheJK2A-SA8c/images/aws-guide-5.png?fit=max&auto=format&n=41vwoheJK2A-SA8c&q=85&s=fd5d81e0d728556017893462df368b1a" alt="AWS Guide RDS Container" width="1292" height="532" data-path="images/aws-guide-5.png" />

In the **Environment Variables** section, add the essential environment variables required to run Conduktor and connect to its PostgreSQL database on RDS.

* `CDK_ADMIN_EMAIL`: [yourname@yourcompany.com](mailto:yourname@yourcompany.com)
* `CDK_ADMIN_PASSWORD`: testP4ss!
* `CDK_DATABASE_HOST`: the endpoint you retrieved earlier, like conduktor-xxx.yyy.eu-central-1.rds.amazonaws.com
* `CDK_DATABASE_NAME`: postgres
* `CDK_DATABASE_PASSWORD`: change\_me
* `CDK_DATABASE_PORT`: 5432
* `CDK_DATABASE_USERNAME`: conduktor
* `CDK_MONITORING_ALERT-MANAGER-URL`: [http://localhost:9010/](http://localhost:9010/)
* `CDK_MONITORING_CALLBACK-URL`: [http://localhost:8080/monitoring/api/](http://localhost:8080/monitoring/api/)
* `CDK_MONITORING_CORTEX-URL`: [http://localhost:9009/](http://localhost:9009/)
* `CDK_MONITORING_NOTIFICATIONS-CALLBACK-URL`: [http://localhost:8080](http://localhost:8080)
* `CDK_LICENSE`: Enterprise license key (Exclude if you are using Free)

<img src="https://mintcdn.com/conduktor/41vwoheJK2A-SA8c/images/aws-guide-6.png?fit=max&auto=format&n=41vwoheJK2A-SA8c&q=85&s=30c5f2a700cdada1109f6b93be425ff5" alt="AWS Guide Env Var" width="901" height="737" data-path="images/aws-guide-6.png" />

<Info>
  You can also add your Kafka cluster, schema registry, Kafka Connect and ksqlDB configurations as environment variables.

  If you're just getting started, we recommend using the Console UI wizard instead.
</Info>

### Step 2.2: Add the Conduktor Cortex monitoring image

Under your first container definition, select **+ Add container** so we can also specify the docker image required to get monitoring benefits inside Conduktor.

In the **Container Details** section:

* Define the name of the container to `conduktor-monitoring`
* Specify the Image URI and version for conduktor monitoring. You should use the most recent major/minor version. E.g:. `conduktor/conduktor-console-cortex:<tag>`.

Add these port mappings:

* 9090 | TCP | conduktor-cortex-9090-tcp
* 9010 | TCP | conduktor-cortex-9010-tcp
* 9009 | TCP | conduktor-cortex-9009-tcp

<img src="https://mintcdn.com/conduktor/41vwoheJK2A-SA8c/images/aws-guide-7.png?fit=max&auto=format&n=41vwoheJK2A-SA8c&q=85&s=4af6192a9b33015d6aece9e7b0be223f" alt="AWS Guide Port Mappings" width="1286" height="632" data-path="images/aws-guide-7.png" />

In the **Environment variables** section, add the required environment variable to link the monitoring container with the Console container.

* `CDK_CONSOLE-URL`: [http://localhost:8080](http://localhost:8080)

<img src="https://mintcdn.com/conduktor/-jWj5PZy5xVb4uBy/images/aws-guide-8.png?fit=max&auto=format&n=-jWj5PZy5xVb4uBy&q=85&s=594644e453bfa5df311ed826d9d92801" alt="AWS Guide Task" width="721" height="240" data-path="images/aws-guide-8.png" />

For production environments, you should also configure an external S3 bucket to store historical monitoring data.

We can now go down below and **Create** our task definition.

<img src="https://mintcdn.com/conduktor/-jWj5PZy5xVb4uBy/images/aws-guide-9.png?fit=max&auto=format&n=-jWj5PZy5xVb4uBy&q=85&s=8963e50902e18fa76cbe0c3082dc012b" alt="AWS Guide Task" width="1478" height="138" data-path="images/aws-guide-9.png" />

Whenever you want to change something in your configuration, edit your task definition and create a new version containing your changes.

### Step 3: Create an ECS cluster and setup Conduktor service

We created a task definition, but it's still just a "template". Now, we need a cluster to deploy it. We'll use ECS with Fargate.

Go to **Settings** > **Clusters** and create a cluster (use the default options):

* **Name**: conduktor-ecs
* In the **Infrastructure** section, make sure AWS Fargate (serverless) is selected (default)
  Create the cluster, it might take a few seconds.

We now have a cluster to deploy our container. Our last step is to create a Service that will reference the Task Definition defined in the previous step.

* Click on your new cluster `conduktor-ecs`
* Create a new **Service**
* In the **Service details**, **Family** dropdown select our task definition `conduktor`.
* Assign a unique name like Console to be able to identify it properly later on

<img src="https://mintcdn.com/conduktor/pjEpkgdZT0NwjvhM/images/aws-guide-10.png?fit=max&auto=format&n=pjEpkgdZT0NwjvhM&q=85&s=02861dcfb97e5ac172cbfb772e22cab2" alt="AWS Guide Task Definition" width="1587" height="409" data-path="images/aws-guide-10.png" />

* Leave the **Environment** section default which uses Fargate.
* In the **Networking** tab make sure to use the correct VPC and have it placed within the public subnet. Ensure that **Public IP** is enabled to give access to Console.
* Click **Create** in the bottom right corner.

<img src="https://mintcdn.com/conduktor/pjEpkgdZT0NwjvhM/images/aws-guide-11.png?fit=max&auto=format&n=pjEpkgdZT0NwjvhM&q=85&s=7765c6457303bad4d4bc7ae82c15c23f" alt="AWS Guide Task Definition Networking" width="1049" height="634" data-path="images/aws-guide-11.png" />

This will take a few minutes before the deployment is effective and Conduktor becomes available.

### Step 4: Access Conduktor and configure Kafka Clusters

From within the **Services > Tasks** screen,  find the Container and navigate to the **Network bindings** tab.

<img src="https://mintcdn.com/conduktor/44Tt3Hho7H0Qb3Es/images/aws-guide-12.png?fit=max&auto=format&n=44Tt3Hho7H0Qb3Es&q=85&s=b3b351fd06c2fcfd13379500355e95a9" alt="AWS Guide Breadcrumb" width="2344" height="66" data-path="images/aws-guide-12.png" />

Click on the **External** link to open the Console application.

<img src="https://mintcdn.com/conduktor/44Tt3Hho7H0Qb3Es/images/aws-guide-13.png?fit=max&auto=format&n=44Tt3Hho7H0Qb3Es&q=85&s=fd67ff1a098ef1a0a6bd534cd73d8f2a" alt="AWS Guide Network Bindings" width="1565" height="876" data-path="images/aws-guide-13.png" />

In our example, our application is running at `3.122.113.99:8080`.

You can now log in as admin with the credentials previously defined in the environment variables, e.g. `yourname@yourcompany.com` / `admin`.

<img src="https://mintcdn.com/conduktor/44Tt3Hho7H0Qb3Es/images/aws-guide-14.png?fit=max&auto=format&n=44Tt3Hho7H0Qb3Es&q=85&s=eee73f62878c8566de0980dd82cb0d6a" alt="AWS Guide Breadcrumb" width="1373" height="739" data-path="images/aws-guide-14.png" />

Select the **Configure clusters** option and start adding your Kafka cluster configurations.

### Step 5: Onboard your team

Now that you have an up-and-running deployment of Console, it's time to invite your team!

* Configure SSO to easily onboard users
* Configure local users, if you are not using SSO

### Troubleshoot

<Accordion title="Can't access database or Console">
  You may need to add inbound rules. <br />
  For example, in the **security group** attached to the console service, ensure there is an inbound rule (TCP) for port **8080**.
  In the **security group** attached to the RDS instance, ensure an inbound rule (Type = PostgreSQL) for port **5432**.
</Accordion>

## Deploy on AWS CloudFormation

You can deploy Console using [AWS CloudFormation](https://aws.amazon.com/cloudformation/) <Icon icon="up-right-from-square" />.

This guide contains a brief overview of the marketplace listing architecture followed by the steps on how to deploy Console in your AWS environment with all the mandatory dependencies. It will deploy Conduktor as a Docker container on an ECS service with Fargate and configure it alongside a PostgreSQL database via RDS.

<Info>
  This Conduktor marketplace offering is [Community Edition](/guide/conduktor-in-production/manage-licenses/community-edition) and this guide is intended to help you get started. Additional configurations might be required to ensure your deployment is production ready.
</Info>

You can [download a template](https://conduktor-marketplace.s3.us-east-1.amazonaws.com/templates/full_template/conduktor-console_full-template-latest.yaml) <Icon icon="up-right-from-square" /> to use, just update it with your own values. This template is designed to be deployed in only a few clicks. You may, however, need to wait a few minutes for AWS to spin up the resources.

<Note>
  In this configuration, all the resources are on a public subnet. However, the DB instance is available on both private and public subnets. Keep this in mind as part of any security concerns for the database.
</Note>

<img src="https://mintcdn.com/conduktor/dKeHsjTOLvuHVG-Z/images/conduktor.ecs.png?fit=max&auto=format&n=dKeHsjTOLvuHVG-Z&q=85&s=83b24ea17c8540b9ff9aeaa32c007cac" alt="AWS Deployment" width="1266" height="910" data-path="images/conduktor.ecs.png" />

### Deployment steps

1. Visit the [Marketplace listing page](https://aws.amazon.com/marketplace/pp/prodview-xjv65ie5rjtxu) <Icon icon="up-right-from-square" />.

2. Select `View purchase options`.

   <img src="https://mintcdn.com/conduktor/QbWqOoz71x3C-Q82/images/aws-marketplace-1.png?fit=max&auto=format&n=QbWqOoz71x3C-Q82&q=85&s=9790bdb866eae4c4f5d3013beba17c87" alt="AWS Marketplace" width="1081" height="659" data-path="images/aws-marketplace-1.png" />

3. Accept the terms of service.

   <img src="https://mintcdn.com/conduktor/QbWqOoz71x3C-Q82/images/aws-marketplace-2.png?fit=max&auto=format&n=QbWqOoz71x3C-Q82&q=85&s=27b5a8dc74c33c0324ec5ae8c2742af3" alt="AWS Marketplace" width="3020" height="1919" data-path="images/aws-marketplace-2.png" />

4. Select `Continue to Configuration`.

   <img src="https://mintcdn.com/conduktor/QbWqOoz71x3C-Q82/images/aws-marketplace-3.png?fit=max&auto=format&n=QbWqOoz71x3C-Q82&q=85&s=4774f4611867d9ff334fb00d89222fa1" alt="AWS Marketplace" width="2950" height="1508" data-path="images/aws-marketplace-3.png" />

5. `Continue to Launch`. There is only one supported Software Version and fulfillment option available.

   <img src="https://mintcdn.com/conduktor/6deIvEKzfYjm4IId/images/aws-marketplace-4.png?fit=max&auto=format&n=6deIvEKzfYjm4IId&q=85&s=0eef68d2964f7ecd55f501b834f661e4" alt="AWS Marketplace" width="2936" height="1482" data-path="images/aws-marketplace-4.png" />

6. You now can choose how you want to deploy the CloudFormation template. We offer a quicklink that will take you directly to the CloudFormation console with the template pre-filled on your last previously used region (What this guide will be covering). We also offer the raw CloudFormation template that you can download and deploy manually. Select `Quick launch CloudFormation template`.

   <img src="https://mintcdn.com/conduktor/6deIvEKzfYjm4IId/images/aws-marketplace-5.png?fit=max&auto=format&n=6deIvEKzfYjm4IId&q=85&s=20596d04de06b98e2d33c1610d4f88f9" alt="AWS Marketplace" width="3001" height="2106" data-path="images/aws-marketplace-5.png" />

7. This will open you up to the CloudFormation page with the template pre-filled. Press `Next`.

   <img src="https://mintcdn.com/conduktor/6deIvEKzfYjm4IId/images/aws-marketplace-6.png?fit=max&auto=format&n=6deIvEKzfYjm4IId&q=85&s=40f52a633d3920fbd9e27bdeb4dc59a0" alt="AWS Marketplace" width="1898" height="835" data-path="images/aws-marketplace-6.png" />

8. You will then be given the option to change the stack name or any of the other default values from our template. You will need to provide values for the missing CIDR properties towards the bottom of the page. Once you are happy with the parameters, press `Next`.

   <Warning>
     The default value for the region is specified in the template as `eu-west-1a` (public subnet) and `eu-west-1b`(private subnet). If you're deploying in a different region, you have to update these values.
   </Warning>

   <img src="https://mintcdn.com/conduktor/6deIvEKzfYjm4IId/images/aws-marketplace-7.png?fit=max&auto=format&n=6deIvEKzfYjm4IId&q=85&s=d79e27b843e388b29d1f637eed3ba893" alt="AWS Marketplace" width="3024" height="3322" data-path="images/aws-marketplace-7.png" />

9. Configure your stack options and acknowledge that the CloudFormation template will create IAM resources and click **Next**.

   <img src="https://mintcdn.com/conduktor/6deIvEKzfYjm4IId/images/aws-marketplace-8.png?fit=max&auto=format&n=6deIvEKzfYjm4IId&q=85&s=f66dc31b344a03f1ef027b591b559e4b" alt="AWS Marketplace" width="1920" height="1759" data-path="images/aws-marketplace-8.png" />

10. You can then review the CloudFormation stack and then click **Submit**.

    <img src="https://mintcdn.com/conduktor/6deIvEKzfYjm4IId/images/aws-marketplace-9.png?fit=max&auto=format&n=6deIvEKzfYjm4IId&q=85&s=ba325c3d54e7ef3048e935ef96cad256" alt="AWS Marketplace" width="1920" height="2931" data-path="images/aws-marketplace-9.png" />

11. Wait for all resources to be created. This may take some time, about 10 minutes depending how quickly AWS deploys RDS.

    <img src="https://mintcdn.com/conduktor/QbWqOoz71x3C-Q82/images/aws-marketplace-10.png?fit=max&auto=format&n=QbWqOoz71x3C-Q82&q=85&s=99f77e97f8a0d2fadad1f17af3d277f1" alt="AWS Marketplace" width="2490" height="1300" data-path="images/aws-marketplace-10.png" />

12. From the **Resources** tab, click on `${AWS::StackName}-conduktor-ecs-cluster`. From **Cluster**, navigate to your newly created **Service** and then to the **Task**. Be sure to click on the links.

    <img src="https://mintcdn.com/conduktor/QbWqOoz71x3C-Q82/images/aws-marketplace-11.png?fit=max&auto=format&n=QbWqOoz71x3C-Q82&q=85&s=458ab93c839b163d2558490387e62092" alt="Alt Cluster" width="1716" height="990" data-path="images/aws-marketplace-11.png" />

    <img src="https://mintcdn.com/conduktor/QbWqOoz71x3C-Q82/images/aws-marketplace-12.png?fit=max&auto=format&n=QbWqOoz71x3C-Q82&q=85&s=bc24dda9855466b0c2d017c5a1ef648e" alt="Alt Service" width="3024" height="1766" data-path="images/aws-marketplace-12.png" />

    <img src="https://mintcdn.com/conduktor/QbWqOoz71x3C-Q82/images/aws-marketplace-13.png?fit=max&auto=format&n=QbWqOoz71x3C-Q82&q=85&s=1731672075a1bb10dc7d096ca4429598" alt="Alt Task" width="3024" height="1912" data-path="images/aws-marketplace-13.png" />

13. Find the `conduktor-console` Container and (not the *conduktor-console-cortex* one) and navigate to the **Network bindings** tab.

    <img src="https://mintcdn.com/conduktor/QbWqOoz71x3C-Q82/images/aws-marketplace-14.png?fit=max&auto=format&n=QbWqOoz71x3C-Q82&q=85&s=38785f3b34889ac3425eece73dd74bfd" alt="AWS Guide Breadcrumb" width="3024" height="3100" data-path="images/aws-marketplace-14.png" />

14. Click on the **External** link to open the Console application. In this example, our application is running at 54.155.197.172:8080.

    <img src="https://mintcdn.com/conduktor/QbWqOoz71x3C-Q82/images/aws-marketplace-15.png?fit=max&auto=format&n=QbWqOoz71x3C-Q82&q=85&s=f7d77164ed00f54e9182b86763f8820d" alt="AWS Guide Network Bindings" width="2392" height="262" data-path="images/aws-marketplace-15.png" />

### Access Conduktor

You will now be greeted with the create admin login. Create credentials and **make a note/save them** as they are for this instance. If lost, Conduktor cannot remotely reset these credentials.

From here, you can add additional local users if needed. When you're ready for a production level deployment, you'll want to connect to SSO for importing your organization's existing users and groups.

<img src="https://mintcdn.com/conduktor/Kbwb2r5-pp_mR-Oq/images/login.png?fit=max&auto=format&n=Kbwb2r5-pp_mR-Oq&q=85&s=278baea0e3ef6b1e3939f61c9b383991" alt="onboarding login" style={{width: "400px"}} width="531" height="576" data-path="images/login.png" />
