在 aws 中分离实时环境和测试环境的最佳方法

Best way to separate live and test environemnts in aws

我想在 AWS 中提供测试和实时环境。 我的环境包含 AWS 服务,如 Lambda、API-Gateway 等,用于测试目的和实际使用。

在 AWS 中分离测试和实际环境的最佳方式是什么?

创建一个有主账户的组织是个好主意吗? 将此主帐户用于实时环境,然后创建另一个帐户 哪个属于同一组织并用于测试环境?

可以利用 AWS elasticbean 服务来实现此功能。

下面是片段: Blue/green 部署要求您的环境独立于生产数据库运行(如果您的应用程序使用生产数据库)。例如,如果您的环境附加了一个 Amazon RDS 数据库实例,数据将不会传输到您的第二个环境,并且如果您终止原始环境,数据将会丢失。

更多详情,请参考下方link: https://docs.aws.amazon.com/elasticbeanstalk

希望这有助于入门。

有许多权衡取舍的范例 - 主要是处理您对管理开销和隔离的容忍度。

两个组织帐户

如你所说,有主组织账号和测试账号的模式。有一些思路表明,将面向客户的生产资产放在主计费账户中是一种不必要的风险,因为该账户内的妥协会危及整个组织。也就是说,这仍然是一种非常常见的模式。

三个以上的组织帐户

您可以使用您的主帐户来容纳您的联盟并访问您所有其他帐户,仅此而已。这使您可以在生产帐户上应用服务控制策略,以更好地保护它并限制危害范围。如果您想跳入兔子洞,您可以将身份联合工作放在自己的帐户中,但在您接受这个级别(或更高级别)的复杂性之前,请确保它满足业务需求或减轻与业务相称的风险成本。

与 IAM 分离

您可以在单个帐户中操作测试和实时环境,但由于管理开销,这可能是不可取的。如果您创建一组 IAM policies/roles 并在其名称前加上 TEST,并将它们与仅允许对名称开头带有 TEST 的其他资源的权限的策略一起使用(即,它们只能创建以 TEST 开头的资源并且只能修改以 TEST 开头的资源)。然后重复 LIVE 的过程。要分离数据,您可以使用 LIVE 和 TEST KMS 密钥以及仅向同一环境中的角色授予权限的策略。如果您使用 IAM 用户,您可以向他们授予 sts:assumeRole 他们需要的任何 TEST 或 LIVE 角色的权限,他们可以使用控制台中的角色切换功能或 cli 上的 sts assume-role 命令或 api 来操作其中一个环境。与 lambda 交互的示例策略可能如下所示:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListActions",
            "Effect": "Allow",
            "Action": [
                "lambda:ListFunctions",
                "lambda:ListEventSourceMappings",
                "lambda:ListLayerVersions",
                "lambda:ListLayers",
                "lambda:GetAccountSettings",
                "lambda:CreateEventSourceMapping"
            ],
            "Resource": "*"
        },
        {
            "Sid": "TestOnly",
            "Effect": "Allow",
            "Action": "lambda:*",
            "Resource": [
                "arn:aws:lambda:*:337676836613:layer:TEST*:*",
                "arn:aws:lambda:*:337676836613:event-source-mapping:TEST*",
                "arn:aws:lambda:*:337676836613:function:TEST*",
                "arn:aws:lambda:*:337676836613:layer:TEST*"
            ]
        }
    ]
}

这不会阻止任一环境能够 运行 list* api 调用并查看来自其他环境的 and/or 资源名称,但是来自一个环境的资源将无法执行 describe* api 调用以查看任何 information/metadata 关于另一个环境中的资源,并且将无法在另一个环境中实例化新资源,并且将无法修改其他环境中的资源。通过 KMS 彻底锁定数据,您甚至无法在不使用中介的情况下在环境之间复制数据。但是,如果您想为服务(如 ECS 中的 VPC T运行king)使用不同的帐户范围 settings/defaults,这将不起作用,因为它们是帐户范围的并且会影响您的所有环境.

但是,这需要一些精心设计的策略,除非您非常熟悉 IAM,否则使用 AWS Organizations 是一种更简单的方法。这种方式的优点是环境之间的分离非常明确。由于 AWS API 调用可以遍历账户,因此一个账户中的资源可以开始使用其他账户中的资源(承担角色、共享 S3 存储桶、共享 KMS CMK 等)。多账户策略可能会忽略这一点,并且随着时间的推移,环境变得更加紧密,账户之间不必要的泄漏成为可能。

different project and environment separation strategies for AWS, that you can use to achieve your goal. Besides the already described "Separation by IAM" approach you can also consider trying out Separation by Account. This could result in an account hierarchy that is similar to following figure from this AWS answer.

如何实现按账户分离

首先,您需要使用您的主账户创建一个 AWS 组织,该账户将作为您的项目账户运行。然后,您可以通过邀请现有 AWS 账户将其添加到您的组织,或者您可以在 AWS Organizations 的帮助下创建新账户(在这种情况下请注意 )。在您完成创建和组织帐户后,您将自动为每个帐户获得一个干净的沙箱环境,不会发生资源冲突。

您的好处

  • 您无需关心资源的正确前缀或后缀
  • 通过合并账单,您将清楚地了解每个资源堆栈和每个帐户的成本
  • 如果您从 AWS Organizations 界面创建账户,则不需要为每个账户提供信用卡