将 AWS Certificate Manager(ACM 证书)与 Elastic Beanstalk 一起使用

Posted

技术标签:

【中文标题】将 AWS Certificate Manager(ACM 证书)与 Elastic Beanstalk 一起使用【英文标题】:Using AWS Certificate Manager (ACM Certificate) with Elastic Beanstalk 【发布时间】:2016-05-12 09:09:48 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

我发现,您无法通过弹性 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 cli 尝试过,并通过在 .ebextensions 下添加配置文件,它总是说“找不到密钥的服务器证书......”egscr.com/JpcAa8 @Max 您没有在 .ebextensions 文件夹中添加配置文件。当您创建更改时,eb cli 将下载配置文件并将其重新上传回弹性 beanstalk。 IT 与添加 ebextension 不同。 @KirillFuchs 使用 AWS CLI 选项,ec2 的语法是否相同? @Jeboy 不,直接将其添加到负载均衡器的命令会有所不同。 @Jordan 如果更新没有出错,那么你们都很好:)。但我应该注意,您现在可以通过控制台将 ACM 证书添加到弹性 beanstalk。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

您可以完全使用 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*/]

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于将 AWS Certificate Manager(ACM 证书)与 Elastic Beanstalk 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AWS Opsworks App 上使用在 AWS Certificate Manager 上购买的证书?

AWS Certificate Manager 和 Elastic Beanstalk:创建没有域名的 SSL

AWS Certificate Manager 中处于待处理状态的证书

AWS Certificate Manager,无法获取子域的 https

AWS Certificate Manager - SSL 说正在使用,但 HTTPS 不起作用

用于 ELB 的 AWS Certificate Manager 指向在 EC2 上运行的 Apache 服务器