孤岛模型多租户 - AWS 规范性指导

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

孤岛模型多租户

由于合规性和监管要求,某些多租户 SaaS 环境可能需要将租户的数据部署在完全分离的资源上。在某些情况下,大型客户需要专用集群来减少噪音对邻居的影响。在这种情况下,您可以应用筒仓模型。

在孤岛模型中,租户数据的存储与任何其他租户数据完全隔离。所有用于表示租户数据的结构都被视为该客户端在物理上是唯一的,这意味着每个租户通常具有不同的存储、监控和管理。每个租户还将有一个单独的 AWS Key Management Service (AWS KMS) 密钥用于加密。在 Amazon Neptune 中,孤岛是指每个租户一个集群。

每个租户的集群

您可以通过为每个集群设置一个租户来使用 Neptune 实现孤岛模型。下图显示了三个租户在虚拟私有云 (VPC) 中访问应用程序微服务,每个租户都有单独的集群。

该架构包括 IAM 和租户策略。

每个集群都有其单独的终端节点,以帮助确保不同的接入点,从而实现高效的数据交互和管理。通过将每个租户置于自己的集群中,可以在租户之间创建明确定义的边界,确保客户的数据与其他租户的数据成功隔离。这种隔离对具有严格监管和安全限制的SaaS解决方案也很有吸引力。此外,当每个租户都有自己的集群时,您不必担心邻居会有噪音,因为一个租户施加的负载可能会对其他租户的体验产生不利影响。

虽然 cluster-per-tenant孤岛模式具有优势,但它也带来了管理和敏捷性方面的挑战。这种模型的分布性质使得汇总和评估所有租户的租户活动和运营状况变得更加困难。部署也变得更具挑战性,因为设置新租户现在需要配置单独的集群。当客户端升级和版本与数据库升级紧密结合时,在具有共享客户端层的环境中,升级变得更具挑战性。

Neptune 支持无服务器集群和预配置集群。评估无服务器实例还是预配置实例可以更好地处理您的应用程序工作负载。通常,如果您的工作负载的需求水平保持不变,则预配置实例将更具成本效益。Serverless 针对要求苛刻、高度可变的工作负载进行了优化,这些工作负载在短时间内大量使用数据库,然后是长时间的轻度活动或没有活动。

在按租户使用 Neptune 预配置的集群时,必须选择与租户需求的最大负载近似的实例大小。这种对服务器的依赖也会对 SaaS 环境的扩展效率和成本产生连带影响。虽然 SaaS 的目标是根据实际租户负载动态调整规模,但 Neptune 配置的集群要求您过度配置,以应对更长的使用时间和负载峰值。过度配置会增加每个租户的成本。此外,由于租户使用量会随着时间的推移而发生变化,因此必须为每个租户分别应用向上或向下扩展集群。

Neptune 团队通常建议不要采用孤岛模式,因为闲置资源会产生更高的成本和额外的运营复杂性。但是,对于需要这种额外隔离的高度监管或敏感工作负载,客户可能愿意支付额外费用。

筒仓模型的实施指南

要实现孤 cluster-per-tenant岛隔离模型,请创建 AWS Identity and Access Management (IAM) 数据访问策略。这些策略通过确保租户只能访问包含自己数据的 Neptune 集群来控制对租户的 Neptune 集群的访问。将每个租户的 IAM 策略附加到一个 IAM 角色。然后,应用程序微服务使用 IAM 角色使用 () 的AssumeRole方法生成精细的AWS Security Token Service 临时证书。AWS STS这些凭据只能访问该租户的 Neptune 集群,用于连接到租户的 Neptune 集群。

以下代码段显示了基于数据的 IAM 策略示例:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "neptune-db:ReadDataViaQuery", "neptune-db:WriteDataViaQuery" ], "Resource": "arn:aws:neptune-db:us-east-1:123456789012:tenant-1-cluster/*", "Condition": { "ArnEquals": { "aws:PrincipalArn": "arn:aws:iam::123456789012:role/tenant-role-1" } } } ] }

该代码为示例租户提供了对各自的 Neptune 集群的读写查询权限。tenant-1Condition元素确保只有担任 tentant-1 IAM 角色 () 的调用实体(委托人tenant-role-1)才能访问的 Nep tenant-1 tune 集群。