当前位置: 首页 > 知识库问答 >
问题:

如何使用CloudFormation为弹性Beanstalk环境别名域名?

符国安
2023-03-14

将子域名别名到弹性Beanstalk环境ELBs的正确路由配置是什么?

我已将Amazon Route 53托管区域ID表中的HostedZoneIds复制到映射:

"Beanstalk2Route53HostedZoneId" : {
  "us-east-1"      : { "HostedZoneId": "Z117KPS5GTRQ2G" },
  "us-west-1"      : { "HostedZoneId": "Z1LQECGX5PH1X" },
  "us-west-2"      : { "HostedZoneId": "Z38NKT9BP95V3O" },
  "eu-west-1"      : { "HostedZoneId": "Z2NYPWQ7DFZAZH" },
  "eu-central-1"   : { "HostedZoneId": "Z1FRNW7UH4DEZJ" },
  "ap-northeast-1" : { "HostedZoneId": "Z1R25G3KIG2GBW" },
  "ap-northeast-2" : { "HostedZoneId": "Z3JE5OI70TWKCP" },
  "ap-southeast-1" : { "HostedZoneId": "Z16FZ9L249IFLT" },
  "ap-southeast-2" : { "HostedZoneId": "Z2PCDNR3VC2G1N" },
  "sa-east-1"      : { "HostedZoneId": "Z10X7K2B4QSOFV" }
}

我的资源有两个豆茎环境:

"MyBeanstalkConfig": {
  "Type": "AWS::ElasticBeanstalk::ConfigurationTemplate",
  "Properties": {
    "OptionSettings": {
      { "Namespace": "aws:elb:listener:80", "OptionName": "ListenerEnabled", "Value" : "false" },
      { "Namespace": "aws:elb:listener:443", "OptionName": "ListenerEnabled", "Value" : "true" },
      { "Namespace": "aws:elb:listener:443", "OptionName": "InstancePort", "Value" : "8081" },
      { "Namespace": "aws:elb:listener:443", "OptionName": "ListenerProtocol", "Value" : "HTTPS" },
      { "Namespace": "aws:elb:listener:443", "OptionName": "SSLCertificateId", "Value" : "arn:aws:iam::[accountNbr]:server-certificate/example-cert-name" },
      [...]
    }
  }
},

"MyStageBeanstalkEnv": {
  "Type": "AWS::ElasticBeanstalk::Environment",
  "Properties": {
    "Description": "Stage Environment",
    "TemplateName": { "Ref": "MyBeanstalkConfig" },
    [...]
  }
},

"MyProdBeanstalkEnv": {
  "Type": "AWS::ElasticBeanstalk::Environment",
  "Properties": {
    "Description": "Production Environment",
    "TemplateName": { "Ref": "MyBeanstalkConfig" },
    [...]
  }
},

输出:

"StageEndpoint" : {
  "Description" : "endpoint of the stage environment",
  "Value" : { "Fn::GetAtt" : [ "MyStageBeanstalkEnv", "EndpointURL" ] }
},
"ProdEndpoint" : {
  "Description" : "endpoint of the production environment",
  "Value" : { "Fn::GetAtt" : [ "MyProdBeanstalkEnv", "EndpointURL" ] }
}

阶段和prod Beanstrk环境都在工作,即它们响应对MyStageBeanstalgEnv.eu-west-1.elasticbeanstalk.com的调用,以及由{"Fn::GetAtt"返回的endpoint:["MyStageBeanstalgEnv","Endpoint URL"]}(看起来像awseb-[abc-123-xyz].eu-west-1.elb.amazonaws.com)。毫不奇怪,证书是无效的,因为它期望域名是stage.example.comprod.example.com

现在我尝试添加Route 53配置:

"ExampleDomainHostedZone": {
  "Type" : "AWS::Route53::HostedZone",
  "Properties" : {
    "Name" : "example.com"
  }
},

"ExampleDomainRecordSetGroup" : {
  "Type" : "AWS::Route53::RecordSetGroup",
  "Properties" : {
    "HostedZoneId" : { "Ref": "ExampleDomainHostedZone" },
    "RecordSets" : [{
      "AliasTarget" : {
        "DNSName" : { "Fn::GetAtt" : ["MyStageBeanstalkEnv", "EndpointURL"] },
        "EvaluateTargetHealth" : false,
        "HostedZoneId" : { "Fn::FindInMap" : [ "Beanstalk2Route53HostedZoneId", {"Ref" : "AWS::Region"}, "HostedZoneId" ]}
      },
      "Name" : "stage.example.com",
      "Type": "A"
    },
    {
      "AliasTarget" : {
        "DNSName" : { "Fn::GetAtt" : ["MyProdBeanstalkEnv", "EndpointURL"] },
        "EvaluateTargetHealth" : false,
        "HostedZoneId" : { "Fn::FindInMap" : [ "Beanstalk2Route53HostedZoneId", {"Ref" : "AWS::Region"}, "HostedZoneId" ]}
      },
      "Name" : "prod.example.com",
      "Type": "A"
    }]
  }
},

当我尝试更新云形成堆栈时,我在AWS控制台中得到以下错误:

