如何在同一 AWS 账户和区域中部署同一堆栈集的多个实例?

Posted

技术标签:

【中文标题】如何在同一 AWS 账户和区域中部署同一堆栈集的多个实例?【英文标题】:How to deploy multiple instances of the same stackset in the same AWS account and region? 【发布时间】:2021-12-19 03:38:43 【问题描述】:

我正在创建一个多租户架构。每当新租户注册我的平台时,我都需要复制我的资源。

我在我的 SAM 项目中创建了一个堆栈集,如下所示:

StackSet:
    Type: AWS::CloudFormation::StackSet
    Properties:
      Capabilities:
        - "CAPABILITY_IAM"
        - "CAPABILITY_NAMED_IAM"
        - "CAPABILITY_AUTO_EXPAND"
      AdministrationRoleARN: !GetAtt AdministrationRole.Arn
      ExecutionRoleName: !Ref ExecutionRole
      OperationPreferences:
        FailureToleranceCount: 0
        MaxConcurrentCount: 1
      PermissionModel: 'SELF_MANAGED'
      StackInstancesGroup:
        - DeploymentTargets:
            Accounts: 
              - !Ref AWS::AccountId
          Regions: 
            - !Ref AWS::Region
        - DeploymentTargets:
            Accounts: 
              - !Ref AWS::AccountId
          Regions: 
            - !Ref AWS::Region
      Tags:
        - 
          Key: 'PROJECT'
          Value: 'imaclegal'
      StackSetName: 'imaclegal'
      TemplateURL: 'https://s3.amazonaws.com/a-child-s3/output.yaml'

当我执行sam deploy 时,我得到这个错误:

资源 StackSet 的属性验证失败,消息为:#: #: 2 个子模式中只有 1 个匹配 #/StackInstancesGroup: 数组项不是唯一的

所以我似乎无法在同一个 AWS 账户和区域中部署超过 1 个实例,有没有办法在同一个 AWS 账户和区域中完成多个实例?或者有没有其他更好的方法来为我的新租户复制我的资源?

【问题讨论】:

【参考方案1】:

如果您想将所有资源保存在单个账户/区域中,CloudFormation StackSets 目前无法满足您的需求。 如果您的资源未在模板中命名,您可以只创建多个 CloudFormation 堆栈。但是,这可能会导致维护变得混乱,而且如果您大规模运行应用程序,您更有可能达到服务配额。

就个人而言,我建议使用 AWS Organizations 为每个租户创建一个账户。然后可以使用 CloudFormation StackSets 将您的资源自动复制到新帐户。

此解决方案还具有为每个租户更精确地分配成本的额外好处。

【讨论】:

以上是关于如何在同一 AWS 账户和区域中部署同一堆栈集的多个实例?的主要内容,如果未能解决你的问题,请参考以下文章

AWS CDK:如何在同一应用程序中引用跨堆栈资源?

同一区域内的 AWS 数据传输成本,但属于不同的账户?

如何使用分析窗口 SQL 函数在同一数据集的多组行中查找 id 值

AWS CDK 将 API Gateway URL 传递到同一堆栈中的静态站点

来自账户 A 的 AWS Cloudwatch 警报无法发布到账户 B 中的 SNS 主题

在同一个 Cloudformation 堆栈中连接 Athena 和 S3