Cloudformation中如何访问跨区域资源
Posted
技术标签:
【中文标题】Cloudformation中如何访问跨区域资源【英文标题】:How to access cross region resources in Cloudformation 【发布时间】:2021-06-09 23:27:01 【问题描述】:我有一个部署到 us-east-1 的静态网站堆栈。我只需要将 s3 存储桶部署在 eu-west-1 区域,所以为了实现这一点,我使用了这样的 Stack Sets;
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 的输出。
大家有什么建议吗?
【问题讨论】:
【参考方案1】:由于资源是不同的区域,我似乎无法使用 StackSet 的输出。
没错。您不能跨区域或帐户引用输出。 CloudFormation (CFN) 是特定于区域的。最简单的方法是在us-east-1
中部署您的资源,并将它们的输出作为参数传递到不同区域的第二个堆栈。您可以手动完成,也可以使用本地工作站或 ec2 实例中的 AWS CLI 或 SDK 自动完成。
但如果想将所有内容都保留在 CFN 中,则必须为第二个堆栈开发一个 custom resource。该资源将采用 lambda 函数 的形式,该函数将使用 AWS 开发工具包从 us-east-1
获取输出并将它们传递到您在不同区域的堆栈。
【讨论】:
以上是关于Cloudformation中如何访问跨区域资源的主要内容,如果未能解决你的问题,请参考以下文章