5

什麼是正確的Route 53 CloudFormation配置將子域名別名到Elastic Beanstalk環境ELB?如何使用CloudFormation將域名別名到Elastic Beanstalk環境?

我從Amazon Route 53 Hosted Zone ID表複製HostedZoneId s到映射:

"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" ] } 
} 

兩個階段和產品Beanstalk環境正在工作,即他們響應MyStageBeanstalkEnv.eu-west-1.elasticbeanstalk.com的呼叫以及{ "Fn::GetAtt" : [ "MyStageBeanstalkEnv", "EndpointURL" ] }(看起來像awseb-[abc-123-xyz].eu-west-1.elb.amazonaws.com)返回的端點。 毫不奇怪,該證書無效,因爲它期望域名是stage.example.comprod.example.com


現在我嘗試添加路由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" 
    }] 
    } 
}, 

當我嘗試更新CloudFormation堆棧我得到的AWS控制檯以下錯誤:

16:12 :00 UTC + 0200 CREATE_FAILED AWS :: Route53 :: RecordSetGroup ExampleDomainRecordSetGroup嘗試創建一個目標爲awseb- [abc-123-xyz] .eu-west-1.elb.amazonaws.com。,區域爲Z2NYPWQ7DFZAZH的類型A的別名,但是別名目標名稱不會hin目標區域

在此上下文中,awseb-[abc-123-xyz].eu-west-1.elb.amazonaws.com與Beanstalk ELB提供的URL相同。


評論:

  • 我成功設法安裝程序路徑53別名資源記錄相同的青苗環境在AWS控制檯下面的描述To add an alias resource record set in Amazon Route 53,所以它是「剛」關於轉移問題這些配置步驟轉到CloudFormation模板。
  • 堆棧部署在eu-west-1
  • 而不是使用AWS::Route53::RecordSetGroup資源我也嘗試創建兩個單獨的AWS::Route53::RecordSet資源,但堆棧更新失敗,出現相同的錯誤。

回答

5

一些谷歌搜索暗示(12)的​​配置別名時不能使用。據稱,eu-west-1對於elasticbeanstalk.eu-west-1.amazonaws.com端點具有託管區域ID Z2NYPWQ7DFZAZH。然而,當仔細檢查一下魔豆使用AWS CLI實際產生的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,其不等於​​中使用的elasticbeanstalk.eu-west-1.amazonaws.com的相同端點。因此,我改變了映射到包括來自CLI輸出提供的CanonicalHostedZoneNameID

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

現在堆棧可以成功地更新。遺憾的是隻有eu-west-1,但是當我將堆棧部署到其他區域時,可以更新該過程。

堆棧更新後,DNS名稱(stable.example.comunstable.example.com)仍然沒有響應。 Updating Your Registrar's Name Servers解決了這個問題。

+0

我碰到了同樣的問題。從我對您的答案的理解中,似乎沒有辦法爲尚不存在的EB環境映射託管區域ID?即我將不得不創建一個指向ELB的CNAME(因爲這是我可以從CFN模板中獲得的唯一輸出?) 或者有沒有辦法讓CononicalHostedZoneNameID創建一個別名記錄和映射它以永久的方式,每個地區的,我的模板? 我問,因爲你用CLI拉的Z3NF1Z3NOM5OY2似乎沒有任何標準的Route3 Endpoint那個亞馬遜文件。 – Marty

+0

有同樣的問題。令人難以置信的是,您無法在CFN模板中獲得CanonicalHostedZoneNameId!如果您發現除了每個環境的硬編碼以外的任何其他解決方案,請更新。 –

1

我與CloudFront的Route53 Alias有同樣的問題。 我建立HostedZOneId映射,但它從來沒有通過搜索AWS文檔工作對我來說, 我發現這一點:

託管區域ID。

對於負載均衡器,請使用負載均衡器的規範託管區域ID。

對於Amazon S3,請爲存儲桶的網站端點使用託管區域ID。

對於CloudFront,請使用Z2FDTNDATAQYW2。

有關其他服務的託管區域ID的列表,請參閱AWS區域和端點中的相關服務。

所以我只是硬編碼它:

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

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

相關問題