Skip to main content

AWS Setup

This guide walks you through preparing your AWS environment for EZ-CDC deployment.

Overview

EZ-CDC workers run in your AWS account and need:

  1. A VPC with private subnets
  2. NAT Gateway or VPC endpoints for outbound connectivity
  3. Security groups for network access control
  4. An IAM role for worker permissions

VPC Configuration

VPC Requirements

Your VPC must have:

  • DNS support and DNS hostnames enabled
  • At least 2 private subnets in different Availability Zones
  • NAT Gateway (or VPC endpoints) for outbound internet access
  • No inbound access required — workers only make outbound connections

Required VPC Settings

# DNS settings must be enabled
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
enable_dns_support = true # Required for endpoint resolution
enable_dns_hostnames = true # Required for private DNS
}

Subnet Requirements

Subnet TypePurposeInternet Access
PrivateWorker instancesVia NAT Gateway
PublicNAT GatewayDirect

NAT Gateway Setup

Workers in private subnets need NAT Gateway for outbound connectivity:

# Elastic IP for NAT
resource "aws_eip" "nat" {
domain = "vpc"
}

# NAT Gateway in public subnet
resource "aws_nat_gateway" "main" {
allocation_id = aws_eip.nat.id
subnet_id = aws_subnet.public.id
}

# Route table for private subnets
resource "aws_route_table" "private" {
vpc_id = aws_vpc.main.id

route {
cidr_block = "0.0.0.0/0"
nat_gateway_id = aws_nat_gateway.main.id
}
}

# Associate with private subnets
resource "aws_route_table_association" "private" {
subnet_id = aws_subnet.private.id
route_table_id = aws_route_table.private.id
}

Security Groups

Worker Security Group

Create a security group for EZ-CDC workers:

resource "aws_security_group" "ezcdc_worker" {
name = "ezcdc-worker"
description = "EZ-CDC Worker Agent security group"
vpc_id = aws_vpc.main.id

# NO INBOUND RULES - workers don't accept connections

# Outbound: HTTPS for control plane and S3
egress {
description = "HTTPS outbound"
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}

# Outbound: PostgreSQL (adjust CIDR to your source)
egress {
description = "PostgreSQL source"
from_port = 5432
to_port = 5432
protocol = "tcp"
security_groups = [aws_security_group.postgres.id]
}

# Outbound: StarRocks MySQL protocol
egress {
description = "StarRocks MySQL"
from_port = 9030
to_port = 9030
protocol = "tcp"
security_groups = [aws_security_group.starrocks.id]
}

# Outbound: StarRocks HTTP (Stream Load)
egress {
description = "StarRocks HTTP"
from_port = 8040
to_port = 8040
protocol = "tcp"
security_groups = [aws_security_group.starrocks.id]
}

tags = {
Name = "ezcdc-worker"
}
}

Database Security Groups

Allow workers to connect to your databases:

# PostgreSQL security group rule
resource "aws_security_group_rule" "postgres_from_worker" {
type = "ingress"
from_port = 5432
to_port = 5432
protocol = "tcp"
source_security_group_id = aws_security_group.ezcdc_worker.id
security_group_id = aws_security_group.postgres.id
description = "PostgreSQL from EZ-CDC workers"
}

# StarRocks security group rules
resource "aws_security_group_rule" "starrocks_mysql_from_worker" {
type = "ingress"
from_port = 9030
to_port = 9030
protocol = "tcp"
source_security_group_id = aws_security_group.ezcdc_worker.id
security_group_id = aws_security_group.starrocks.id
description = "StarRocks MySQL from EZ-CDC workers"
}

resource "aws_security_group_rule" "starrocks_http_from_worker" {
type = "ingress"
from_port = 8040
to_port = 8040
protocol = "tcp"
source_security_group_id = aws_security_group.ezcdc_worker.id
security_group_id = aws_security_group.starrocks.id
description = "StarRocks HTTP from EZ-CDC workers"
}

VPC Endpoints (Optional)

For PrivateLink deployments or to reduce NAT costs:

# S3 Gateway Endpoint (free, recommended)
resource "aws_vpc_endpoint" "s3" {
vpc_id = aws_vpc.main.id
service_name = "com.amazonaws.${var.region}.s3"
vpc_endpoint_type = "Gateway"
route_table_ids = [aws_route_table.private.id]
}

# SSM endpoints (for Session Manager access)
resource "aws_vpc_endpoint" "ssm" {
vpc_id = aws_vpc.main.id
service_name = "com.amazonaws.${var.region}.ssm"
vpc_endpoint_type = "Interface"
subnet_ids = [aws_subnet.private.id]
security_group_ids = [aws_security_group.vpce.id]
private_dns_enabled = true
}

resource "aws_vpc_endpoint" "ssmmessages" {
vpc_id = aws_vpc.main.id
service_name = "com.amazonaws.${var.region}.ssmmessages"
vpc_endpoint_type = "Interface"
subnet_ids = [aws_subnet.private.id]
security_group_ids = [aws_security_group.vpce.id]
private_dns_enabled = true
}

resource "aws_vpc_endpoint" "ec2messages" {
vpc_id = aws_vpc.main.id
service_name = "com.amazonaws.${var.region}.ec2messages"
vpc_endpoint_type = "Interface"
subnet_ids = [aws_subnet.private.id]
security_group_ids = [aws_security_group.vpce.id]
private_dns_enabled = true
}

Verification

After setup, verify your configuration:

1. Check VPC DNS Settings

aws ec2 describe-vpc-attribute \
--vpc-id vpc-xxxxx \
--attribute enableDnsSupport

aws ec2 describe-vpc-attribute \
--vpc-id vpc-xxxxx \
--attribute enableDnsHostnames

Both should return true.

2. Check NAT Gateway

aws ec2 describe-nat-gateways \
--filter Name=vpc-id,Values=vpc-xxxxx

Should show state available.

3. Check Route Tables

aws ec2 describe-route-tables \
--filters Name=vpc-id,Values=vpc-xxxxx

Private subnets should route 0.0.0.0/0 to NAT Gateway.

Next Steps

With AWS configured:

  1. Create IAM Role - Set up permissions
  2. Create Deployment - Launch workers