AWS Elastic Beanstalk负载均衡器在哪里寻找认证?

时间:2016-04-06 09:22:18

标签: amazon-web-services elastic-beanstalk aws-certificate-manager

我正在设置AWS Elastic Beanstalk应用程序,我希望它的流量为HTTPS。

我创建了一个与beanstalk网址匹配的DNS CNAME记录,并在AWS Certificate Manager中创建并批准了该DNS名称的证书。

现在我去了Elastic Beanstalk环境 - >配置 - >网络层/负载均衡器(下图)为了将“安全监听端口”从OFF设置为443并选择我的证书。

但我的证书不适合选择! 所以我的问题是如何将我的证书或证书纳入选择列表,或者这是AWS中的错误?

Elastic Beanstock Listener configuration

注意 - 我在转到EC2 / Load平衡器时能够看到我的证书,并且能够将负载均衡器从HTTP更改为HTTPS并在那里选择我的证书。 但这并没有反映出仍然显示端口80的Elastic Beanstalk负载均衡器配置。对beanstalk使用HTTPS并不是这样的。

帮助!

2 个答案:

答案 0 :(得分:1)

通过控制台,目前无法将您在证书管理器中创建的证书分配给Beanstalk环境。

为了实现此目的,您需要使用AWS CLI。我能够做到这一点,幸运的是,这很容易。

简而言之,您需要:

  • 创建一个elb-acm.json文件并将其放在Web根目录中的某个位置。我将思想直接放在我的应用程序的Web根目录中。
  • 转到证书管理员并获取证书的arn ID
  • 使用update environment命令将证书应用于您的环境

aws elasticbeanstalk update-environment --environment-name Your-Environment --option-settings file://PATH-TO-JSON/elb-acm.json

对我而言,路径只是file://elb-ecm.json,因为(我相信原因是因为)我在网络根目录中运行命令而文件位于同一目录This article goes into detail中(并且为我)。祝你好运!

请注意,尽管可以,但您不应直接通过Load Balancer控制台(EC2> Load Balancers)分配证书,因为每当您重建Beanstalk环境时,负载均衡器都会被吹走并重新创建。

此外,在将其应用到Beanstalk环境之前,请确保已按照自己的意愿设置证书。例如,如果您希望* .mydomain.com和裸mydomain.com都是安全的,请确保首先完全配置,因为一旦您运行这些命令,没有简单的方法将您的证书与您的环境“取消关联” (如果我在这种情况下没有弄错的话,你基本上需要完全终止你的环境并创建一个新环境。)

此外,您需要在应用中设置一些重定向代码,以便在您设置证书后对任何非安全请求执行301重定向。要执行重定向,您需要在传入请求中查找X-Forwarded-Proto标头。如果它不安全,您应该重定向到安全端口。例如,以下是我的应用程序代码的外观:

// in production, only allow secure requests (https)
public function performSecureRedirect(rc) {

    // based on domain comparison
    var isLive = myEnvironmentData.isLive;

    // setting up the health check url is important for smooth beanstalk deployments
    // beanstalk issues this healthcheck request via a non-secure port
    var isAmazonHealthcheckUrl = rc.event eq "system.healthcheck";

    if (isLive and not isAmazonHealthcheckUrl) {

        var headerData = getHTTPRequestData().headers;

        // x-forwarded-proto is a special header
        // setup by Amazon ELB (Elastic Load Balancer)
        var requestProtocol = getHttpRequestData().headers['x-forwarded-proto'];
        var isSecureRequest = requestProtocol eq "https";

        if (not isSecureRequest) {

            location("https://" & cgi.server_name & cgi.path_info, false, 301);

        }

    }

}

答案 1 :(得分:0)

Brian FitzGerald和this blog的答案帮助我找到了一种简单的方法(在Elastic beanstalk负载均衡器上设置https并为其使用CRM证书)。

使用AWS Elastic Beanstalk CLI eb )简化解决方案。正确设置环境后,可以使用eb config命令。 打开编辑窗口时,向下滚动到aws:elb:loadbalancer部分。

将负载均衡器部分修改为(在我的情况下,我完全删除了端口80,您可能希望保留它):

  aws:elb:loadbalancer:
    CrossZone: 'true'
    LoadBalancerHTTPPort: 'OFF'
    LoadBalancerHTTPSPort: '443'
    LoadBalancerPortProtocol: HTTP
    LoadBalancerSSLPortProtocol: HTTPS
    SSLCertificateId: PLACE HERE THE CRM CERTIFICATE ARN
    SecurityGroups: '{"Fn::GetAtt":["AWSEBLoadBalancerSecurityGroup","GroupId"]},{"Ref":"AWSEBLoadBalancerSecurityGroup"}'

可以在AWS>中找到证书的arn。证书经理。 打开证书并复制ARN号码(在右下角)。

我保存了配置,等待环境得到更新,就是这样。