shoc-backend/terraform/elastic_beanstalk.tf
Adam Moussa 25c2e84e8f feat(terraform): adopt live deployment roles safely
Add import-only dev and staging state with least-privilege HCP authentication and plan safety guards.
2026-08-28 19:12:34 -04:00

234 lines
5.4 KiB
HCL

resource "aws_elastic_beanstalk_application" "api" {
name = var.eb_application_name
description = "SHOC API ${var.environment} (Terraform). Parallel to live shoc-backend during the POC."
tags = {
Name = var.eb_application_name
}
depends_on = [terraform_data.account_guard]
}
resource "aws_elastic_beanstalk_environment" "api" {
name = var.eb_environment_name
application = aws_elastic_beanstalk_application.api.name
solution_stack_name = data.aws_elastic_beanstalk_solution_stack.dotnet.name
tier = "WebServer"
cname_prefix = var.eb_environment_name
wait_for_ready_timeout = "40m"
setting {
namespace = "aws:elasticbeanstalk:environment"
name = "EnvironmentType"
value = "LoadBalanced"
}
setting {
namespace = "aws:elasticbeanstalk:environment"
name = "LoadBalancerType"
value = "application"
}
setting {
namespace = "aws:elasticbeanstalk:environment"
name = "ServiceRole"
value = data.aws_iam_role.eb_service.arn
}
setting {
namespace = "aws:ec2:vpc"
name = "VPCId"
value = var.vpc_id
}
setting {
namespace = "aws:ec2:vpc"
name = "Subnets"
value = join(",", var.private_subnet_ids)
}
setting {
namespace = "aws:ec2:vpc"
name = "ELBSubnets"
value = join(",", var.public_subnet_ids)
}
setting {
namespace = "aws:ec2:vpc"
name = "ELBScheme"
value = "public"
}
setting {
namespace = "aws:ec2:vpc"
name = "AssociatePublicIpAddress"
value = var.associate_public_ip ? "true" : "false"
}
setting {
namespace = "aws:autoscaling:launchconfiguration"
name = "IamInstanceProfile"
value = aws_iam_instance_profile.eb_ec2.name
}
setting {
namespace = "aws:autoscaling:launchconfiguration"
name = "InstanceType"
value = var.eb_instance_type
}
setting {
namespace = "aws:autoscaling:launchconfiguration"
name = "SecurityGroups"
value = aws_security_group.eb.id
}
setting {
namespace = "aws:autoscaling:launchconfiguration"
name = "DisableIMDSv1"
value = "true"
}
setting {
namespace = "aws:autoscaling:asg"
name = "MinSize"
value = "1"
}
setting {
namespace = "aws:autoscaling:asg"
name = "MaxSize"
value = "1"
}
setting {
namespace = "aws:elbv2:loadbalancer"
name = "SecurityGroups"
value = aws_security_group.alb.id
}
setting {
namespace = "aws:elbv2:loadbalancer"
name = "ManagedSecurityGroup"
value = aws_security_group.alb.id
}
setting {
namespace = "aws:elbv2:listener:443"
name = "Protocol"
value = "HTTPS"
}
setting {
namespace = "aws:elbv2:listener:443"
name = "SSLCertificateArns"
value = aws_acm_certificate_validation.api.certificate_arn
}
setting {
namespace = "aws:elbv2:listener:443"
name = "SSLPolicy"
value = "ELBSecurityPolicy-TLS13-1-2-2021-06"
}
setting {
namespace = "aws:elbv2:listener:80"
name = "Protocol"
value = "HTTP"
}
setting {
namespace = "aws:elasticbeanstalk:environment:process:default"
name = "HealthCheckPath"
value = "/swagger/v1/swagger.json"
}
setting {
namespace = "aws:elasticbeanstalk:environment:process:default"
name = "Port"
value = "80"
}
setting {
namespace = "aws:elasticbeanstalk:application:environment"
name = "ASPNETCORE_ENVIRONMENT"
value = "Production"
}
setting {
namespace = "aws:elasticbeanstalk:application:environment"
name = "ConnectionStrings__DefaultConnection"
value = local.connection_string
}
setting {
namespace = "aws:elasticbeanstalk:application:environment"
name = "JWT__Secret"
value = aws_secretsmanager_secret_version.jwt.secret_string
}
setting {
namespace = "aws:elasticbeanstalk:application:environment"
name = "SendGrid__ApiKey"
value = var.sendgrid_api_key
}
setting {
namespace = "aws:elasticbeanstalk:application:environment"
name = "WorkOrderWebhook__Enabled"
value = "true"
}
setting {
namespace = "aws:elasticbeanstalk:application:environment"
name = "WorkOrderWebhook__Region"
value = var.aws_region
}
setting {
namespace = "aws:elasticbeanstalk:application:environment"
name = "WorkOrderWebhook__SecretId"
value = aws_secretsmanager_secret.webhook.arn
}
setting {
namespace = "aws:elasticbeanstalk:application:environment"
name = "Sync__Enabled"
value = "false"
}
setting {
namespace = "aws:elasticbeanstalk:application:environment"
name = "WorkOrderReconciliation__Enabled"
value = "false"
}
setting {
namespace = "aws:elasticbeanstalk:command"
name = "DeploymentPolicy"
value = "AllAtOnce"
}
tags = {
Name = var.eb_environment_name
}
depends_on = [
aws_iam_role_policy_attachment.eb_web_tier,
aws_iam_instance_profile.eb_ec2,
aws_db_instance.poc,
]
}
resource "aws_route53_record" "api" {
zone_id = var.hosted_zone_id
name = var.domain_name
type = "A"
alias {
name = aws_elastic_beanstalk_environment.api.cname
zone_id = data.aws_elastic_beanstalk_hosted_zone.current.id
evaluate_target_health = true
}
}