設定對 Amazon DynamoDB 的跨帳戶存取權 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

設定對 Amazon DynamoDB 的跨帳戶存取權

創建者沙希達爾米亞 (AWS), 埃斯特萬塞爾納·帕拉 (), 和伊霍爾塔·奧吉爾 (AWS) AWS

環境:生產

技術:資料庫;安全性、身分識別、合規性

AWS服務:Amazon DynamoDB 支援;AWSIdentity and Access Management;Lambda AWS

Summary

此模式說明使用以資源為基礎的政策設定跨帳戶存取 Amazon DynamoDB 的步驟。對於使用 DynamoDB 的工作負載而言,使用工作負載隔離策略將安全威脅降到最低並符合合規要求變得越來越普遍。實作工作負載隔離策略通常需要使用 AWS Identity and Access Management (IAM) 身分識別原則,跨帳戶和跨區域存取 DynamoDB 資源。這涉及設定IAM權限,以及在之間建立信任關係 AWS 帳戶。

DynamoDB 的資源型原則可大幅簡化跨帳戶工作負載的安全狀態。此模式提供步驟和範例程式碼,以示範如何將 AWS Lambda 函數設定 AWS 帳戶 為將資料寫入不同帳戶中的 DynamoDB 資料庫表格。

先決條件和限制

先決條件

  • 兩個活躍 AWS 帳戶。此模式將這些帳戶稱為「帳戶 A」和「帳戶 B」。

  • AWS Command Line Interface (AWS CLI) 已安裝設定為存取帳戶 A,以建立 DynamoDB 表格。此模式中的其他步驟提供使用IAM、DynamoDB 和 Lambda 主控台的指示。如果您打算 AWS CLI 改用,請將其設定為存取這兩個帳戶。

限制

  • 有些 AWS 服務 並不是在所有可用 AWS 區域。如需區域可用性資訊,請參閱AWS 服務 依區域。對於特定端點,請參閱服務端點和配額頁面,然後選擇服務的連結。

架構

下圖顯示單一帳戶架構。 AWS Lambda、Amazon 彈性運算雲端 (AmazonEC2) 和 DynamoDB 都在同一個帳戶中。在這個案例中,Lambda 函數和 Amazon EC2 執行個體可以存取 DynamoDB。若要授與 DynamoDB 表的存取權,您可以在中建立以身分識別為基礎的原則IAM,也可以在 DynamoDB 中建立以資源為基礎的原則。

使用IAM權限存取相同帳戶中的 DynamoDB 表格。

下圖顯示了多帳戶架構。如果其中一個資源 AWS 帳戶 需要存取不同帳戶中的 DynamoDB 表,您需要在 DynamoDB 中設定以資源為基礎的政策,以授予所需的存取權。例如,在下圖中,帳戶 A 中 DynamoDB 表的存取權會授與帳戶 B 中的 Lambda 函數,方法是使用以資源為基礎的政策。

使用以資源為基礎的策略存取不同帳戶中的 DynamoDB 表格。

此模式描述 Lambda 和 DynamoDB 之間的跨帳戶存取。 AWS 服務 如果兩個帳戶都設定了適當的權限,您可以對其他使用類似的步驟。例如,如果您想要在帳戶 A 中提供對 Amazon Simple Storage Service (Amazon S3) 貯體的 Lambda 函數存取權,則可以在 Amazon S3 中建立以資源為基礎的政策,並將許可新增至帳戶 B 中的 Lambda 執行角色

工具

AWS 服務

  • Amazon DynamoDB 是全受管的無SQL資料庫服務,可提供快速、可預測且可擴展的效能。

  • AWS Identity and Access Management (IAM) 透過控制經驗證和授權使用資AWS源的人員,協助您安全地管理對資源的存取。

  • AWS Lambda 是一項運算服務,可協助您執行程式碼,無需佈建或管理伺服器。它只會在需要時執行程式碼並自動調整規模,因此您只需為使用的運算時間付費。

Code

此模式包含「其他資訊」一節中的範例程式碼,以顯示如何在帳戶 B 中設定 Lambda 函數,以寫入帳戶 A 中的 DynamoDB 表格。此程式碼僅供說明和測試用途使用。如果您要在生產環境中實作此模式,請使用程式碼做為參考,並針對您自己的環境進行自訂。

最佳實務

史诗

任務描述所需技能

在帳戶 B 中建立策略。

此IAM原則允許對帳戶 A 中的 DynamoDB 表PutItem執行動作。

  1. 在中登入帳戶 A AWS Management Console。

  2. 開啟主IAM控台

  3. 在導覽窗格中,選擇 Policies (政策),然後選擇 Create policy (建立政策)

  4. 在 [指定權限] 頁面上,針對原則編輯器選取JSON

  5. 輸入下列政策。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Action": "dynamodb:PutItem", "Resource": "arn:aws:dynamodb:<Region>:<Account-A-ID>:table/Table-Account-A" } ] }
  6. <Account-A-ID>以您的值取代<Region>和,然後選擇 [下一步]。

  7. 策略名稱中,輸入策略的唯一名稱,例如DynamoDB-PutItem-Policy

  8. (選擇性) 新增原則說明。

  9. 選擇 建立政策

一般 AWS

在帳戶 B 中建立角色。

