diff --git a/terraform/deploy.tf b/terraform/deploy.tf new file mode 100644 index 00000000..95ad8aae --- /dev/null +++ b/terraform/deploy.tf @@ -0,0 +1,218 @@ +variable "task_role_arn" {} +variable "execution_role_arn" {} +variable "ecs_cluster" {} +variable "service_registry" {} + +variable "http_listener_sg" { +default = "sg-0024906e0e1f78048" +} + +variable "lb_subnets" { +default = [ "subnet-16161a39", "subnet-323deb78", "subnet-44c2774b", "subnet-5e675761", "subnet-8519fde2", "subnet-89bab8d4", ] +} +resource "aws_ecs_task_definition" "integreat_app" { + + family = "integreat_app_${var.stage}" + container_definitions = file("${var.stage}-taskdef.json") + memory = 4096 + cpu = 2048 + network_mode = "awsvpc" + requires_compatibilities = ["FARGATE"] + execution_role_arn = "${var.execution_role_arn}" + task_role_arn = "${var.task_role_arn}" +} + +resource "aws_ecs_service" "integreat_app" { + name = "integreat_app_${var.stage}" + cluster = "${var.ecs_cluster}" + task_definition = aws_ecs_task_definition.integreat_app.arn + desired_count = 1 + health_check_grace_period_seconds = 600 + deployment_controller { + type = "ECS" + } + scheduling_strategy = "REPLICA" + launch_type = "FARGATE" + platform_version = "LATEST" + + network_configuration { + assign_public_ip = true + security_groups = [ "sg-004e5855310c453a3", "sg-02d167406b1082698"] + subnets = [ "subnet-5e675761", "subnet-8519fde2", "subnet-89bab8d4" ] + } + + load_balancer { + target_group_arn = aws_lb_target_group.integreat_app.arn + container_name = "integreat-app" + container_port = 3000 + } + service_registries { + container_port = 0 + port = 0 + registry_arn = "${var.service_registry}" + } + + timeouts {} +} + +resource "aws_lb" "integreat_app" { + name = "integreat-app-${var.stage}" + internal = false + load_balancer_type = "application" + security_groups = ["${var.http_listener_sg}"] + subnets = var.lb_subnets + ip_address_type = "ipv4" + enable_deletion_protection = true +} + +resource "aws_lb_target_group" "integreat_app" { + name = "integreat-app-${var.stage}" + port = 80 + protocol = "HTTP" + vpc_id = "vpc-b5b7d6ce" + deregistration_delay = 120 + load_balancing_algorithm_type = "round_robin" + slow_start = 0 + tags = {} + target_type = "ip" + health_check { + enabled = true + healthy_threshold = 2 + interval = 15 + matcher = "200" + path = "/api/health-check" + port = "traffic-port" + protocol = "HTTP" + timeout = 5 + unhealthy_threshold = 2 + } + + stickiness { + cookie_duration = 86400 + enabled = false + type = "lb_cookie" + } +} + +resource "aws_lb_listener" "http" { + load_balancer_arn = aws_lb.integreat_app.arn + port = 80 + protocol = "HTTP" + + default_action { + order = 1 + type = "redirect" + + redirect { + host = "#{host}" + path = "/#{path}" + port = "443" + protocol = "HTTPS" + query = "#{query}" + status_code = "HTTP_301" + } + } + + timeouts {} +} + +resource "aws_lb_listener" "https" { + certificate_arn = aws_acm_certificate.cert.arn + load_balancer_arn = aws_lb.integreat_app.arn + port = 443 + protocol = "HTTPS" + ssl_policy = "ELBSecurityPolicy-2016-08" + + default_action { + order = 1 + target_group_arn = aws_lb_target_group.integreat_app.arn + type = "forward" + } + + timeouts {} +} + +resource "aws_lb_listener_rule" "static" { + listener_arn = aws_lb_listener.https.arn + priority = 1 + + action { + order = 1 + type = "redirect" + + redirect { + host = "s3.amazonaws.com" + path = "/${var.domain}/#{path}" + port = "443" + protocol = "HTTPS" + status_code = "HTTP_301" + } + } + + condition { + + path_pattern { + values = [ + "/css/*", + "/finance-font/*", + "/img/*", + "/js/compiled/app.js", + "index.html", + ] + } + } +} + +resource "aws_s3_bucket" "static" { + bucket = "${var.domain}" + request_payer = "BucketOwner" + tags = {} + cors_rule { + allowed_headers = [ + "*", + ] + allowed_methods = [ + "PUT", + "POST", + "DELETE", + "GET", + ] + allowed_origins = [ + "${var.base_url}", + ] + expose_headers = [] + max_age_seconds = 0 + } + + versioning { + enabled = false + mfa_delete = false + } + + website { + index_document = "index.html" + } + + policy = <