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 } }