16:12:00 UTC 0200CREATE_FAILEDAWS::Route53::RecordSetGroup示例DomainRecordSetGroup尝试创建目标awseb-[abc-123-xyz]的别名。eu-west-1.elb.amazonaws.com.,Z2NYPWQ7DFZAZH区域中的类型A,但别名目标名称不位于目标区域

评论:

  • 我已成功地按照在Amazon Route 53中添加别名资源记录集的说明,在AWS控制台中将Route 53别名资源记录设置到相同的Beanstalk环境,因此“只是”将这些配置步骤转移到CloudFormation模板的问题。

共有3个答案

易宣
2023-03-14

有2种方法可以通过别名从Route53连接到弹性豆茎:

  1. 使用ElasticBeanstalkendpoint,例如foobar.u8k2abcm4.eu-central-1.ElasticBeanstalk.com/

“Fn::GetAtt”:[“BeanstalkEnvironment”,“EndpointURL”]返回的值是LoadBalancerendpoint(docs),因此必须使用LoadBalancer映射表,请参见此处(而不是ElasticBeanstalk的映射表)。

不确定它是否/如何在ElasticBeanstrok Env负载不平衡的情况下工作。

沈永贞
2023-03-14

我对CloudFront的Route53别名也有同样的问题。我构建了HostedZOneId映射,但它从未对我起作用,通过搜索AWS文档,我发现:

托管区域ID。

对于负载均衡器,请使用负载均衡器的规范托管区域ID。

对于Amazon S3,请使用存储桶的网站终结点的托管区域ID。

对于CloudFront,请使用Z2FDTNDAQYW2。

有关其他服务的托管区域ID的列表,请参阅AWS区域和endpoint中的相关服务。

所以我就硬编码了:

"AliasTarget": {
    "HostedZoneId": "Z2FDTNDATAQYW2",
    "DNSName": {
        "Fn::GetAtt": ["MyCloudFrontDistribution", "DomainName"]
    }
}

http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-aliastarget.html

双俊人
2023-03-14

一些谷歌用户暗示(1,2)在配置别名时不能使用Amazon Route 53托管的区域ID。声明eu-west-1具有elasticbeanstalk.eu-west-1.amazonaws.comendpoint的托管区域IDZ2NYPWQ7DFZAZH。但是,当使用AWS CLI仔细检查Beanstalk实际生成的ELB配置时,我发现:

$ aws elb describe-load-balancers --region eu-west-1
{
    "LoadBalancerDescriptions": [
        {
            [...]
            "CanonicalHostedZoneNameID": "Z3NF1Z3NOM5OY2",
            "CanonicalHostedZoneName": "awseb-[abc-123-xyz].eu-west-1.elb.amazonaws.com",
        }
    ]
}

换句话说,托管区域名称id不同。此外,CanonicalHostedZoneName等于AliasTarget中的DNSName,即awseb-[abc-123-xyz].eu-west-1.elb.amazonaws.com,它与亚马逊53号干线托管区ID中使用的elasticbeanstalk.eu-west-1.amazonaws.comendpoint不同。因此,我更改了映射以包括CLI输出提供的CanonicalHostedZoneNameID

"Beanstalk2Route53HostedZoneId" : {
  "eu-west-1" : { "HostedZoneId": "Z3NF1Z3NOM5OY2" }
}

现在堆栈可以成功更新了。遗憾的是,仅适用于eu-West-1,但是如果/当我将堆栈部署到其他区域时,该过程可以更新。

更新堆栈后,仍然没有DNS名称(stable.example.comunstable.example.com)的响应。更新注册商的名称服务器解决了这个问题。

 类似资料:
  • 在/var/log/eb-activity.log文件中,我发现了以下错误- tasks:TOP=>db:migrate=>environment(通过运行任务查看完整跟踪)(executor::nonzeroexitstatus) AppDeploystage0/AppDeployPrehook/12_db_migration.sh]:活动失败。

  • 有没有人可以为至少有一个使用KMS密钥加密的环境变量的Lambda发布一个基本的CloudFormation JSON对象,以及创建该密钥的JSON?

  • 是否可以使用CloudFormation使用别名获得KMS密钥ARN?我想对我的AWS帐户中的一个密钥赋予特定的权限。 像下面这样的?

  • 我正在尝试开发一个Spring Cloud微服务,并使用Elastic Beanstalk部署到AWS cloud中。当我搜索部署选项时,我发现了Beanstalk的部署环境。我有一点困惑。我可以在不启动EC2机器的情况下使用Elastic Beanstalk部署我的微服务吗? 在这里,我只接近弹性豆茎服务。使用弹性Beanstalk部署微服务而不启动EC2是可能的吗? 我是AWS世界的初学者。

  • 问题内容: 我建立一个网站,并不会像从指向重新配置的网站来。此外,我使用的证书当然是使用的正确域名制作的,但是我的测试环境进行了调用,从而使安全性无法正常工作。 我目前要做的是配置开发环境,以将域名分配给,以便所有路由到并路由到。 我 没有 使用Apache。我目前正在使用node.js作为我的Web服务器,并且我的开发环境在Mac OS X Lion中。 问题答案: 如果您编辑etc / hos

  • 我在尝试将我的Godaddy域与AWS Elastic Beanstalk实例链接时遇到了这个问题。我发现了很多关于如何将EC2实例与Godaddy上的域链接的文档,但对于Elastic Beanstalk实例却没有。所以我最终得到了这个网址: