Untitled
unknown
terraform
2 years ago
4.0 kB
35
Indexable
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]
}
}
Editor is loading...