如何在 Cloudformation 模板中指定区域以通过 DNS 验证 ACM 证书

问题描述

我正在编写一个 Cloudformation 模板来为 Cloudfront 请求 ACM 证书以通过 DNS 获得 SSL

我的模板:

ACMCertificate: 
  Type: "AWS::CertificateManager::Certificate"
  Properties: 
    DomainName: mywebsite.com
    SubjectAlternativeNames:
      - www.mywebsite.com
    DomainValidationoptions:
          - DomainName: mywebsite.com
            HostedZoneId: !Ref MyHostedZoneId
          - DomainName: www.mywebsite.com
            HostedZoneId: !Ref MyHostedZoneId
    ValidationMethod: DNS

Outputs:
  ACMCertificateArn:
    Value: !Ref ACMCertificate

问题:证书是在 AWS 账户所在的区域创建的,在我的例子中是 eu-west-1。你知道这个证书不能用于SSL,需要在us-east-1

中创建

如何在 Cloudformation 模板中指定验证 ACM 证书的区域?

感谢任何建议。

解决方法

您可以指定一个 AWS 区域来创建证书, 特定区域独立于 Cloudformation 堆栈区域,例如可以在 区域 us-east-1(与 cloudfront 一起使用),同时在区域 eu-west-1 中部署堆栈。 通过在 cloudformaion 中使用自定义资源

CreateCertificateCustomResource:
  Type: Custom::CreateCertificates
  Properties:
    ServiceToken: CreateCertificateFunction.Arn
    DomainName: yourdomain
    ValidationDomain: DomainName
    HostedZoneId: yourzoneid
    CertificateRegion: yourRegion
    IdempotencyToken: CreateCertificateCustomReource
    CertificateTafs:
      - Key: Name
        Value: DomainName
,

遗憾的是,您无法在模板中执行此操作。您必须在 us-east-1 中“手动”创建您的堆栈。这意味着,如果您为此使用 AWS 控制台,则必须在控制台中更改区域,并使用 CloudFormation 控制台在该区域中创建堆栈。

如果您使用 AWS CLI 的 create-stack 命令,您可以添加 --region us-east-1 作为其参数之一。对于 AWS SDK,例如 boto3,您可以进行类比操作。

您还可以查看 StackSets,它允许您从一个中心位置跨多个帐户和区域部署模板。