Перенаправление эластичного бобового стебля с HTTP на HTTPS в Terraform

#amazon-web-services #terraform #amazon-elastic-beanstalk #amazon-elb

#Amazon-веб-сервисы #Terraform #amazon-Elastic-beanstalk #amazon-elb

Вопрос:

У нас есть бобовый стебель

 resource "aws_elastic_beanstalk_environment" 
  

и нам нужно, чтобы прослушиватель HTTP перенаправлял на HTTPS
сейчас, обычно вы просто создаете правило прослушивателя балансировки нагрузки (как предполагают ответы здесь) следующим образом

 resource "aws_lb_listener_rule" "redirect_http_to_https" {
  listener_arn = XXX
  action {
    type = "redirect"
    redirect {
      port        = "443"
      protocol    = "HTTPS"
      host        = "#{host}"
      path        = "/#{path}"
      query       = "#{query}"
      status_code = "HTTP_301"
    }
  }
  condition {}
}
  

Однако по каким-то причинам нам приходится использовать встроенный балансировщик нагрузки beanstalk, а не создавать наш собственный ресурс балансировщика нагрузки, и, как вы видите выше, я не вижу возможности настроить таргетинг на beanstalks-loadbalancers-listener.
Вместо этого я попытался изменить параметры настроек, чтобы настроить балансировщик нагрузки следующим образом

 setting {
    namespace = "aws:elbv2:listener:default"
    name      = "Rules"
    value     = "redirect"
  }
  setting {
    namespace = "aws:elbv2:listenerrule:redirect"
    name      = "Process"
    value     = "443"
  }
  setting {
    namespace = "aws:elbv2:listenerrule:redirect"
    name      = "Priority"
    value     = "1"
  }
  setting {
    namespace = "aws:elbv2:listener:443"
    name      = "Protocol"
    value     = "HTTPS"
  }
  

но ничего не вступает в силу. кто-нибудь делал это раньше? если нет, нам придется выполнить перенаправление на сервере, вероятно, в коде.

Это, конечно, очень просто в пользовательском интерфейсе, заняло у меня менее 2 минут, но в terraform это оказалось сложно

Комментарии:

1. Если вам удалось сделать это в консоли, и это работает, тогда обычный подход заключается в том, чтобы затем запустить план и посмотреть, что Terraform хочет отменить. Затем вы возвращаете эти изменения в Terraform, и план должен быть пустым. По какой-то причине это не работает для вас?

2. Я уже делал это, но не совсем так. Мой ответ на перенаправление выполняется nginx внутри экземпляра ec2, созданного с использованием файла ebextension. Я буду использовать ответ, чтобы предоставить вам код файла ebextension. Пожалуйста, не голосуйте против моего ответа, это потому, что здесь я не могу отправить форматированный код.

3. Проверьте этот ответ здесь: github.com/cloudposse/… Это сработало для меня

Ответ №1:

Я уже делал это не совсем так, но у нас это работает. Мой ответ на перенаправление выполняется nginx внутри экземпляров EC2, созданных с использованием файла ebextension.

 files:
  "/etc/nginx/conf.d/000_https_redirect.conf":
    mode: "000755"
    owner: root
    group: root
    content: |
      server {
        listen 80;
        return 301 https://$host$request_uri;
      }
  

Ответ №2:

Уже упоминается @jang00 в комментарии выше, но я думаю, что он заслуживает публикации явно:

 resource "aws_elastic_beanstalk_environment" "main" {
  name = var.environment
  application = aws_elastic_beanstalk_application.main.name
  solution_stack_name = data.aws_elastic_beanstalk_solution_stack.multi_container_docker.name

  setting {
    namespace = "aws:ec2:vpc"
    name = "VPCId"
    value = var.vpc_id
    resource = ""
  }

  setting {
    namespace = "aws:ec2:vpc"
    name = "Subnets"
    value = join(", ", [var.private_a_subnet_id, var.private_b_subnet_id])
    resource = ""
  }

  setting {
    namespace = "aws:ec2:vpc"
    name = "ELBSubnets"
    value = join(", ", [var.public_a_subnet_id, var.public_b_subnet_id])
    resource = ""
  }

  setting {
    namespace = "aws:autoscaling:launchconfiguration"
    name = "IamInstanceProfile"
    value = "${var.application_name}-service-elasticbeanstalk-instance-${var.environment}"
  }

  setting {
    namespace = "aws:autoscaling:launchconfiguration"
    name = "InstanceType"
    value = var.instance_type
  }

  setting {
    namespace = "aws:elasticbeanstalk:environment"
    name = "LoadBalancerType"
    value = "application"
  }

  setting {
    namespace = "aws:elasticbeanstalk:healthreporting:system"
    name = "SystemType"
    value = "enhanced"
  }

  setting {
    namespace = "aws:elbv2:listener:443"
    name = "ListenerEnabled"
    value = var.acm_eu_west_2.arn == "" ? "false" : "true"
  }

  setting {
    namespace = "aws:elbv2:listener:443"
    name = "Protocol"
    value = "HTTPS"
  }

  setting {
    namespace = "aws:elbv2:listener:443"
    name = "SSLCertificateArns"
    value = var.acm_eu_west_2.arn
  }
}

data "aws_lb_listener" "http_listener" {
  load_balancer_arn = aws_elastic_beanstalk_environment.main.load_balancers[0]
  port = 80
}

resource "aws_lb_listener_rule" "redirect_http_to_https" {
  listener_arn = data.aws_lb_listener.http_listener.arn
  priority = 1

  action {
    type = "redirect"

    redirect {
      port = "443"
      protocol = "HTTPS"
      status_code = "HTTP_301"
    }
  }

  condition {
    path_pattern {
      values = ["/*"]
    }
  }
}
  

Смотрите этот комментарий в репозитории terraform-aws-elastic-beanstalk-environment.