将 AWS Certificate Manager(ACM 证书)与 Elastic Beanstalk 结合使用

Using AWS Certificate Manager (ACM Certificate) with Elastic Beanstalk

当您拥有通过 AWS Certificate Manager 为您的域颁发的证书时,如何将该证书应用于 Elastic Beanstalk 应用程序。

是的,Elastic Beanstalk 应用程序是负载平衡的,并且确实有与之关联的 ELB。

我知道我可以直接将它应用到我自己的 ELB 上。但是我想通过 Elastic Beanstalk 应用它,所以环境配置被保存到 Cloud Formation 模板中。

我发现,你不能通过 elastic beantalk 控制台来做(至少现在不能)。但是,您仍然可以通过 eb cli 或 aws cli 进行设置。

使用 EB CLI

基本上我们要做的是更新 aws:elb:listener 设置,您可以在 general options 文档中查看可能的设置。

使用 EB CLI 非常简单。假设我们已经为我们的项目设置了 awsebcli 工具,我们可以使用 eb config 命令。

它将打开您的默认终端编辑器,并允许您更改以 YAML 文件形式编写的设置。当您进行更改并保存时,eb config cmd 将自动更新您的 Elastic Beanstalk 环境的设置。

您需要将以下设置添加到您的配置文件中:

aws:elb:listener:443:
  InstancePort: '80'
  InstanceProtocol: HTTP
  ListenerEnabled: 'true'
  ListenerProtocol: HTTPS
  PolicyNames: null
  SSLCertificateId: CERTIFICATE_ARN_HERE

CERTIFICATE_ARN_HERE 的值更改为您的 AMC 证书 ARN。您可以在 AWS Certificate Manager 控制台中找到它:

重要提示:您的 aws:elb:listener:443 设置 必须 置于 aws:elb:listener:80 设置之上。否则环境配置更新会报错


使用 AWS CLI

可以通过 update-environment 命令使用通用 aws cli 工具完成同样的操作。

aws elasticbeanstalk update-environment \
--environment-name APPLICATION_ENV --option-settings \
Namespace=aws:elb:listener:443,OptionName=InstancePort,Value=80 \
Namespace=aws:elb:listener:443,OptionName=InstanceProtocol,Value=HTTP \
Namespace=aws:elb:listener:443,OptionName=ListenerProtocol,Value=HTTPS \
Namespace=aws:elb:listener:443,OptionName=SSLCertificateId,Value=CERTIFICATE_ARN_HERE

注意:当您通过上述任一方法更新它时,Elastic Beanstalk 控制台不会将 HTTPS 显示为已启用。但是负载均衡器会,它也会应用于 Cloudformation 模板,并保存到 EB 的配置中。

我发现最简单的方法是通过用户控制台更改 EB 负载均衡器。单击更改并 select 新的 ACM 证书。

查看EB配置时不会出现,但会设置

您完全可以使用 CloudFormation 来做到这一点;然而,在 Elastic Beanstalk 中似乎很常见,配置选项在文档中比在组成 Elastic Beanstalk 的各个组件中更难找到。信息在这里:

http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/command-options-general.html#command-options-general-elbloadbalancer

但基本上您需要做的是将证书的创建添加到您的模板中,然后在 OptionSettings 中引用它 AWS::ElasticBeanstalk::ConfigurationTemplate:

"Certificate" : {
      "Type": "AWS::CertificateManager::Certificate",
      "Properties": {
        "DomainName": "example.com",
      }
    },
// ...
"ElasticbeanstalkTemplate": {
      "Type": "AWS::ElasticBeanstalk::ConfigurationTemplate",
      "Properties": {
        "SolutionStackName": "MyEBStack",
        "ApplicationName": "MyAppName",
        "Description": "",
        "OptionSettings": [{
          "Namespace": "aws:elb:listener:443",
          "OptionName": "InstancePort",
          "Value": "80"
        }, {
          "Namespace": "aws:elb:listener:443",
          "OptionName": "InstanceProtocol",
          "Value": "HTTP"
        }, {
          "Namespace": "aws:elb:listener:443",
          "OptionName": "ListenerProtocol",
          "Value": "HTTPS"
        }, {
          "Namespace": "aws:elb:listener:443",
          "OptionName": "SSLCertificateId",
          "Value": {
            "Ref": "Certificate"
          }
        }, /*More settings*/]

检查您在哪个区域创建了证书,以及它是否与 Elastic Beanstalk 区域相匹配。我把它们放在不同的区域,所以没用。