问题描述
我有一个部署到 us-east-1 的静态网站堆栈。我只需要在 eu-west-1 区域部署 s3 存储桶,因此为了实现这一点,我使用了这样的堆栈集;
StackSet:
Type: AWS::CloudFormation::StackSet
Properties:
Description: Multiple S3 buckets in multiple regions
PermissionModel: SELF_MANAGED
StackInstancesGroup:
- DeploymentTargets:
Accounts:
- !Ref "AWS::AccountId"
Regions:
- eu-west-1
StackSetName: !Sub "AppBucketStack"
TemplateBody: |
AWstemplateFormatVersion: 2010-09-09
Description: Create a S3 bucket
Resources:
WebsiteBucket:
Type: AWS::S3::Bucket
DeletionPolicy: Retain
UpdateReplacePolicy: Retain
Properties:
BucketName: !Join
- ''
- - aMeta-app-
- !Ref 'AWS::Region'
- '-'
- !Ref 'AWS::AccountId'
AccessControl: Private
CorsConfiguration:
CorsRules:
- AllowedHeaders:
- "*"
AllowedMethods:
- GET
- POST
- PUT
AllowedOrigins:
- "*"
MaxAge: 3600
WebsiteConfiguration:
IndexDocument: index.html
ErrorDocument: 404.html
Tags:
- Key: Company
WebsiteBucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref 'WebsiteBucket'
PolicyDocument:
Version: '2012-10-17'
Statement:
- Action:
- s3:Getobject
Effect: Allow
Resource: !Join
- ''
- - 'arn:aws:s3:::'
- !Ref 'WebsiteBucket'
- /*
Principal:
CanonicalUser: !GetAtt OriginAccessIdentity.S3CanonicalUserId
但是现在我需要在部署在 us-east-1 的 cloudfront 中解决存储桶的域名 (!GetAtt WebsiteBucket.DomainName)。好像不能使用StackSet的输出,因为资源是不同的区域。
大家有什么建议吗?
解决方法
好像不能使用StackSet的输出,因为资源是不同的区域。
没错。您不能跨区域或账户引用输出。 CloudFormation (CFN) 是特定于区域的。最简单的方法是在 us-east-1
中部署您的资源,并将它们的输出作为参数传递到不同区域的第二个堆栈。您可以手动完成,也可以从本地工作站或 ec2 实例使用 AWS CLI 或开发工具包自动完成。
但是如果想要将所有内容保留在 CFN 中,您必须为第二个堆栈开发一个 custom resource。该资源将采用 lambda 函数 的形式,它将使用 AWS 开发工具包从 us-east-1
获取输出并将它们传递到您在不同区域的堆栈。