帳戶 B 中的 Lambda 函數使用此IAM角色存取帳戶 A 中的 DynamoDB 表格。

  1. 開啟主IAM控台

  2. 在導覽窗格中,選擇 Roles (角色),然後選擇 Create role (建立角色)

  3. Select trusted entity (選取受信任實體) 中,請選擇 AWS 服務

  4. 在 [使用案例] 區段中,選擇 [Lambda]。

  5. 選擇下一步:許可

  6. 在 [篩選器原則] 方塊中,輸入 DynamoDB

  7. 在 DynamoDB 原則清單中,選擇。DynamoDB-PutItem-Policy

  8. 清除 [篩選器原則] 方塊,然後輸入 Lambda

  9. 在 Lambda 政策清單中,選擇AWSLambdaExecute

  10. 選擇「下一步」:命名、複查和建立

  11. 針對 Role name (角色名稱),為您的角色輸入唯一名稱 (例如 DynamoDB-PutItemAccess)。

  12. (選擇性) 新增角色說明。

  13. (選用) 藉由連接標籤作為鍵值對,將中繼資料新增至角色。

  14. 選擇建立角色

如需有關建立角色的詳細資訊,請參閱IAM文件集

一般 AWS

請注意角色ARN。

  1. 開啟主IAM控台

  2. 在導覽窗格中,選擇角色

  3. 在搜尋方塊中輸入DynamoDB-PutItemAccess,然後選擇角色。

  4. 在角色的摘要頁面上,複製 Amazon 資源名稱 (ARN)。您可以在設ARN定 Lambda 函數時使用。

一般 AWS
任務描述所需技能

建立 DynamoDB 資料表。

使用下列 AWS CLI 命令建立 DynamoDB 表格。

aws dynamodb create-table \ --table-name Table-Account-A \ --attribute-definitions \ AttributeName=category,AttributeType=S \ AttributeName=item,AttributeType=S \ --key-schema \ AttributeName=category,KeyType=HASH \ AttributeName=item,KeyType=RANGE \ --provisioned-throughput \ ReadCapacityUnits=5,WriteCapacityUnits=5 \ --resource-policy \ '{ "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<Account-B-ID>:role/<Role-Name>" }, "Action": "dynamodb:PutItem", "Resource": "arn:aws:dynamodb:<Region>:<Account-A-ID>:table/Table-Account-A" } ] }'

取代此程式碼範例中的下列項目:

  • <Account-B-ID>是帳戶 B 的識別碼。

  • <Role-Name>是您建立的IAM角色名稱,例如DynamoDB-PutItemAccess

  • <Region>是您 AWS 區域 要建立動 DynamoDB 資料表的位置。

  • <Account-A-ID>是帳戶 A 的識別碼。

備註:您可以使用--resource-policy旗標,在create-table陳述式中指定以資源為基礎的原則組態。此政策參照帳戶 A 中ARN的 DynamoDB 表格。

如需有關建立資料表的詳細資訊,請參閱 DynamoDB 文件。

一般 AWS
任務描述所需技能

建立 Lambda 函數以將資料寫入 DynamoDB 資料。

  1. 在中登入帳戶 B AWS Management Console。

  2. 開啟 Lambda 主控台

  3. 在導覽窗格中,選擇 [數],然後選擇 [建立函數]。

  4. 針對名稱,輸入 lambda_write_function

  5. 在「執行階段」中,選擇 Python 3.8 或更新版本。

  6. 在 [變更預設執行角色] 底下,選擇 [使用現有角色]。

  7. 對於現有角色,請選擇您建立的IAM角色,例如DynamoDB-PutItemAccess

  8. 選擇建立函數

  9. 在「程式」索引標籤中,貼上此模式「其他資訊」區段中提供的範例程式碼。取代此程式碼範例中的下列項目:

    • <Account-A-ID>是帳戶 A 的識別碼。

    • <Region>是您建立 DynamoDB 資料表的 AWS 區域 位置。

  10. 選擇部署

  11. 選擇 測試。這會提示您設定測試事件。使用您偏好的名稱 (例如) 建立新事件MyTestEventForWrite,然後儲存組態。

  12. 再次選擇 Test (測試)。這會使用您提供的事件名稱執行 Lambda 函數。

  13. 檢查函數的輸出。它應指出函數存取帳戶 A 中的 DynamoDB 表格,並且能夠將資料寫入該函數。

如需建立 Lambda 函數的詳細資訊,請參閱 Lambda 文件

一般 AWS
任務描述所需技能

刪除資源。

若要避免產生與此模式中建立的資源相關聯的成本,請執行下列動作以刪除這些資源:

  1. 在帳戶 B 中,刪除您為連線至 DynamoDB 而建立的 Lambda 函數。如需指示,請參閱 L ambda 文件

  2. 在帳戶 A 中,刪除您建立的 DynamoDB 表格。如需指示,請參閱 DynamoDB 文件。

  3. 為了獲得安全性最佳作法,請在不再需要的IAM原則 (DynamoDB-PutItem-Policy) 時刪除它。如需詳細資訊,請參閱IAM文件

  4. 基於安全性最佳作法,請在不再需要IAM角色 (DynamoDB-PutItemAccess) 時刪除角色。如需詳細資訊,請參閱IAM文件

一般 AWS

故障診斷

問題解決方案

建立 Lambda 函數時,您會收到ResourceNotFoundException錯誤訊息。

確認您已正確輸入帳戶 A 的 AWS 區域 和識別碼。這些是 DynamoDB 表ARN的一部分。

相關資源

其他資訊

範例程式碼

import boto3 from datetime import datetime dynamodb_client = boto3.client('dynamodb') def lambda_handler(event, context): now = datetime.now().isoformat() data = dynamodb_client.put_item(TableName='arn:aws:dynamodb:<Region>:<Account-A-ID>:table/Table-Account-A', Item={"category": {"S": "Fruit"},"item": {"S": "Apple"},"time": {"S": now}}) return data

附註:當 DynamoDB 用戶端具現化時,會提供 DynamoDB 表格ARN的資料表,而不是資料表名稱。這是必要的,以便 Lambda 函數在執行時連接到正確的 DynamoDB 表。