#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.