如何在eu-west-1区域的CloudFormation栈中跨区域引用us-east-1区域的CloudFront专用ACM证书?
跨区域引用CloudFront ACM证书ARN的实用方案
CloudFormation的!ImportValue确实不支持跨区域引用,不想硬编码证书ARN的话,这几个办法都能解决问题:
方法1:用SSM参数存储传递ARN(最推荐)
这个方案简单易维护,成本也低,具体这么做:
- 在us-east-1的证书栈里把ARN存进SSM
给你的us-east-1栈加一个SSM参数资源,把ACM证书的ARN存进去,参数名称可以设成/cloudfront/certificate/arn这种容易识别的:
AWSTemplateFormatVersion: '2010-09-09' Resources: CloudFrontCertificate: Type: AWS::CertificateManager::Certificate Properties: DomainName: 'bla.bla.com' ValidationMethod: DNS CertificateSSMParam: Type: AWS::SSM::Parameter Properties: Name: /cloudfront/certificate/arn Type: String Value: !Ref CloudFrontCertificate Description: ARN of CloudFront ACM cert from us-east-1
- 同步ARN到eu-west-1的SSM(或直接跨区域读取)
SSM参数是区域级的,你可以部署完us-east-1栈后,用AWS CLI把ARN同步到eu-west-1的SSM:
# 获取us-east-1栈的证书ARN CERT_ARN=$(aws cloudformation describe-stacks --stack-name your-us-east-1-cert-stack --region us-east-1 --query "Stacks[0].Outputs[?OutputKey=='CertificateArn'].OutputValue" --output text) # 存入eu-west-1的SSM参数 aws ssm put-parameter --name /cloudfront/certificate/arn --value $CERT_ARN --type String --region eu-west-1 --overwrite
如果需要自动化,也可以写个Lambda函数完成同步,手动CLI命令足够应付大多数场景。
- 在eu-west-1的CloudFront栈里引用参数
现在直接用!GetParameter就能拿到ARN了:
Distribution: Type: AWS::CloudFront::Distribution Properties: DistributionConfig: # 你的其他配置... ViewerCertificate: AcmCertificateArn: !GetParameter /cloudfront/certificate/arn SslSupportMethod: sni-only
方法2:用Secrets Manager存ARN
和SSM类似,但Secrets Manager支持跨区域访问(只要权限配置对),适合需要更严格权限控制的场景:
- 在us-east-1的栈里把ARN存进Secrets Manager
CertificateSecret: Type: AWS::SecretsManager::Secret Properties: Name: cloudfront-certificate-arn SecretString: !Sub '{"certArn": "${CloudFrontCertificate}"}'
- 在eu-west-1的栈里直接引用
用CloudFormation的!SecretsManager解析函数就能获取ARN:
Distribution: Type: AWS::CloudFront::Distribution Properties: DistributionConfig: # 其他配置... ViewerCertificate: AcmCertificateArn: !SecretsManager '{{resolve:secretsmanager:cloudfront-certificate-arn:SecretString:certArn}}' SslSupportMethod: sni-only
记得给eu-west-1的栈执行角色加上secretsmanager:GetSecretValue权限。
方法3:用Lambda自定义资源跨区域拉取栈输出
如果想完全自动化,不用手动同步参数,可以写个Lambda函数帮你跨区域获取us-east-1栈的输出:
创建Lambda函数
函数逻辑很简单:接收CloudFormation的请求,调用AWS SDK查询us-east-1目标栈的输出,返回证书ARN。在eu-west-1的栈里添加自定义资源
CertArnRetriever: Type: Custom::CertArnRetriever Properties: ServiceToken: !GetAtt CertRetrieverLambda.Arn TargetStackName: your-us-east-1-cert-stack TargetRegion: us-east-1 Distribution: Type: AWS::CloudFront::Distribution Properties: DistributionConfig: # 其他配置... ViewerCertificate: AcmCertificateArn: !GetAtt CertArnRetriever.CertificateArn SslSupportMethod: sni-only
这个方式全程自动化,适合CI/CD流水线场景。
总结
个人最推荐方法1,配置简单,上手快,日常维护也方便。只要同步一次ARN,之后eu-west-1的栈就能直接引用,完全不用硬编码。
内容的提问来源于stack exchange,提问作者Joris
相关产品推荐
相关产品推荐

