Untitled
unknown
terraform
a year ago
4.0 kB
25
Indexable
Never
provider "aws" { region = "us-east-2" } resource "aws_vpc" "vpc" { cidr_block = "10.0.0.0/16" enable_dns_support = true enable_dns_hostnames = true tags = { Name : "ECS VPC" } } resource "aws_internet_gateway" "igw" { vpc_id = aws_vpc.vpc.id } resource "aws_route" "aws_route" { route_table_id = aws_vpc.vpc.main_route_table_id gateway_id = aws_internet_gateway.igw.id destination_cidr_block = "0.0.0.0/0" } resource "aws_subnet" "public" { vpc_id = aws_vpc.vpc.id cidr_block = "10.0.0.0/20" } ### Security Group for ECS task resource "aws_security_group" "ecs_tasks" { name = "ecs-sg-task-demo" vpc_id = aws_vpc.vpc.id ingress { protocol = "tcp" from_port = 8080 to_port = 8080 cidr_blocks = ["0.0.0.0/0"] } ingress { from_port = 80 to_port = 80 protocol = "tcp" self = "false" cidr_blocks = ["0.0.0.0/0"] description = "Port 80" } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } } ### ECR resource "aws_ecr_repository" "main" { name = "java-demo" image_tag_mutability = "MUTABLE" } resource "aws_ecr_lifecycle_policy" "main" { repository = aws_ecr_repository.main.name policy = jsonencode({ rules = [{ rulePriority = 1 description = "keep last 2 images" action = { type = "expire" } selection = { tagStatus = "any" countType = "imageCountMoreThan" countNumber = 2 } }] }) } ## ECS Cluster resource "aws_ecs_cluster" "main" { name = "java-cluster-demo" } ## Task Definition resource "aws_ecs_task_definition" "main" { family = "java-task-demo" network_mode = "awsvpc" requires_compatibilities = ["FARGATE"] cpu = 256 memory = 512 execution_role_arn = aws_iam_role.ecs_task_execution_role.arn task_role_arn = aws_iam_role.ecs_task_role.arn container_definitions = jsonencode([{ name = "java-container-demo" image = "evaluator:latest" essential = true portMappings = [{ protocol = "tcp" containerPort = 8080 hostPort = 8080 }] }]) } resource "aws_iam_role" "ecs_task_role" { name = "java-ecsTaskRole" assume_role_policy = <<EOF { "Version": "2012-10-17", "Statement": [ { "Action": "sts:AssumeRole", "Principal": { "Service": "ecs-tasks.amazonaws.com" }, "Effect": "Allow", "Sid": "" } ] } EOF } resource "aws_iam_role" "ecs_task_execution_role" { name = "java-ecsTaskExecutionRole" assume_role_policy = <<EOF { "Version": "2012-10-17", "Statement": [ { "Action": "sts:AssumeRole", "Principal": { "Service": "ecs-tasks.amazonaws.com" }, "Effect": "Allow", "Sid": "" } ] } EOF } resource "aws_iam_role_policy_attachment" "ecs-task-execution-role-policy-attachment" { role = aws_iam_role.ecs_task_execution_role.name policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy" } ## Service Configuration resource "aws_ecs_service" "main" { name = "java-service-demo" cluster = aws_ecs_cluster.main.id task_definition = aws_ecs_task_definition.main.id desired_count = 1 deployment_minimum_healthy_percent = 50 deployment_maximum_percent = 200 launch_type = "FARGATE" platform_version = "LATEST" # scheduling_strategy = "REPLICA" network_configuration { security_groups = [aws_security_group.ecs_tasks.id] subnets = [aws_subnet.public.id] assign_public_ip = true } lifecycle { ignore_changes = [task_definition, desired_count] } }