本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 SaaS 架构中为孤岛模型进行租户入职,使用 C# 和 AWS CDK
由 Tabby Ward (AWS)、Susmitha Reddy Gankidi () 和 Vijai Anand Ramalingam (AWS) 创作 AWS
摘要
软件即服务(SaaS)应用程序可以使用各种不同的架构模型构建。孤岛模型是指向租户提供专用资源的架构。
SaaS 应用程序依靠无摩擦模型将新租户引入其环境。这通常需要编排多个组件,才能成功预调配和配置创建新租户所需所有元素。在 SaaS 架构中,此过程称为租户登录。在每个 SaaS 环境中,应通过在登录流程中使用基础设施即代码,实现登录完全自动化。
此模式将引导您完成在 Amazon Web Services (AWS) 上创建租户并为租户配置基本基础设施的示例。该模式使用 C# 和 C AWS loud Development Kit (AWSCDK)。
由于这种模式会产生账单警报,因此我们建议在美国东部(弗吉尼亚北部)或 us-east-AWS 1 地区部署堆栈。有关更多信息,请参阅 AWS 文档。
先决条件和限制
先决条件
一个活跃的AWS账户
。 具有足够IAM访问权限的 Ident AWS ity and Access Management (IAM) 主体,可以为此模式创建AWS资源。有关更多信息,请参阅 IAM 角色。
安装 Amazon 命令行界面 (AWSCLI) 并配置AWSCLI为执行AWSCDK部署。
已下载并安装 Visual Studio 2022
或者已下载并安装 Visual Studio Code 。 AWSVisual Studio 的 Toolk it 已设置。
。 NET内核 3.1 或更高版本
(C# AWS CDK 应用程序需要此选项) 已安装 Amazon.Lambda.Tools
。
限制
AWSCDK使用 AWS CloudFormation
,因此AWSCDK应用程序受 CloudFormation 服务配额的约束。有关更多信息,请参阅 AWS CloudFormation 配额。 租户 CloudFormation 堆栈是使用 CloudFormation 服务角色创建的,操作上
infra-cloudformation-role
带有通配符(sns
* 和sqs*
),但资源锁定到tenant-cluster
前缀。对于生产用例,请评估此设置并仅提供对该服务角色所需访问权限。InfrastructureProvision
Lambda 函数还使用通配符 (cloudformation*
) 来配置 CloudFormation 堆栈,但资源锁定到前缀。tenant-cluster
此示例代码的 docker 构建使用
--platform=linux/amd64
强制基于linux/amd64
的映像。这是为了确保最终的映像构件适用于 Lambda,它默认使用 x86-64 架构。如果您需要更改目标 Lambda 架构,请务必同时更改 Dockerfile 和代码。AWS CDK有关更多信息,请参阅博客文章将 AWS Lambda 函数迁移到基于 ARM AWS 的 Graviton2 处理器。 堆栈删除过程不会清理堆栈生成的 CloudWatch 日志(日志组和日志)。您必须通过AWS管理控制台 Amazon 控制 CloudWatch 台或通过手动清理日志API。
此模式设置为示例。对于生产用途,请评估以下设置并根据您的业务需求进行更改:
为AWS简单起见,本示例中的简单存储服务 (Amazon
S3) Service 存储桶未启用版本控制。根据需要评估和更新设置。 为简单起见,此示例在不进行身份验证、授权或限制的情况下设置 Amazon API Gateway
REST API 终端节点。对于生产用途,我们建议将系统与业务安全基础设施集成。评估此设置并根据需要添加所需安全设置。 在此租户基础设施示例中,亚马逊简单通知服务 (AmazonSNS)
和亚马逊简单队列服务 (AmazonSQS) 只有最低限度的设置。根据AWS密钥政策,每个租户的密钥管理SNS服务 (AWSKMS) 向账户中的亚马逊 CloudWatch 和亚马逊服务开放,AWSKMS供其使用。该设置只是一个占位符示例。根据您的业务用例根据需要调整设置。 整个设置(包括但不限于API端点和后端租户通过使用AWS CloudFormation配置和删除)仅涵盖了基本的成功路径案例。根据您的业务需求,使用必要的重试逻辑、额外的错误处理逻辑和安全逻辑来评估和更新设置。
在撰写本文时,示例代码使用 up-to-date cdk-nag
进行测试,以检查策略。将来可能会强制执行新的策略。这些新策略可能需要您根据建议手动修改堆栈,然后才能部署堆栈。查看现有代码,确保其符合您的业务需求。 该代码依赖生成随机后缀,而不是依赖静态分配的物理名称来创建大多数资源。AWS CDK此设置是为了确保这些资源是唯一的,并且不会与其他堆栈发生冲突。有关更多信息,请参阅AWSCDK文档。根据您的业务需求对此进行调整。
此示例代码包。 NETLambda 构件到基于 Docker 的镜像中,并使用 Lambda 提供的容器镜像运行时运行。容器映像运行时系统具有的优势包括:标准传输和存储机制(容器注册表)和更精确的本地测试环境(通过容器映像)。您可以将项目切换为使用提供的 Lambda。 NET运行时可缩短 Docker 镜像的构建时间,但随后您需要设置传输和存储机制,并确保本地设置与 Lambda 设置相匹配。调整代码以适应用户的业务需求。
产品版本
AWSCDK版本 2.45.0 或更高版本
Visual Studio 2022
架构
技术堆栈
亚马逊API网关
AWS CloudFormation
Amazon CloudWatch
Amazon DynamoDB
AWSIdentity and Access Management (IAM)
AWS KMS
AWS Lambda
Amazon S3
Amazon SNS
Amazon SQS
架构
下图显示了租户堆栈的创建流程。有关控制面板和租户技术堆栈的更多信息,请参阅其他信息部分。
租户堆栈创建流程
用户将包含新租户有效负载(租户名称、租户描述)的POSTAPI请求发送JSON到由 Amazon API Gateway REST API 托管的。API网关处理请求并将其转发给后端 Lambda 租户入门函数。在此示例中,没有授权或身份验证。在生产设置中,API应将其与 SaaS 基础设施安全系统集成。
租户登录功能会验证请求。然后,它会尝试将租户记录(包括租户名称、生成的租户通用唯一标识符 (UUID) 和租户描述)存储到 Amazon DynamoDB 租户入职表中。
在 DynamoDB 存储记录后,DynamoDB 流会启动下游 Lambda 租户基础设施函数。
租户基础设施 Lambda 函数基于收到的 DynamoDB 数据流进行操作。如果直播用于INSERT事件,则该函数使用流的 NewImage 部分(最新更新记录,租户名称字段)进行调用, CloudFormation 以使用存储在 S3 存储桶中的模板创建新的租户基础架构。 CloudFormation 模板需要租户名称参数。
AWS CloudFormation 根据 CloudFormation 模板和输入参数创建租户基础架构。
每个租户基础设施设置都有一个 CloudWatch 警报、一个账单警报和一个警报事件。
警报事件会变成发送给SNS主题的消息,该消息由租户的AWSKMS密钥加密。
该SNS主题将收到的警报消息转发到SQS队列,该队列由租户的加密密钥AWSKMS进行加密。
其他系统可以与 Amazon 集成SQS,根据队列中的消息执行操作。在此示例中,为了保持代码的通用性,传入的消息将保留在队列中,需要手动删除。
租户堆栈删除流程
用户将包含新租户有效负载(租户名称、租户描述)的DELETEAPI请求发送JSON到 Amazon API Gateway REST API 托管的,后者将处理该请求并转发到租户入职功能。在此示例中,没有授权或身份验证。在生产设置中,API这将与SaaS基础设施安全系统集成。
租户登录功能将验证请求,然后尝试从租户登录表中删除租户记录(租户名称)。
DynamoDB 成功删除记录(该记录存在于表中并已删除)后,DynamoDB 流将启动下游 Lambda 租户基础设施函数。
租户基础设施 Lambda 函数基于收到的 DynamoDB 数据流记录进行操作。如果直播是针对REMOVE事件的,则该函数使用记录的 OldImage 部分(记录信息和租户名称字段,位于最新更改之前,即删除),根据该记录信息启动对现有堆栈的删除。
AWS CloudFormation 根据输入删除目标租户堆栈。
工具
AWS 服务
Amazon API Gateway 可帮助您以任何规模创建、发布RESTHTTP、维护、监控和 WebSocket APIs保护。
AWSCloud Development Kit (AWSCDK) 是一个软件开发框架,可帮助您在代码中定义和配置AWS云基础架构。
AWSCDKToolkit 是一个命令行云开发套件,可帮助您与 Clou AWS d Development Kit (AWSCDK) 应用程序进行交互。
AWSCommand Line Interface (AWSCLI) 是一个开源工具,可帮助您通过命令行外壳中的命令与AWS服务进行交互。
AWS CloudFormation帮助您设置AWS资源,快速一致地配置资源,并在各个AWS账户和地区的整个生命周期中对其进行管理。
Amazon DynamoDB 是一项完全托管的SQL无数据库服务,可提供快速、可预测和可扩展的性能。
AWSIdentity and Access Management (IAM) 通过控制谁经过身份验证并有权使用AWS资源,从而帮助您安全地管理对资源的访问权限。
AWS密钥管理服务 (AWSKMS) 可帮助您创建和控制加密密钥,以帮助保护您的数据。
AWSLambda 是一项计算服务,可帮助您运行代码,而无需预置或管理服务器。它仅在需要时运行您的代码,并且能自动扩缩,因此您只需为使用的计算时间付费。
Amazon Simple Storage Service (Amazon S3)是一项基于云的对象存储服务,可帮助您存储、保护和检索任意数量的数据。
亚马逊简单通知服务 (AmazonSNS) 可帮助您协调和管理发布者与客户之间的消息交换,包括网络服务器和电子邮件地址。
Amazon Simple Queue Service (AmazonSQS) 提供安全、耐用且可用的托管队列,可帮助您集成和分离分布式软件系统和组件。
AWS适用于 Visual Studio 的 Toolk it 是 Visual Studio 集成开发环境的插件 (IDE)。适用于 Visual Studio 的 Toolkit 支持开发、调试和部署。 NET使用AWS服务的应用程序。
其他工具
Visual Studio
包括编译器、代码完成工具、图形设计器和其他支持软件开发的功能。IDE
代码
此模式的代码位于思洛模型的 SaaS 架构APG示例存储库中的租户入门中
操作说明
任务 | 描述 | 所需技能 |
---|---|---|
验证 Node.js 的安装。 | 要验证 Node.js 是否已安装在本地计算机上,请运行以下命令。
| AWS管理员,AWS DevOps |
安装AWSCDK工具包。 | 要在本地计算机上安装 AWS CDK Toolkit,请运行以下命令。
如果未安装 npm,则可以从 Node.js 站点 | AWS管理员,AWS DevOps |
验证AWSCDK工具包版本。 | 要验证您的计算机上是否正确安装了 AWS CDK Toolkit 版本,请运行以下命令。
| AWS管理员,AWS DevOps |
任务 | 描述 | 所需技能 |
---|---|---|
克隆存储库。 | 克隆存储库 在 Visual Studio 2022 中,打开 以下资源是作为此堆栈的一部分创建的:
| AWS管理员,AWS DevOps |
查看 CloudFormation 模板。 | 在 该模板提供了租户特定的基础设施。在此示例中,它配置了密AWSKMS钥、Amazon SNS SQS、Amazon 和 CloudWatch 警报。 | 应用程序开发者,AWS DevOps |
查看租户登录函数。 | 打开 打开 请注意,以下 NuGet 包已作为依赖项添加到
| 应用程序开发者,AWS DevOps |
查看租户 InfraProvisioning 功能。 | 导航到 打开 打开 请注意,以下 NuGet 包已作为依赖项添加到
| 应用程序开发者,AWS DevOps |
任务 | 描述 | 所需技能 |
---|---|---|
构建解决方案。 | 要构建解决方案,请执行以下步骤:
注意在生成解决方案之前,请确保将 | 应用程序开发人员 |
引导AWSCDK环境。 | 打开 Windows 命令提示符并导航到文件所在的AWSCDK应用程序根
如果您已经为凭证创建了AWS配置文件,请将命令与您的配置文件一起使用。
| AWS管理员,AWS DevOps |
列出AWSCDK堆栈。 | 要列出要作为本项目的一部分创建的所有堆栈,请运行以下命令。
如果您已经为凭证创建了AWS配置文件,请将命令与您的配置文件一起使用。
| AWS管理员,AWS DevOps |
查看将创建哪些AWS资源。 | 要查看将在此项目中创建的所有AWS资源,请运行以下命令。
如果您已经为凭证创建了AWS配置文件,请将命令与您的配置文件一起使用。
| AWS管理员,AWS DevOps |
使用部署所有AWS资源AWSCDK。 | 要部署所有AWS资源,请运行以下命令。
如果您已经为凭证创建了AWS配置文件,请将命令与您的配置文件一起使用。
部署完成后,APIURL从命令提示符的输出部分复制,如以下示例所示。
| AWS管理员,AWS DevOps |
任务 | 描述 | 所需技能 |
---|---|---|
创建新租户。 | 要创建新租户,请发送以下 curl 请求。
将占位符更改
以下示例显示了输出。
| 应用程序开发者、AWS管理员、AWS DevOps |
在 DynamoDB 中验证新创建租户的详细信息。 | 要验证 DynamoDB 中新创建租户的详细信息,请执行以下步骤。
| 应用程序开发者、AWS管理员、AWS DevOps |
验证为新租户创建的堆栈。 | 验证新堆栈是否已成功创建并根据 CloudFormation 模板为新创建的租户配置了基础架构。
| 应用程序开发者、AWS管理员、AWS DevOps |
删除租户堆栈。 | 要删除租户堆栈,请发送以下 curl 请求。
将占位符更改
以下示例显示了输出。
| 应用程序开发者AWS DevOps、AWS管理员 |
验证现有租户的堆栈删除。 | 要验证现有租户的堆栈是否已删除,请执行以下步骤:
| 应用程序开发者、AWS管理员、AWS DevOps |
任务 | 描述 | 所需技能 |
---|---|---|
摧毁环境。 | 在清理堆栈之前,请确保满足以下条件:
测试完成后,AWSCDK可以通过运行以下命令来销毁所有堆栈和相关资源。
如果您为凭证创建了AWS配置文件,请使用该配置文件。 确认堆栈删除提示以删除堆栈。 | AWS管理员,AWS DevOps |
清理 Amazon CloudWatch 日志。 | 堆栈删除过程不会清理堆栈生成的日 CloudWatch 志(日志组和日志)。使用 CloudWatch 控制台或手动清理 CloudWatch 资源API。 | 应用程序开发者AWS DevOps、AWS管理员 |
相关资源
其他信息
控制面板技术堆栈
写入的CDK代码。 NET用于配置控制平面基础架构,该基础架构由以下资源组成:
API 网关
用作控制平面RESTAPI堆栈的入口点。
租户登录 Lambda 函数
此 Lambda 函数由 API Gateway 使用 m 方法启动。
POST方法API请求会导致 (
tenant name
,tenant description
) 被插入到 DynamoDB 表Tenant Onboarding
中。在此代码示例中,租户名称也用作租户堆栈名称的一部分以及该堆栈中资源的名称。这是为了使这些资源更易于识别。此租户名称在设置中必须是唯一的,以避免冲突或错误。IAM角色文档和 “限制” 部分介绍了详细的输入验证设置。
只有在表中的任何其他记录中未使用租户名称时,DynamoDB 表的持久化过程才会成功。
在这种情况下,租户名称是该表的分区键,因为只有分区键可以用作
PutItem
条件表达式。如果以前从未记录过租户名称,则该记录将成功保存到表格中。
但是,如果表中的现有记录已使用租户名称,则操作将失败并启动 DynamoDB
ConditionalCheckFailedException
异常。该异常将用于返回一条失败消息(HTTP BadRequest
),指示租户名称已存在。DELETE
方法API请求将从Tenant Onboardin
g 表中删除特定租户名称的记录。即使该记录不存在,本示例中的 DynamoDB 记录删除也会成功。
如果目标记录存在并被删除,它将创建一个 DynamoDB 数据流记录。否则,将不会创建任何下游记录。
在 Amazon DynamoDB Streams 启用时的租户登录 DynamoDB
这会记录租户元数据信息,任何记录的保存或删除都会将数据流发送到下游
Tenant Infrastructure
Lambda 函数。租户基础设施 Lambda 函数
此 Lambda 函数由上一步中的 DynamoDB 数据流记录启动。如果记录是针对某个
INSERT
事件的,则它会调用AWS CloudFormation 以使用存储在 S3 存储桶中的 CloudFormation 模板创建新的租户基础架构。如果该记录用于REMOVE
,则它会根据流记录的Tenant Name
字段启动对现有堆栈的删除。S3 bucket
这是用来存储 CloudFormation 模板的。
IAM每个 Lambda 函数的角色和一个服务角色 CloudFormation
每个 Lambda 函数都有其独特的IAM角色,具有完成其任务的最低权限权限。例如,
Tenant On-boarding
Lambda 函数具有对 DynamoDB 的读/写访问权限,而Tenant Infrastructure
Lambda 函数对 DynamoDB 流只有读取权限。为租户堆栈置备创建了自定义 CloudFormation 服务角色。此服务角色包含 CloudFormation 堆栈配置的其他权限(例如,AWSKMS密钥)。这会在 Lambda 之间划分角色 CloudFormation ,以避免对单个角色(基础设施 Lambda 角色)拥有所有权限。
允许强大操作(例如创建和删除 CloudFormation 堆栈)的权限被锁定,并且仅允许在以开头的资源上使用
tenantcluster-
。唯一的例外是 AWSKMS,因为它的资源命名约定。从中提取的租户名称API将与其他验证检查tenantcluster-
一起加在前面(仅带破折号的字母数字,为了适应大多数AWS资源命名,限制在 30 个字符以内)。这样可以确保租户名称不会意外导致核心基础设施堆栈或资源中断。
租户技术堆栈
CloudFormation 模板存储在 S3 存储桶中。该模板提供租户特定的AWSKMS密钥、 CloudWatch 警报、SNS主题、SQS队列和策略。SQS
Amazon SNS 和 Amazon 使用该密AWSKMS钥对其消息SQS进行数据加密。AwsSolutions-SNS2 和 AwsSolutions-
该SQS策略用于 Amazon SQS 队列,允许创建的SNS主题将消息传送到队列。如果没有该SQS政策,访问将被拒绝。有关更多信息,请参阅 Amazon SNS 文档。