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中如何访问跨区域资源的主要内容,如果未能解决你的问题,请参考以下文章

PubSubLite:跨区域访问 PubSub Lite

华为云CDN如何加速ECS资源?

AWS同账户不同地域资源访问(ses到lambda)

S3 跨区域复制

当 S3 和 Lambda 位于不同区域时,如何使用 S3 事件通知触发跨区域 Lambda 函数

[S3使用Terraform进行跨区域复制