provider "aws" { region = var.region default_tags { tags = { Project = "semantic-search-aws-docs" } } } ### Networking ### resource "aws_vpc" "aws-vpc" { cidr_block = var.vpc_cidr enable_dns_hostnames = true # Required for DNS-based service discovery enable_dns_support = true # Required for DNS-based service discovery tags = { name = "NLPSearchVPC" } } resource "aws_subnet" "private" { vpc_id = aws_vpc.aws-vpc.id count = length(var.private_subnets) cidr_block = element(var.private_subnets, count.index) availability_zone = element(var.availability_zones, count.index) tags = { Name = "NLPSearchPrivateSubnet" Tier = "Private" } } resource "aws_subnet" "public" { vpc_id = aws_vpc.aws-vpc.id cidr_block = element(var.public_subnets, count.index) availability_zone = element(var.availability_zones, count.index) count = length(var.public_subnets) map_public_ip_on_launch = true tags = { Name = "NLPSearchPublicSubnet" Tier = "Public" } } resource "aws_internet_gateway" "main" { vpc_id = aws_vpc.aws-vpc.id } resource "aws_route_table" "public" { vpc_id = aws_vpc.aws-vpc.id route { cidr_block = "0.0.0.0/0" gateway_id = aws_internet_gateway.main.id } } resource "aws_route_table_association" "public" { count = length(var.public_subnets) subnet_id = element(aws_subnet.public.*.id, count.index) route_table_id = aws_route_table.public.id } resource "aws_alb" "main" { name = "nlp-search-alb" internal = false load_balancer_type = "application" subnets = aws_subnet.public.*.id security_groups = [aws_security_group.alb.id] } resource "aws_lb_target_group" "search_ui" { name = "nlp-search-alb-target-group" port = 8501 protocol = "HTTP" target_type = "ip" vpc_id = aws_vpc.aws-vpc.id health_check { protocol = "HTTP" healthy_threshold = "3" interval = "30" matcher = "200" timeout = "10" path = "/" unhealthy_threshold = "2" } } resource "aws_lb_listener" "search_ui" { load_balancer_arn = aws_alb.main.id port = "80" protocol = "HTTP" default_action { type = "forward" target_group_arn = aws_lb_target_group.search_ui.id } } resource "aws_eip" "nat_gw" { domain = "vpc" depends_on = [aws_internet_gateway.main] } resource "aws_nat_gateway" "main" { allocation_id = aws_eip.nat_gw.id subnet_id = element(aws_subnet.public.*.id, 0) depends_on = [aws_internet_gateway.main] } resource "aws_route_table" "private" { vpc_id = aws_vpc.aws-vpc.id route { cidr_block = "0.0.0.0/0" nat_gateway_id = aws_nat_gateway.main.id } } resource "aws_route_table_association" "private" { count = length(var.private_subnets) subnet_id = element(aws_subnet.private.*.id, count.index) route_table_id = aws_route_table.private.id } ### Logs ### resource "aws_cloudwatch_log_group" "app" { name = "/semantic-search" retention_in_days = 30 } ### IAM ### resource "aws_iam_role" "search_ui" { name = "NLPSearchSearchUIECSTaskRole" assume_role_policy = <> /etc/ecs/ecs.config echo ECS_ENABLE_CONTAINER_METADATA=true >> /etc/ecs/ecs.config echo ECS_ENABLED_GPU_SUPPORT=true >> /etc/ecs/ecs.config EOF ) } ### ECS Tasks and Services ### resource "aws_ecs_service" "search_ui" { name = "search_ui" cluster = aws_ecs_cluster.main.id task_definition = aws_ecs_task_definition.search_ui.arn desired_count = 1 launch_type = "FARGATE" network_configuration { subnets = aws_subnet.private.*.id security_groups = [aws_security_group.search_ui.id] } load_balancer { target_group_arn = aws_lb_target_group.search_ui.arn container_name = "search-ui" container_port = 8501 } depends_on = [aws_lb_listener.search_ui, docker_registry_image.search_ui] } resource "aws_ecs_task_definition" "search_ui" { family = "search-ui" container_definitions = <