本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 C# 和 AWS CDK 在孤立模型的 SaaS 架構中加入租用戶
由 Tabby Ward (AWS)、Susmitha Reddy Gankidi (AWS) 和 Vijai Anand Ramalingam (AWS) 建立
Summary
軟體即服務 (SaaS) 應用程式可以使用各種不同的架構模型建置。孤島模型是指提供租戶專用資源的架構。
SaaS 應用程式依賴無摩擦模型,將新租戶引入其環境。這通常需要協調多個元件,才能成功佈建和設定建立新租用戶所需的所有元素。在 SaaS 架構中,此程序稱為租戶加入。應針對每個 SaaS 環境使用基礎設施做為加入程序中的程式碼,以完全自動化加入。
此模式會引導您完成在 Amazon Web Services (AWS) 上建立租用戶和佈建租用戶基本基礎設施的範例。模式使用 C# 和 AWS 雲端開發套件 (AWS CDK)。
由於此模式會建立帳單警示,我們建議在美國東部 (維吉尼亞北部) 或 us-east-1 AWS 區域部署堆疊。如需詳細資訊,請參閱 AWS 文件。
先決條件和限制
先決條件
作用中的 AWS 帳戶
。 具有足夠 IAM 存取權的 AWS Identity and Access Management (IAM) 主體,可為此模式建立 AWS 資源。如需詳細資訊,請參閱 IAM 角色。
安裝 Amazon Command Line Interface (AWS CLI) 並設定 AWS CLI 以執行 AWS CDK 部署。
Visual Studio 2022
已下載並安裝,或 Visual Studio Code 已下載並安裝。 .NET Core 3.1 或更新版本
(C# AWS CDK 應用程式需要) 已安裝 Amazon.Lambda.Tools
。
限制
AWS CDK 使用 AWS CloudFormation
,因此 AWS CDK 應用程式受限於 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 Logs (日誌群組和日誌)。您必須透過 AWS 管理主控台 Amazon CloudWatch 主控台或透過 API 手動清除日誌。
此模式設定為範例。針對生產用途,請評估下列設定,並根據您的業務需求進行變更:
此範例中的 AWS Simple Storage Service (Amazon S3)
儲存貯體尚未啟用版本控制以簡化操作。視需要評估和更新設定。 此範例會設定 Amazon API Gateway
REST API 端點,無需身分驗證、授權或限流即可簡化。對於生產用途,我們建議您將系統與商業安全基礎設施整合。評估此設定並視需要新增必要的安全設定。 在此租戶基礎設施範例中,Amazon Simple Notification Service (Amazon SNS)
和 Amazon Simple Queue Service (Amazon SQS) 只具有最低設定。每個租用戶的 AWS Key Management Service (AWS KMS) 會開啟帳戶中的 Amazon CloudWatch 和 Amazon SNS 服務,以根據 AWS KMS 金鑰政策使用。設定只是範例預留位置。根據您的業務使用案例,視需要調整設定。 整個設定,包括但不限於使用 AWS CloudFormation 的 API 端點和後端租用戶佈建和刪除,僅涵蓋基本的快樂路徑案例。根據您的業務需求,使用必要的重試邏輯、額外的錯誤處理邏輯和安全邏輯來評估和更新設定。
範例程式碼使用up-to-date cdk-nag
進行測試,以在撰寫本文時檢查政策。未來可能會強制執行新政策。這些新政策可能需要您根據建議手動修改堆疊,才能部署堆疊。檢閱現有的程式碼,以確保其符合您的業務需求。 此程式碼倚賴 AWS CDK 產生隨機尾碼,而不是倚賴大多數建立資源的靜態指派實體名稱。此設定旨在確保這些資源是唯一的,並且不會與其他堆疊衝突。如需詳細資訊,請參閱 AWS CDK 文件。根據您的業務需求進行調整。
此範例程式碼會將 .NET Lambda 成品封裝至以 Docker 為基礎的映像,並使用 Lambda 提供的容器映像執行時間執行。容器映像執行時間對於標準傳輸和儲存機制 (容器登錄檔) 和更準確的本機測試環境 (透過容器映像) 具有優勢。您可以切換專案以使用 Lambda 提供的 .NET 執行時間,以減少 Docker 映像的建置時間,但接著您需要設定傳輸和儲存機制,並確保本機設定符合 Lambda 設定。調整程式碼以符合使用者的業務需求。
產品版本
AWS CDK 2.45.0 版或更新版本
Visual Studio 2022
架構
技術堆疊
Amazon API Gateway
AWS CloudFormation
Amazon CloudWatch
Amazon DynamoDB
AWS Identity and Access Management (IAM)
AWS KMS
AWS Lambda
Amazon S3
Amazon SNS
Amazon SQS
架構
下圖顯示租戶堆疊建立流程。如需控制平面和租戶技術堆疊的詳細資訊,請參閱其他資訊一節。

租戶堆疊建立流程
使用者傳送具有 JSON 中新租用戶承載 (租用戶名稱、租用戶描述) 的 POST API 請求至 Amazon API Gateway 託管的 REST API。API Gateway 會處理請求,並將其轉送至後端 Lambda 租戶加入函數。在此範例中,沒有授權或身分驗證。在生產設定中,此 API 應與 SaaS 基礎設施安全系統整合。
租戶加入函數會驗證請求。然後,它會嘗試將租用戶記錄存放在 Amazon DynamoDB 租用戶加入資料表中,其中包含租用戶名稱、產生的租用戶通用唯一識別符 (UUID) 和租用戶描述。
DynamoDB 儲存記錄後,DynamoDB 串流會啟動下游 Lambda 租用戶基礎設施函數。
租戶基礎設施 Lambda 函數會根據收到的 DynamoDB 串流來運作。如果串流適用於 INSERT 事件,則函數會使用串流的 NewImage 區段 (最新更新記錄,租戶名稱欄位) 來叫用 CloudFormation,以使用存放在 S3 儲存貯體中的範本建立新的租戶基礎設施。CloudFormation 範本需要租用戶名稱參數。
AWS CloudFormation 會根據 CloudFormation 範本和輸入參數建立租戶基礎設施。
每個租戶基礎設施設定都有 CloudWatch 警示、帳單警示和警示事件。
警示事件會變成 SNS 主題的訊息,由租戶的 AWS KMS 金鑰加密。
SNS 主題會將收到的警示訊息轉送至 SQS 佇列,該佇列由租戶的 AWS KMS 加密以進行加密金鑰。
其他系統可以與 Amazon SQS 整合,以根據佇列中的訊息執行動作。在此範例中,若要保持程式碼通用,傳入的訊息會保留在佇列中,且需要手動刪除。
租戶堆疊刪除流程
使用者將具有 JSON 中新租用戶承載 (租用戶名稱、租用戶描述) 的 DELETE API 請求傳送至 Amazon API Gateway 託管的 REST API,這會處理請求並轉送至租用戶加入函數。在此範例中,沒有授權或身分驗證。在生產設定中,此 API 將與 SaaS 基礎設施安全系統整合。
租戶加入函數會驗證請求,然後嘗試從租戶加入資料表中刪除租戶記錄 (租戶名稱)。
DynamoDB 成功刪除記錄後 (記錄存在於資料表中並刪除),DynamoDB 串流會啟動下游 Lambda 租用戶基礎設施函數。
租戶基礎設施 Lambda 函數會根據收到的 DynamoDB 串流記錄來運作。如果串流是用於 REMOVE 事件,則函數會使用記錄的 OldImage 區段 (記錄資訊和租用戶名稱欄位,在最新變更之前為刪除),根據該記錄資訊啟動現有堆疊的刪除。
AWS CloudFormation 會根據輸入刪除目標租用戶堆疊。
工具
AWS 服務
Amazon API Gateway 可協助您建立、發佈、維護、監控和保護任何規模的 REST、HTTP 和 WebSocket APIs。
AWS 雲端開發套件 (AWS CDK) 是一種軟體開發架構,可協助您在程式碼中定義和佈建 AWS 雲端基礎設施。
AWS CDK Toolkit 是命令列雲端開發套件,可協助您與 AWS Cloud Development Kit (AWS CDK) 應用程式互動。
AWS Command Line Interface (AWS CLI) 是一種開放原始碼工具,可協助您透過命令列 shell 中的命令與 AWS 服務互動。
AWS CloudFormation 可協助您設定 AWS 資源、快速且一致地佈建資源,以及在 AWS 帳戶和區域的整個生命週期中管理這些資源。
Amazon DynamoDB 是一項全受管 NoSQL 資料庫服務,可提供快速、可預期且可擴展的效能。
AWS Identity and Access Management (IAM) 可透過控制已驗證並獲授權使用的人員,協助您安全地管理對 AWS 資源的存取。
AWS Key Management Service (AWS KMS) 可協助您建立和控制密碼編譯金鑰,以協助保護您的資料。
AWS Lambda 是一種運算服務,可協助您執行程式碼,而不需要佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展,因此您只需按使用的運算時間付費。
Amazon Simple Storage Service (Amazon S3) 是一種雲端型物件儲存服務,可協助您儲存、保護和擷取任何數量的資料。
Amazon Simple Notification Service (Amazon SNS) 可協助您協調和管理發佈者和用戶端之間的訊息交換,包括 Web 伺服器和電子郵件地址。
Amazon Simple Queue Service (Amazon SQS) 提供安全、耐用且可用的託管佇列,可協助您整合和分離分散式軟體系統和元件。
AWS Toolkit for Visual Studio 是 Visual Studio 整合開發環境 (IDE) 的外掛程式。Toolkit for Visual Studio 支援開發、偵錯和部署使用 AWS 服務的 .NET 應用程式。
其他工具
Visual Studio
是一種 IDE,其中包含編譯器、程式碼完成工具、圖形設計師和其他支援軟體開發的功能。
Code
此模式的程式碼位於 SaaS Architecture for Silo Model APG 範例儲存庫中的租戶加入
史詩
任務 | 描述 | 所需的技能 |
---|---|---|
驗證 Node.js 安裝。 | 若要確認您的本機電腦上已安裝 Node.js,請執行下列命令。
| AWS 管理員、AWS DevOps |
安裝 AWS CDK Toolkit。 | 若要在本機電腦上安裝 AWS CDK Toolkit,請執行下列命令。
如果未安裝 npm,您可以從 Node.js 網站安裝。 | AWS 管理員、AWS DevOps |
驗證 AWS CDK Toolkit 版本。 | 若要確認 AWS CDK Toolkit 版本已正確安裝在您的機器上,請執行下列命令。
| AWS 管理員、AWS DevOps |
任務 | 描述 | 所需的技能 |
---|---|---|
複製儲存庫。 | 複製儲存庫 在 Visual Studio 2022 中,開啟 下列資源會建立為此堆疊的一部分:
| AWS 管理員、AWS DevOps |
檢閱 CloudFormation 範本。 | 在 範本會佈建租戶特定的基礎設施。在此範例中,它會佈建 AWS KMS 金鑰、Amazon SNS、Amazon SQS 和 CloudWatch 警示。 | 應用程式開發人員、AWS DevOps |
檢閱租戶加入函數。 | 開啟 開啟 請注意,下列 NuGet 套件會新增為
| 應用程式開發人員、AWS DevOps |
檢閱租戶 InfraProvisioning 函數。 | 導覽至 開啟 開啟 請注意,下列 NuGet 套件會新增為
| 應用程式開發人員、AWS DevOps |
任務 | 描述 | 所需的技能 |
---|---|---|
建置解決方案。 | 若要建置解決方案,請執行下列步驟:
注意在建置解決方案之前,請務必將 | 應用程式開發人員 |
引導 AWS CDK 環境。 | 開啟 Windows 命令提示字元,並導覽至可使用
如果您已為登入資料建立 AWS 設定檔,請使用 命令搭配您的設定檔。
| AWS 管理員、AWS DevOps |
列出 AWS CDK 堆疊。 | 若要列出要建立做為此專案一部分的所有堆疊,請執行下列命令。
如果您已為登入資料建立 AWS 設定檔,請使用 命令搭配您的設定檔。
| AWS 管理員、AWS DevOps |
檢閱要建立的 AWS 資源。 | 若要檢閱將建立為此專案一部分的所有 AWS 資源,請執行下列命令。
如果您已為登入資料建立 AWS 設定檔,請使用 命令搭配您的設定檔。
| AWS 管理員、AWS DevOps |
使用 AWS CDK 部署所有 AWS 資源。 | 若要部署所有 AWS 資源,請執行下列命令。
如果您已為登入資料建立 AWS 設定檔,請使用 命令搭配您的設定檔。
部署完成後,請從命令提示中的輸出區段複製 API URL,如下列範例所示。
| AWS 管理員、AWS DevOps |
任務 | 描述 | 所需的技能 |
---|---|---|
建立新的租用戶。 | 若要建立新的租用戶,請傳送下列 curl 請求。
將預留位置變更為 AWS CDK
下列範例顯示輸出。
| 應用程式開發人員、AWS 管理員、AWS DevOps |
驗證 DynamoDB 中新建立的租戶詳細資訊。 | 若要在 DynamoDB 中驗證新建立的租戶詳細資訊,請執行下列步驟。
| 應用程式開發人員、AWS 管理員、AWS DevOps |
驗證新租用戶的堆疊建立。 | 根據 CloudFormation 範本,確認新堆疊已成功建立並使用新建立租用戶的基礎設施進行佈建。
| 應用程式開發人員、AWS 管理員、AWS DevOps |
刪除租戶堆疊。 | 若要刪除租戶堆疊,請傳送下列 curl 請求。
將預留位置
下列範例顯示輸出。
| 應用程式開發人員、AWS DevOps、AWS 管理員 |
驗證現有租用戶的堆疊刪除。 | 若要確認現有租用戶堆疊已刪除,請執行下列步驟:
| 應用程式開發人員、AWS 管理員、AWS DevOps |
任務 | 描述 | 所需的技能 |
---|---|---|
銷毀環境。 | 在清除堆疊之前,請確定下列事項:
測試完成後,AWS CDK 可以透過執行下列命令來銷毀所有堆疊和相關資源。
如果您已為登入資料建立 AWS 設定檔,請使用該設定檔。 確認堆疊刪除提示以刪除堆疊。 | AWS 管理員、AWS DevOps |
清除 Amazon CloudWatch Logs。 | 堆疊刪除程序不會清除堆疊產生的 CloudWatch Logs (日誌群組和日誌)。使用 CloudWatch 主控台或 API 手動清除 CloudWatch 資源。 | 應用程式開發人員、AWS DevOps、AWS 管理員 |
相關資源
其他資訊
控制平面技術堆疊
以 .NET 撰寫的 CDK 程式碼用於佈建控制平面基礎設施,其中包含下列資源:
API Gateway
做為控制平面堆疊的 REST API 進入點。
租用戶加入 Lambda 函數
此 Lambda 函數是由 API Gateway 使用 m 方法啟動。
POST 方法 API 請求會導致 (
tenant name
、tenant description
) 插入 DynamoDBTenant 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 (S3 儲存貯體)
這是用於存放 CloudFormation 範本。
每個 Lambda 函數的 IAM 角色和 CloudFormation 的服務角色
每個 Lambda 函數都有其唯一的 IAM 角色,具有實現其任務的最低權限許可。例如,
Tenant On-boarding
Lambda 函數具有 DynamoDB 的讀取/寫入存取權,而Tenant Infrastructure
Lambda 函數只能讀取 DynamoDB 串流。為租戶堆疊佈建建立自訂 CloudFormation 服務角色。此服務角色包含 CloudFormation 堆疊佈建的其他許可 (例如 AWS KMS 金鑰)。這會在 Lambda 和 CloudFormation 之間分割角色,以避免單一角色 (基礎設施 Lambda 角色) 的所有許可。
允許強大動作 (例如建立和刪除 CloudFormation 堆疊) 的許可會遭到鎖定,且僅允許在以 開頭的資源上進行
tenantcluster-
。例外狀況是 AWS KMS,因為其資源命名慣例。從 API 擷取的租用戶名稱將與其他驗證檢查tenantcluster-
一起加上 (僅含破折號的英數字元,且限制為少於 30 個字元,以符合大多數 AWS 資源命名)。這可確保租戶名稱不會意外導致核心基礎設施堆疊或資源中斷。
租戶技術堆疊
CloudFormation 範本存放在 S3 儲存貯體中。範本會佈建租戶特定的 AWS KMS 金鑰、CloudWatch 警示、SNS 主題、SQS 佇列和 SQS 政策。
Amazon SNS 和 Amazon SQS 會將 AWS KMS 金鑰用於其訊息的資料加密。AwsSolutions-SNS2 和 AwsSolutions-SQS2
SQS 政策用於 Amazon SQS 佇列,以允許建立的 SNS 主題將訊息傳遞至佇列。如果沒有 SQS 政策,則會拒絕存取。如需詳細資訊,請參閱 Amazon SNS 文件。