

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

# Amazon DynamoDB 中的安全與合規
<a name="security"></a>

的雲端安全性 AWS 是最高優先順序。身為 AWS 客戶，您可以受益於資料中心和網路架構，這些架構專為滿足最安全敏感組織的需求而建置。

安全性是 AWS 與您之間的共同責任。[‬共同責任模型‭](https://aws.amazon.com/compliance/shared-responsibility-model/)‬ 將此描述為雲端*‬的‭*‬安全和雲端*‬內*‬的安全：
+ **雲端的安全性** – AWS 負責保護在 AWS Cloud 中執行 AWS 服務的基礎設施。 AWS 也為您提供可安全使用的服務。第三方稽核人員定期檢測及驗證安全的效率也是我們 [AWS 合規計劃](https://aws.amazon.com/compliance/programs/)的一部分。若要進一步了解適用於 DynamoDB 的合規計劃，請參閱[合規計劃範圍內的AWS 服務](https://aws.amazon.com/compliance/services-in-scope/)。
+ **雲端的安全性** – 您的責任取決於您使用 AWS 的服務。您也必須對資料敏感度、組織要求，以及適用法律和法規等其他因素負責。

本文件會協助您了解使用 DynamoDB 時共同的責任模型的適用情形。下列主題將示範如何設定 DynamoDB 以達到您的安全和合規目標。您也將了解如何使用其他 AWS 服務，協助您監控和保護 DynamoDB 資源。

**Topics**
+ [AWS Amazon DynamoDB 的 受管政策](ddb-security-iam.awsmanpol.md)
+ [對 DynamoDB 使用資源型政策](access-control-resource-based.md)
+ [搭配 DynamoDB 使用屬性型存取控制](attribute-based-access-control.md)
+ [DynamoDB 中的資料保護](data-protection.md)
+ [AWS Identity and Access Management (IAM) 和 DynamoDB](identity-and-access-mgmt.md)
+ [DynamoDB 的業界合規驗證](Compliance.md)
+ [Amazon DynamoDB 中的資料復原及災難復原功能](disaster-recovery-resiliency.md)
+ [Amazon DynamoDB 中的基礎設施安全性](network-isolation.md)
+ [AWS PrivateLink 適用於 DynamoDB](privatelink-interface-endpoints.md)
+ [Amazon DynamoDB 中的組態與漏洞分析](configuration-vulnerability.md)
+ [Amazon DynamoDB 的安全最佳實務](best-practices-security.md)

# AWS Amazon DynamoDB 的 受管政策
<a name="ddb-security-iam.awsmanpol"></a>

DynamoDB 使用 AWS 受管政策來定義服務執行特定動作所需的一組許可。DynamoDB 會維護和更新其 AWS 受管政策。您無法變更 AWS 受管政策中的許可。如需 AWS 受管政策的詳細資訊，請參閱《IAM 使用者指南》中的 [AWS 受管政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)。

DynamoDB 可能會偶爾將其他許可新增至 AWS 受管政策，以支援新功能。此類型的更新會影響已連接政策的所有身分識別 (使用者、群組和角色)。當新功能啟動或新操作可用時，最有可能更新 AWS 受管政策。DynamoDB 不會從 AWS 受管政策中移除許可，因此政策更新不會破壞您現有的許可。如需 AWS 受管政策的完整清單，請參閱 [AWS 受管政策](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/policy-list.html)。

## AWS 受管政策：DynamoDBReplicationServiceRolePolicy
<a name="ddb-security-iam.awsmanpol.policy"></a>

您無法將 `DynamoDBReplicationServiceRolePolicy` 政策附加至 IAM 實體。此政策會連接到服務連結角色，而此角色可讓 DynamoDB 代表您執行動作。如需詳細資訊，請參閱[搭配全域資料表使用 IAM](globaltables-security.md)。

此政策會授予許可，允許服務連結角色執行全域資料表複本之間的資料。也會授與管理許可，以代表您管理全域資料表複本。

**許可詳細資訊**

此政策會授予下列許可：
+ `dynamodb` – 執行資料複寫並管理資料表複本。
+ `application-autoscaling` – 擷取與管理資料表自動擴展設定
+ `account` – 擷取區域狀態以評估複本可存取性。
+ `iam` – 若尚未存在服務連結角色，則為應用程式自動擴展建立該服務連結角色。

您可以在[這裡](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/DynamoDBReplicationServiceRolePolicy.html)找到此受管政策的定義。

## AWS 受管政策：AmazonDynamoDBFullAccess\$1v2
<a name="ddb-security-iam.awsmanpol.fullaccesspolicy-v2"></a>

範圍受限的 `AmazonDynamoDBFullAccess_v2` 政策會授與使用者特定的存取權限。您可將 `AmazonDynamoDBFullAccess_v2` 政策連接到 IAM 身分。此政策會授予 Amazon DynamoDB 資源的管理存取權，並授予 IAM 身分 （例如使用者、群組或角色） 存取權給與 DynamoDB 整合 AWS 服務 的 ，以使用所有 DynamoDB 功能。使用此政策可存取 AWS 管理主控台中所有可用的 DynamoDB 功能。

**許可詳細資訊**

此政策包含以下許可：
+ `Amazon DynamoDB`
+ `DynamoDB Accelerator`
+ `AWS KMS`
+ `AWS Resource Groups Tagging`
+ `Lambda`
+ `Application Auto Scaling`
+ `CloudWatch`
+ `Amazon Kinesis`
+ `Amazon EC2`
+ `IAM`

若要以 `JSON` 格式檢視此政策，請參閱 [AmazonDynamoDBFullAccess\$1v2](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBFullAccess_v2.html)。

## AWS 受管政策：AmazonDynamoDBReadOnlyAccess
<a name="ddb-security-iam.awsmanpol.readonlypolicy"></a>

您可將 `AmazonDynamoDBReadOnlyAccess` 政策連接到 IAM 身分。

此政策授與對 Amazon DynamoDB 的唯讀存取權。

**許可詳細資訊**

此政策包含以下許可：
+ `Amazon DynamoDB` – 提供對 Amazon DynamoDB 的唯讀存取權。
+ `Amazon DynamoDB Accelerator (DAX)` – 提供對 Amazon DynamoDB Accelerator (DAX) 的唯讀存取權。
+ `Application Auto Scaling` – 允許主體檢視來自 Application Auto Scaling 的設定。這是必要的，讓使用者能檢視附加於資料表的自動擴展政策。
+ `CloudWatch` – 允許主體檢視於 CloudWatch 中設定的指標資料與警示。這是必要的，以便使用者檢視資料表的計費大小與 CloudWatch 警示。
+ `AWS Data Pipeline` – 允許主體檢視 AWS Data Pipeline 和相關聯的物件。
+ `Amazon EC2`：允許主體檢視 Amazon EC2 VPC、子網路與安全群組。
+ `IAM` – 允許主體檢視 IAM 角色。
+ `AWS KMS` – 允許主體檢視其中設定的金鑰 AWS KMS。這是必要的 AWS KMS keys ，以便使用者可以檢視他們在其帳戶中建立和管理 。
+ `Amazon SNS` – 允許主體列出 Amazon SNS 的主題與其訂閱。
+ `AWS Resource Groups` – 允許主體檢視資源群組及其查詢。
+ `AWS Resource Groups Tagging` – 允許主體列出區域內所有已標記或先前標記過的資源。
+ `Kinesis` – 允許主體檢視 Kinesis 資料串流的描述資訊。
+ `Amazon CloudWatch Contributor Insights` – 允許主體檢視由 Contributor Insights 規則收集的時間序列資料。

若要以 `JSON` 格式檢視此政策，請參閱 [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html)。

## AWS 受管政策的 DynamoDB 更新
<a name="ddb-security-iam.awsmanpol.updates"></a>

此資料表顯示 DynamoDB AWS 存取管理政策的更新。


****  

| 變更 | 描述 | 變更日期 | 
| --- | --- | --- | 
| AmazonDynamoDBFullAccess – 已棄用 | 此政策已由名為 `AmazonDynamoDBFullAccess_v2` 的範圍受限政策取代。 **2025 年 4 月**之後，您將無法將 `AmazonDynamoDBFullAccess` 政策附加至任何新的使用者、群組或角色。如需詳細資訊，請參閱[AWS 受管政策：AmazonDynamoDBFullAccess\$1v2](#ddb-security-iam.awsmanpol.fullaccesspolicy-v2)。  | 2025 年 4 月 28 日 | 
| AmazonDynamoDBReadOnlyAccess 更新現有政策 | AmazonDynamoDBReadOnlyAccess 已新增下列權限：dynamodb:GetAbacStatus 與 dynamodb:UpdateAbacStatus。這些許可可讓您檢視 ABAC 狀態，並在 AWS 帳戶 目前區域中為 啟用 ABAC。 | 2024 年 11 月 18 日 | 
| AmazonDynamoDBReadOnlyAccess 更新現有政策 | AmazonDynamoDBReadOnlyAccess 新增權限 dynamodb:GetResourcePolicy。此權限可讓您讀取附加於 DynamoDB 資源的資源型政策。 | 2024 年 3 月 20 日 | 
| DynamoDBReplicationServiceRolePolicy 更新現有政策 | DynamoDBReplicationServiceRolePolicy 新增權限 dynamodb:GetResourcePolicy。此權限允許服務連結角色讀取附加於 DynamoDB 資源的資源型政策。 | 2023 年 12 月 15 日 | 
| DynamoDBReplicationServiceRolePolicy 更新現有政策 | DynamoDBReplicationServiceRolePolicy 新增權限 account:ListRegions。此權限允許服務連結角色評估複本的存取 | 2023 年 5 月 10 日 | 
| DynamoDBReplicationServiceRolePolicy 已新增至受管政策清單 | 已新增有關 DynamoDB 全域資料表服務連結角色使用之受管政策 DynamoDBReplicationServiceRolePolicy 的資訊。 | 2023 年 5 月 10 日 | 
| DynamoDB 全域資料表已開始追蹤其變更 | DynamoDB 全域資料表開始追蹤其 AWS 受管政策的變更。 | 2023 年 5 月 10 日 | 

# 對 DynamoDB 使用資源型政策
<a name="access-control-resource-based"></a>

DynamoDB 支援資料表、索引與串流的資源型政策。資源型政策可讓您指定有權存取各項資源的人員，以及允許前述人員對各項資源執行的動作，藉此定義存取許可權限。

您可以將資源型政策附加至 DynamoDB 資源，例如資料表或串流。在此政策中，您可為身分與存取管理 (IAM) 的[主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html#intro-structure-principal)指定可於這些 DynamoDB 資源上執行的特定動作權限。例如，附加於資料表的政策將包含存取該資料表及其索引的權限。因此，資源型政策可透過在資源層級定義權限，協助您簡化對 DynamoDB 資料表、索引與串流的存取控制。可附加至 DynamoDB 資源的政策大小上限為 20 KB。

使用資源型政策的主要優點之一，是簡化跨帳戶存取控制，讓您能為不同 AWS 帳戶中的 IAM 主體授與跨帳戶存取權。如需詳細資訊，請參閱[跨帳戶存取權資源型政策](rbac-examples.md#rbac-examples-cross-account)。

資源型政策亦支援與 [IAM 存取分析器](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html)外部存取分析器及[封鎖公開存取 (BPA)](rbac-bpa-rbp.md)功能整合。IAM 存取分析器會回報資源型政策中所指定之外部實體的跨帳戶存取情況。它同時提供可見性，協助您調整權限並符合最低權限政策。BPA 可協助您防止 DynamoDB 資料表、索引與串流遭公開存取，並於資源型政策的建立與修改流程中自動啟用。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/q9sBxrVgq4U?si=0cR4TJIlKvH9Wlu5/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/q9sBxrVgq4U?si=0cR4TJIlKvH9Wlu5)


**Topics**
+ [使用資源型政策建立資料表](rbac-create-table.md)
+ [將資源型政策連接至現有 DynamoDB 資料表](rbac-attach-resource-based-policy.md)
+ [將資源型政策附加至 DynamoDB 串流](rbac-attach-resource-policy-streams.md)
+ [從 DynamoDB 資料表移除資源型政策](rbac-delete-resource-based-policy.md)
+ [DynamoDB 中使用資源型政策的跨帳戶存取權](rbac-cross-account-access.md)
+ [使用 DynamoDB 資源型政策封鎖公開存取](rbac-bpa-rbp.md)
+ [支援資源型政策的 DynamoDB API 操作](rbac-iam-actions.md)
+ [使用 IAM 身分型政策與 DynamoDB 資源型政策進行授權](rbac-auth-iam-id-based-policies-DDB.md)
+ [DynamoDB 資源型政策範例](rbac-examples.md)
+ [DynamoDB 資源型政策考量事項](rbac-considerations.md)
+ [DynamoDB 資源型政策最佳實務](rbac-best-practices.md)

# 使用資源型政策建立資料表
<a name="rbac-create-table"></a>

您可以使用 DynamoDB 主控台、[CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html) API、 AWS CLI[AWS SDK](rbac-attach-resource-based-policy.md#rbac-attach-policy-java-sdk) 或 CloudFormation 範本，在建立資料表時新增資源型政策。

## AWS CLI
<a name="rbac-create-table-CLI"></a>

下列範例會使用 `create-table` AWS CLI 命令建立名為 *MusicCollection* 的資料表。此指令同時包含 `resource-policy` 參數，用以將資源型政策新增至資料表。此政策允許使用者 *John* 對該資料表執行 [RestoreTableToPointInTime](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_RestoreTableToPointInTime.html)、[GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html) 與 [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html) API 動作。

請以資源特定資訊取代*斜體*文字。

```
aws dynamodb create-table \
    --table-name MusicCollection \
    --attribute-definitions AttributeName=Artist,AttributeType=S AttributeName=SongTitle,AttributeType=S \
    --key-schema AttributeName=Artist,KeyType=HASH AttributeName=SongTitle,KeyType=RANGE \
    --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \
    --resource-policy \
        "{
            \"Version\": \"2012-10-17\",		 	 	 
            \"Statement\": [
              {
                    \"Effect\": \"Allow\",
                    \"Principal\": {
                        \"AWS\": \"arn:aws:iam::123456789012:user/John\"
                    },
                    \"Action\": [
                        \"dynamodb:RestoreTableToPointInTime\",
                        \"dynamodb:GetItem\",
                        \"dynamodb:DescribeTable\"
                    ],
                    \"Resource\": \"arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection\"
                }
            ]
        }"
```

## AWS 管理主控台
<a name="rbac-create-table-console"></a>

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/) 開啟 DynamoDB 主控台。

1. 在儀表板上，選擇**建立資料表**。

1. 在**資料表詳細資料**中，輸入資料表名稱、分割區索引鍵與排序索引鍵的詳細資料。

1. 在**資料表設定**中，選擇**自訂設定**。

1. (選用) 可指定**資料表類別**、**容量計算機**、**讀取/寫入容量設定**、**輔助索引**、**靜態加密**與**刪除保護**等選項。

1. 在**資源型政策**中，新增政策以定義資料表及其索引的存取權限。在此政策中，您可指定哪些使用者可存取這些資源，以及他們可對各資源執行的動作。若要新增政策，請執行以下任一操作：
   + 輸入或貼上 JSON 政策文件。如需 IAM 政策語言的詳細資訊，請參閱《*IAM 使用者指南*》中的[使用 JSON 編輯器建立政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html#access_policies_create-json-editor)。
**提示**  
若要查看 Amazon DynamoDB 開發人員指南中的資源型政策範例，請選取**政策範例**。
   + 選擇**新增陳述式**，以在提供的欄位中輸入資訊並新增新的陳述式。針對您想要新增的任意數量陳述式重複此步驟。
**重要**  
儲存政策前，請務必先解決所有安全性警告、錯誤或建議。

   下列 IAM 政策範例允許使用者 *John* 對資料表 *MusicCollection* 執行 [RestoreTableToPointInTime](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_RestoreTableToPointInTime.html)、[GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html) 與 [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html) API 動作。

   請以資源特定資訊取代*斜體*文字。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": "arn:aws:iam::123456789012:user/username"
         },
         "Action": [
           "dynamodb:RestoreTableToPointInTime",
           "dynamodb:GetItem",
           "dynamodb:PutItem"
         ],
         "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection"
       }
     ]
   }
   ```

------

1. (選用) 選擇右下角的 **Preview external access** (預覽外部存取)，以預覽新政策會如何影響資源的公開和跨帳戶存取權。在儲存政策之前，您可以檢查它是否引入新的 IAM Access Analyzer 問題清單，或是解決現有的問題清單。如果您沒有看到作用中的分析器，請選擇 **Go to Access Analyzer** (移至 Access Analyzer)，以在 IAM Access Analyzer 中[建立帳戶分析器](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-getting-started.html#access-analyzer-enabling)。如需詳細資訊，請參閱[預覽存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-access-preview.html)。

1. 選擇 **Create Table** (建立資料表)。

## AWS CloudFormation 範本
<a name="rbac-create-table-cfn"></a>

------
#### [ Using the AWS::DynamoDB::Table resource ]

下列 CloudFormation 範本會使用 [AWS::DynamoDB::Table](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html) 資源建立帶有串流的資料表。此範本也包含資源型政策，分別連接至資料表與串流。

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Resources": {
        "MusicCollectionTable": {
            "Type": "AWS::DynamoDB::Table",
            "Properties": {
                "AttributeDefinitions": [
                    {
                        "AttributeName": "Artist",
                        "AttributeType": "S"
                    }
                ],
                "KeySchema": [
                    {
                        "AttributeName": "Artist",
                        "KeyType": "HASH"
                    }
                ],
                "BillingMode": "PROVISIONED",
                "ProvisionedThroughput": {
                    "ReadCapacityUnits": 5,
                    "WriteCapacityUnits": 5
                },
                "StreamSpecification": {
                  "StreamViewType": "OLD_IMAGE",
                  "ResourcePolicy": {
                    "PolicyDocument": {
                      "Version": "2012-10-17",		 	 	 
                      "Statement": [
                        {
                            "Principal": {
                                "AWS": "arn:aws:iam::111122223333:user/John"
                            },
                            "Effect": "Allow",
                            "Action": [
                                "dynamodb:GetRecords",
                                "dynamodb:GetShardIterator",
                                "dynamodb:DescribeStream"
                            ],
                            "Resource": "*"
                        }
                      ]
                    }
                  }
                },
                "TableName": "MusicCollection",
                "ResourcePolicy": {
                    "PolicyDocument": {
                        "Version": "2012-10-17",		 	 	 
                        "Statement": [
                            {
                                "Principal": {
                                    "AWS": [
                                        "arn:aws:iam::111122223333:user/John"
                                    ]
                                },
                                "Effect": "Allow",
                                "Action": "dynamodb:GetItem",
                                "Resource": "*"
                            }
                        ]
                    }
                }
            }
           
        }
    }
}
```

------
#### [ Using the AWS::DynamoDB::GlobalTable resource ]

下列 CloudFormation 範本會使用 [AWS::DynamoDB::GlobalTable](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-globaltable.html) 資源建立資料表，並將資源型政策連接至該資料表及其串流。

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Resources": {
        "GlobalMusicCollection": {
            "Type": "AWS::DynamoDB::GlobalTable",
            "Properties": {
                "TableName": "MusicCollection",
                "AttributeDefinitions": [{
                    "AttributeName": "Artist",
                    "AttributeType": "S"
                }],
                "KeySchema": [{
                    "AttributeName": "Artist",
                    "KeyType": "HASH"
                }],
                "BillingMode": "PAY_PER_REQUEST",
                "StreamSpecification": {
                    "StreamViewType": "NEW_AND_OLD_IMAGES"
                },
                "Replicas": [
                    {
                        "Region": "us-east-1",
                        "ResourcePolicy": {
                            "PolicyDocument": {
                                "Version": "2012-10-17",		 	 	 
                                "Statement": [{
                                    "Principal": {
                                        "AWS": [
                                            "arn:aws:iam::111122223333:user/John"
                                        ]
                                    },
                                    "Effect": "Allow",
                                    "Action": "dynamodb:GetItem",
                                    "Resource": "*"
                                }]
                            }
                        },
                        "ReplicaStreamSpecification": {
                            "ResourcePolicy": {
                                "PolicyDocument": {
                                    "Version": "2012-10-17",		 	 	 
                                    "Statement": [{
                                        "Principal": {
                                            "AWS": "arn:aws:iam::111122223333:user/John"
                                        },
                                        "Effect": "Allow",
                                        "Action": [
                                            "dynamodb:GetRecords",
                                            "dynamodb:GetShardIterator",
                                            "dynamodb:DescribeStream"
                                        ],
                                        "Resource": "*"
                                    }]
                                }
                            }
                        }
                    }
                ]
            }
        }
    }
}
```

------

# 將資源型政策連接至現有 DynamoDB 資料表
<a name="rbac-attach-resource-based-policy"></a>

您可以使用 DynamoDB 主控台、[PutResourcePolicy](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutResourcePolicy.html) API、 AWS CLI、 AWS SDK 或 [CloudFormation 範本](rbac-create-table.md#rbac-create-table-cfn)，將資源型政策連接至現有資料表或修改現有政策。

## AWS CLI 連接新政策的範例
<a name="rbac-attach-policy-CLI"></a>

下列 IAM 政策範例使用 `put-resource-policy` AWS CLI 命令，將資源型政策連接至現有資料表。此範例允許使用者 *John* 對名為 *MusicCollection* 的現有資料表執行 [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html)、[PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html)、[UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html) 與 [UpdateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html) API 動作。

請以資源特定資訊取代*斜體*文字。

```
aws dynamodb put-resource-policy \
    --resource-arn arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection \
    --policy \
        "{
            \"Version\": \"2012-10-17\",		 	 	 
            \"Statement\": [
              {
                    \"Effect\": \"Allow\",
                    \"Principal\": {
                        \"AWS\": \"arn:aws:iam::111122223333:user/John\"
                    },
                    \"Action\": [
                        \"dynamodb:GetItem\",
                        \"dynamodb:PutItem\",
                        \"dynamodb:UpdateItem\",
                        \"dynamodb:UpdateTable\"
                    ],
                    \"Resource\": \"arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection\"
                }
            ]
        }"
```

## AWS CLI 以條件式更新現有政策的範例
<a name="rbac-update-policy-CLI"></a>

若要有條件地更新資料表現有的資源型政策，您可以使用選用的 `expected-revision-id` 參數。下列範例僅當政策存在於 DynamoDB 且其目前修訂版 ID 符合提供的 `expected-revision-id` 參數時，才會更新政策。

```
aws dynamodb put-resource-policy \
    --resource-arn arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection \
    --expected-revision-id 1709841168699 \ 
    --policy \
        "{
            \"Version\": \"2012-10-17\",		 	 	 
            \"Statement\": [
              {
                    \"Effect\": \"Allow\",
                    \"Principal\": {
                        \"AWS\": \"arn:aws:iam::111122223333:user/John\"
                    },
                    \"Action\": [
                        \"dynamodb:GetItem\",
                        \"dynamodb:UpdateItem\",
                        \"dynamodb:UpdateTable\"
                    ],
                    \"Resource\": \"arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection\"
                }
            ]
        }"
```

## AWS 管理主控台
<a name="rbac-attach-policy-console"></a>

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/) 開啟 DynamoDB 主控台。

1. 在儀表板中選取現有資料表。

1. 前往**權限**分頁，然後選取**建立資料表政策**。

1. 在資源型政策編輯器中，新增要附加的政策，然後選取**建立政策**。

   下列 IAM 政策範例允許使用者 *John* 對名為 *MusicCollection* 的現有資料表執行 [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html)、[PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html)、[UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html) 與 [UpdateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html) API 動作。

   請以資源特定資訊取代*斜體*文字。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": "arn:aws:iam::111122223333:user/username"
         },
         "Action": [
           "dynamodb:GetItem",
           "dynamodb:PutItem",
           "dynamodb:UpdateItem",
           "dynamodb:UpdateTable"
         ],
         "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection"
       }
     ]
   }
   ```

------

## AWS SDK for Java 2.x
<a name="rbac-attach-policy-java-sdk"></a>

下列 IAM 政策範例使用 `putResourcePolicy` 方法，將資源型政策附加到現有資料表。此政策允許使用者在現有資料表上執行 [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html) API 操作。

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
import software.amazon.awssdk.services.dynamodb.model.PutResourcePolicyRequest;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * [Get started with the AWS SDK for Java 2.x](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html)
 */
public class PutResourcePolicy {

    public static void main(String[] args) {
        final String usage = """

                Usage:
                    <tableArn> <allowedAWSPrincipal>

                Where:
                    tableArn - The Amazon DynamoDB table ARN to attach the policy to. For example, arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection.
                    allowed AWS Principal - Allowed AWS principal ARN that the example policy will give access to. For example, arn:aws:iam::123456789012:user/John.
                """;

        if (args.length != 2) {
            System.out.println(usage);
            System.exit(1);
        }

        String tableArn = args[0];
        String allowedAWSPrincipal = args[1];
        System.out.println("Attaching a resource-based policy to the Amazon DynamoDB table with ARN " +
                tableArn);
        Region region = Region.US_WEST_2;
        DynamoDbClient ddb = DynamoDbClient.builder()
                .region(region)
                .build();

        String result = putResourcePolicy(ddb, tableArn, allowedAWSPrincipal);
        System.out.println("Revision ID for the attached policy is " + result);
        ddb.close();
    }

    public static String putResourcePolicy(DynamoDbClient ddb, String tableArn, String allowedAWSPrincipal) {
        String policy = generatePolicy(tableArn, allowedAWSPrincipal);
        PutResourcePolicyRequest request = PutResourcePolicyRequest.builder()
                .policy(policy)
                .resourceArn(tableArn)
                .build();

        try {
            return ddb.putResourcePolicy(request).revisionId();
        } catch (DynamoDbException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }

        return "";
    }

    private static String generatePolicy(String tableArn, String allowedAWSPrincipal) {
        return "{\n" +
                "    \"Version\": \"2012-10-17\",\n" +,		 	 	 
                "    \"Statement\": [\n" +
                "        {\n" +
                "            \"Effect\": \"Allow\",\n" +
                "            \"Principal\": {\"AWS\":\"" + allowedAWSPrincipal + "\"},\n" +
                "            \"Action\": [\n" +
                "                \"dynamodb:GetItem\"\n" +
                "            ],\n" +
                "            \"Resource\": \"" + tableArn + "\"\n" +
                "        }\n" +
                "    ]\n" +
                "}";
    }
}
```

# 將資源型政策附加至 DynamoDB 串流
<a name="rbac-attach-resource-policy-streams"></a>

您可以使用 DynamoDB 主控台、[PutResourcePolicy](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutResourcePolicy.html) API、 AWS CLI、 AWS SDK 或 [CloudFormation 範本](rbac-create-table.md#rbac-create-table-cfn)，將資源型政策連接至現有資料表的串流或修改現有政策。

**注意**  
使用 [CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html) 或 [UpdateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html) API 建立時，無法將政策附加至串流。不過，資料表刪除後仍可修改或刪除政策。您也可以修改或刪除停用串流的政策。



## AWS CLI
<a name="rbac-attach-policy-stream-CLI"></a>

下列 IAM 政策範例使用 `put-resource-policy` AWS CLI 命令，將資源型政策連接至名為 *MusicCollection* 的資料表串流。此範例允許使用者 *John* 對該串流執行 [GetRecords](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetRecords.html)、[GetShardIterator](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetShardIterator.html) 與 [DescribeStream](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_DescribeStream.html) API 操作。

請以資源特定資訊取代*斜體*文字。

```
aws dynamodb put-resource-policy \
    --resource-arn arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection/stream/2024-02-12T18:57:26.492 \
    --policy \
        "{
            \"Version\": \"2012-10-17\",		 	 	 
            \"Statement\": [
              {
                    \"Effect\": \"Allow\",
                    \"Principal\": {
                        \"AWS\": \"arn:aws:iam::111122223333:user/John\"
                    },
                    \"Action\": [
                        \"dynamodb:GetRecords\",
                        \"dynamodb:GetShardIterator\",
                        \"dynamodb:DescribeStream\"
                    ],
                    \"Resource\": \"arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection/stream/2024-02-12T18:57:26.492\"
                }
            ]
        }"
```

## AWS 管理主控台
<a name="rbac-attach-policy-stream-console"></a>

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/) 開啟 DynamoDB 主控台。

1. 在 DynamoDB 主控台的儀表板中，選取**資料表**，然後選取現有資料表。

   請確認所選資料表已啟用串流功能。如需啟用資料表串流的詳細資訊，請參閱 [啟用串流](Streams.md#Streams.Enabling)。

1. 選擇**許可**索引標籤。

1. 在**作用中串流的資源型政策**中，選取**建立串流政策**。

1. 在**資源型政策**編輯器中，新增政策以定義串流的存取權限。在此政策中，您可指定可存取串流的使用者，以及他們可執行的操作。若要新增政策，請執行以下任一操作：
   + 輸入或貼上 JSON 政策文件。如需 IAM 政策語言的詳細資訊，請參閱《*IAM 使用者指南*》中的[使用 JSON 編輯器建立政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html#access_policies_create-json-editor)。
**提示**  
若要查看 Amazon DynamoDB 開發人員指南中的資源型政策範例，請選取**政策範例**。
   + 選擇**新增陳述式**，以在提供的欄位中輸入資訊並新增新的陳述式。針對您想要新增的任意數量陳述式重複此步驟。
**重要**  
儲存政策前，請務必先解決所有安全性警告、錯誤或建議。

1. (選用) 選擇右下角的 **Preview external access** (預覽外部存取)，以預覽新政策會如何影響資源的公開和跨帳戶存取權。在儲存政策之前，您可以檢查它是否引入新的 IAM Access Analyzer 問題清單，或是解決現有的問題清單。如果您沒有看到作用中的分析器，請選擇 **Go to Access Analyzer** (移至 Access Analyzer)，以在 IAM Access Analyzer 中[建立帳戶分析器](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-getting-started.html#access-analyzer-enabling)。如需詳細資訊，請參閱[預覽存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-access-preview.html)。

1. 選擇**建立政策**。

下列 IAM 政策範例會將資源型政策附加至名為 *MusicCollection* 的資料表串流。此範例允許使用者 *John* 對該串流執行 [GetRecords](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetRecords.html)、[GetShardIterator](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetShardIterator.html) 與 [DescribeStream](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_DescribeStream.html) API 操作。

請以資源特定資訊取代*斜體*文字。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:user/username"
      },
      "Action": [
        "dynamodb:GetRecords",
        "dynamodb:GetShardIterator",
        "dynamodb:DescribeStream"
      ],
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection/stream/2024-02-12T18:57:26.492"
      ]
    }
  ]
}
```

------

# 從 DynamoDB 資料表移除資源型政策
<a name="rbac-delete-resource-based-policy"></a>

您可以使用 DynamoDB 主控台、[DeleteResourcePolicy](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteResourcePolicy.html) API、 AWS CLI、 AWS SDK 或 CloudFormation 範本，從現有資料表刪除資源型政策。

## AWS CLI
<a name="rbac-delete-policy-CLI"></a>

下列範例使用 `delete-resource-policy` AWS CLI 命令，從名為 *MusicCollection* 的資料表中移除資源型政策。

請以資源特定資訊取代*斜體*文字。

```
aws dynamodb delete-resource-policy \
    --resource-arn arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection
```

## AWS 管理主控台
<a name="rbac-delete-policy-console"></a>

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/) 開啟 DynamoDB 主控台。

1. 在 DynamoDB 主控台的儀表板中，選取**資料表**，然後選取現有資料表。

1. 選擇**許可**。

1. 在**管理政策**下拉式清單中，選取**刪除政策**。

1. 在**刪除資料表資源型政策**對話方塊中，輸入 **confirm** 以確認刪除操作。

1. 選擇 **刪除**。

# DynamoDB 中使用資源型政策的跨帳戶存取權
<a name="rbac-cross-account-access"></a>

您可以使用資源型政策，提供位於不同 AWS 帳戶中可用資源的跨帳戶存取權。如果您具有 AWS 區域 與資源相同的分析器，則資源型政策允許的所有跨帳戶存取將透過 IAM Access Analyzer 外部存取調查結果進行報告。IAM Access Analyzer 會比對 IAM [政策文法](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_grammar.html)和[最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)來執行政策檢查，以驗證您的政策。這些檢查會產生問題清單並提供可行的建議，協助您撰寫具有功能性且符合安全最佳實務的政策。您可以在 [DynamoDB 主控台](https://console.aws.amazon.com/dynamodb/)的**權限**分頁中，檢視 IAM 存取分析器的有效調查結果。

如需使用 IAM 存取分析器驗證政策的詳細資訊，請參閱 *IAM 使用者指南*中的 [IAM 存取分析器政策驗證](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html)。若要檢視 IAM Access Analyzer 傳回的警告、錯誤和建議清單，請參閱 [IAM Access Analyzer 政策檢查參考](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-reference-policy-checks.html)。

若要授予帳戶 A 的使用者 A [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html) 權限，以便存取帳戶 B 的資料表 B，請依下列步驟操作：

1. 將資源型政策附加至資料表 B，以授予使用者 A 執行 `GetItem` 操作的權限。

1. 將身分型政策附加至使用者 A，以授予其對資料表 B 執行 `GetItem` 操作的權限。

您可以使用 [DynamoDB 主控台](https://console.aws.amazon.com/dynamodb/)中的**預覽外部存取**選項，預覽新政策對資源公有及跨帳戶存取權的影響。在儲存政策之前，您可以檢查它是否引入新的 IAM Access Analyzer 問題清單，或是解決現有的問題清單。如果您沒有看到作用中的分析器，請選擇 **Go to Access Analyzer** (移至 Access Analyzer)，以在 IAM Access Analyzer 中[建立帳戶分析器](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-getting-started.html#access-analyzer-enabling)。如需詳細資訊，請參閱[預覽存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-access-preview.html)。

DynamoDB 資料平面與控制平面 API 中的資料表名稱參數可接受完整的 Amazon Resource Name (ARN)，以支援跨帳戶作業。若僅提供資料表名稱參數 (未包含完整 ARN)，API 作業將在請求者所屬帳戶的資料表上執行。如需使用跨帳戶存取的政策範例，請參閱 [跨帳戶存取權資源型政策](rbac-examples.md#rbac-examples-cross-account)。

即使其他帳戶的主體讀取或寫入擁有者帳戶中的 DynamoDB 資料表，費用仍由資源擁有者帳戶承擔。若資料表採用預先佈建的輸送量，則來自擁有者與其他帳戶請求者的所有請求總和，將決定請求是否遭到限流 (若停用自動調整)，或進行擴增/縮減 (若啟用自動調整)。

所有請求將記錄於擁有者與請求者帳戶的 CloudTrail 日誌中，使雙方均可追蹤資料的存取來源。

## 與跨帳戶 AWS Lambda 函數共用存取權
<a name="rbac-analyze-cross-account-lambda-access"></a>

**帳戶 A 中的 Lambda 函數**

1. 前往 [IAM 主控台](https://console.aws.amazon.com/iam/)建立 IAM 角色，該角色將用作帳戶 A 中 Lambda 函數的 AWS Lambda [執行角色](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)。新增`AWSLambdaDynamoDBExecutionRole`具有所需 DynamoDB Streams 和 Lambda 調用許可的受管 IAM 政策。此政策也會授予您可能在帳戶 A 中存取的所有潛在 DynamoDB Streams 資源的存取權。

1. 在 [ Lambda 主控台](https://console.aws.amazon.com/lambda/)中，建立 AWS Lambda 函數來處理 DynamoDB 串流中的記錄，並在設定執行角色期間，選擇您在上一個步驟中建立的角色。

1. 將 Lambda 函數執行角色提供給帳戶 B 的 DynamoDB Streams 擁有者，以設定跨帳戶讀取存取的資源型政策。

1. 完成 Lambda 函數的設定。

**帳戶 B 中的 DynamoDB 串流**

1. 從將叫用 Lambda 函數的帳戶 A 取得跨帳戶 Lambda 執行角色。

1. 在帳戶 B 的 Amazon DynamoDB 主控台上，選擇 Lambda 跨帳戶觸發條件的資料表。在**匯出和串流**索引標籤下，找到您的 DynamoDB 串流 ARN。確保 DynamoDB 串流狀態為開啟，並記下完整的串流 ARN，因為您需要它才能執行資源政策。

1. 在**許可**索引標籤下，按一下**建立串流政策**按鈕以啟動視覺化政策編輯器。如果已存在，請按一下**新增陳述**式按鈕或編輯政策。

1. 建立政策，指定帳戶 A 中的 Lambda 執行角色做為委託人，並授予必要的 DynamoDB Stream 動作。請務必包含動作 `dynamodb:DescribeStream`、`dynamodb:GetRecords`、 `dynamodb:GetShardIterator`和 `dynamodb:ListShards`。如需 DynamoDB Streams 資源政策範例的詳細資訊，請參閱 [ DynamoDB 資源型政策範例](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/rbac-examples.html)。

**注意**  
[控制平面 API](HowItWorks.API.md#HowItWorks.API.ControlPlane) 的跨帳戶存取權每秒交易數 (TPS) 上限為 500 個請求。

# 使用 DynamoDB 資源型政策封鎖公開存取
<a name="rbac-bpa-rbp"></a>

[封鎖公開存取 (BPA)](#rbac-bpa-rbp) 是一項功能，可偵測並防止附加授予公開存取權的資源型政策，避免其在您的 [Amazon Web Services (AWS)](https://aws.amazon.com/) 帳戶中影響 DynamoDB 資料表、索引或串流。透過 BPA，您可以防止對 DynamoDB 資源的公開存取。BPA 會在建立或修改資源型政策時執行檢查，協助提升您在 DynamoDB 中的安全防護狀態。

BPA 會使用[自動推理](https://aws.amazon.com/what-is/automated-reasoning/)技術分析資源型政策授予的存取權，若在管理政策時偵測到此類權限，系統會發出警示通知。分析會驗證所有以資源為基礎的政策陳述、動作，以及您政策中所使用的條件金鑰集合的存取權限。

**重要**  
BPA 透過防止透過直接附加至 DynamoDB 資源 (如資料表、索引和串流) 的資源型政策授予公開存取權，來協助保護您的資源。除了使用 BPA 外，請仔細檢查下列政策，確認這些政策未授予公開存取權：  
連接到相關聯 AWS 主體的身分型政策 （例如 IAM 角色）
連接至相關聯 AWS 資源的資源型政策 （例如 AWS Key Management Service (KMS) 金鑰）

您必須確保[主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)不包含 `*` 項目，或由指定的條件金鑰之一限制主體對資源的存取。如果以資源為基礎的政策授予對資料表、索引或串流的公開存取權 AWS 帳戶，則 DynamoDB 會阻止您建立或修改政策，直到政策中的規格更正並視為非公開。

您可以在 `Principal` 區塊內指定一個或多個主體，將政策設為非公開。下列資源型政策範例透過指定兩個主體來阻止公開存取。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": [
      "123456789012",
      "111122223333"
    ]
  },
  "Action": "dynamodb:*",
  "Resource": "*"
}
```

指定特定條件金鑰以限制存取的政策，也不會被視為公開。除了評估資源型政策中指定的主體外，下列[受信任條件金鑰](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)也用於完成非公開存取的政策評估。
+ `aws:PrincipalAccount`
+ `aws:PrincipalArn`
+ `aws:PrincipalOrgID`
+ `aws:PrincipalOrgPaths`
+ `aws:SourceAccount`
+ `aws:SourceArn`
+ `aws:SourceVpc`
+ `aws:SourceVpce`
+ `aws:UserId`
+ `aws:PrincipalServiceName`
+ `aws:PrincipalServiceNamesList`
+ `aws:PrincipalIsAWSService`
+ `aws:Ec2InstanceSourceVpc`
+ `aws:SourceOrgID`
+ `aws:SourceOrgPaths`

此外，若要使資源型政策為非公開，Amazon Resource Name (ARN) 與字串金鑰的值不得包含萬用字元或變數。若您的資源型政策使用 `aws:PrincipalIsAWSService` 金鑰，您必須確保已將該金鑰值設為 true。

下列政策限制指定帳戶中使用者 `John` 的存取權。該條件使 `Principal` 受限，因此不被視為公開。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "*"
  },
  "Action": "dynamodb:*",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "aws:PrincipalArn": "arn:aws:iam::123456789012:user/John"
    }
  }
}
```

下列非公開的資源型政策範例使用 `StringEquals` 運算子來限制 `sourceVPC`。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "dynamodb:*",
      "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection",
      "Condition": {
        "StringEquals": {
          "aws:SourceVpc": [
            "vpc-91237329"
          ]
        }
      }
    }
  ]
}
```

------

# 支援資源型政策的 DynamoDB API 操作
<a name="rbac-iam-actions"></a>

本主題列出受資源型政策支援的 API 操作。不過，進行跨帳戶存取時，您只能透過資源型政策使用特定一組 DynamoDB API。您無法將資源型政策附加至某些資源類型，例如備份與匯入。對應於這些資源類型 API 的 IAM 動作不在資源型政策支援範圍內。由於資料表管理員會在同一帳戶內設定資料表的內部參數，因此 [UpdateTimeToLive](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTimeToLive.html) 和 [DisableKinesisStreamingDestination](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DisableKinesisStreamingDestination.html) 等 API 不支援透過資源型政策進行跨帳戶存取。

支援跨帳戶存取的 DynamoDB 資料平面與控制平面 API 也支援資料表名稱多載，允許您指定資料表 ARN 以取代資料表名稱。您可以在這些 API 的 `TableName` 參數中指定資料表 ARN。不過，並非所有這些 API 都支援跨帳戶存取。

**Topics**
+ [資料平面 API 操作](#rbac-data-plane-actions)
+ [PartiQL API 操作](#rbac-partiql-actions)
+ [控制平面 API 操作](#rbac-control-plane-actions)
+ [2019.11.21 版 (目前) 全域資料表 API 操作](#rbac-current-global-table-actions)
+ [2017.11.29 版 (舊版) 全域資料表 API 操作](#rbac-legacy-global-table-actions)
+ [標籤 API 操作](#rbac-tags-actions)
+ [備份與還原 API 操作](#rbac-backup-restore-actions)
+ [持續備份/還原 (PITR) API 操作](#rbac-continuous-backup-restore-actions)
+ [Contributor Insights API 操作](#rbac-contributor-insights-actions)
+ [匯出 API 操作](#rbac-export-actions)
+ [匯入 API 操作](#rbac-import-actions)
+ [Amazon Kinesis Data Streams API 操作](#rbac-kinesis-actions)
+ [資源型政策 API 操作](#rbac-rbp-actions)
+ [存留時間 API 操作](#rbac-ttl-actions)
+ [其他 API 操作](#rbac-other-actions)
+ [DynamoDB Streams API 操作](#rbac-ds-actions)

## 資料平面 API 操作
<a name="rbac-data-plane-actions"></a>

下表列出[資料平面 API](HowItWorks.API.md#HowItWorks.API.DataPlane) 操作針對資源型政策與跨帳戶存取所提供的 API 層級支援。


| 資料平面 - 資料表/索引 API | 資源型政策支援 | 跨帳戶支援 | 
| --- | --- | --- | 
|   [DeleteItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteItem.html)   | 是 | 是 | 
|   [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html)   | 是 | 是 | 
|   [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html)   | 是 | 是 | 
|   [Query](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html)   | 是 | 是 | 
|   [Scan](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html)   | 是 | 是 | 
|   [UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html)   | 是 | 是 | 
|   [TransactGetItems](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactGetItems.html)   | 是 | 是 | 
|   [TransactWriteItems](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html)   | 是 | 是 | 
|   [BatchGetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchGetItem.html)   | 是 | 是 | 
|   [BatchWriteItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchWriteItem.html)   | 是 | 是 | 

## PartiQL API 操作
<a name="rbac-partiql-actions"></a>

下表列出 [PartiQL](HowItWorks.API.md#HowItWorks.API.DataPlane.partiql) API 操作針對資源型政策與跨帳戶存取權所提供的 API 層級支援。


| PartiQL API | 資源型政策支援 | 跨帳戶支援 | 
| --- | --- | --- | 
|   [BatchExecuteStatement](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchExecuteStatement.html)   | 是 | 否 | 
|   [ExecuteStatement](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ExecuteStatement.html)   | 是 | 否 | 
|   [ExecuteTransaction](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ExecuteTransaction.html)   | 是 | 否 | 

## 控制平面 API 操作
<a name="rbac-control-plane-actions"></a>

下表列出[控制平面](HowItWorks.API.md#HowItWorks.API.ControlPlane) API 操作針對資源型政策與跨帳戶存取所提供的 API 層級支援。


| 控制平面 - 資料表 API | 資源型政策支援 | 跨帳戶支援 | 
| --- | --- | --- | 
|   [CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html)   | 否 | 否 | 
|   [DeleteTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteTable.html)   | 是 | 是 | 
|   [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html)   | 是 | 是 | 
|   [UpdateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html)   | 是 | 是 | 

## 2019.11.21 版 (目前) 全域資料表 API 操作
<a name="rbac-current-global-table-actions"></a>

下表列出 [2019.11.21 版 (目前) 全域資料表](GlobalTables.md) API 操作針對資源型政策與跨帳戶存取權所提供的 API 層級支援。


| 2019.11.21 版 (目前) 全域資料表 API | 資源型政策支援 | 跨帳戶支援 | 
| --- | --- | --- | 
|   [DescribeTableReplicaAutoScaling](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTableReplicaAutoScaling.html)   | 是 | 否 | 
|   [UpdateTableReplicaAutoScaling](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTableReplicaAutoScaling.html)   | 是 | 否 | 

## 2017.11.29 版 (舊版) 全域資料表 API 操作
<a name="rbac-legacy-global-table-actions"></a>

下表列出 [2017.11.29 版 (舊版) 全域資料表](globaltables.V1.md) API 操作針對資源型政策與跨帳戶存取權所提供的 API 層級支援。


| 2017.11.29 版 (舊版) 全域資料表 API | 資源型政策支援 | 跨帳戶支援 | 
| --- | --- | --- | 
|   [CreateGlobalTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateGlobalTable.html)   | 否 | 否 | 
|   [DescribeGlobalTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeGlobalTable.html)   | 否 | 否 | 
|   [DescribeGlobalTableSettings](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeGlobalTableSettings.html)   | 否 | 否 | 
|   [ListGlobalTables](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ListGlobalTables.html)   | 否 | 否 | 
|   [UpdateGlobalTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateGlobalTable.html)   | 否 | 否 | 
|   [UpdateGlobalTableSettings](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateGlobalTableSettings.html)   | 否 | 否 | 

## 標籤 API 操作
<a name="rbac-tags-actions"></a>

下表列出與資源型政策及跨帳戶存取權之[標籤](Tagging.Operations.md)相關的 API 操作所提供的 API 層級支援。


| 標籤 API | 資源型政策支援 | 跨帳戶支援 | 
| --- | --- | --- | 
|   [ListTagsOfResource](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ListTagsOfResource.html)   | 是 | 是 | 
|   [TagResource](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TagResource.html)   | 是 | 是 | 
|   [UntagResource](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UntagResource.html)   | 是 | 是 | 

## 備份與還原 API 操作
<a name="rbac-backup-restore-actions"></a>

下表列出與資源型政策及跨帳戶存取權相關的[備份與還原](Backup-and-Restore.md) API 操作所提供的 API 層級支援。


| 備份與還原 API | 資源型政策支援 | 跨帳戶支援 | 
| --- | --- | --- | 
|   [CreateBackup](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateBackup.html)   | 是 | 否 | 
|   [DescribeBackup](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeBackup.html)   | 否 | 否 | 
|   [DeleteBackup](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteBackup.html)   | 否 | 否 | 
|  [RestoreTableFromBackup](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_RestoreTableFromBackup.html)  | 否 | 否 | 

## 持續備份/還原 (PITR) API 操作
<a name="rbac-continuous-backup-restore-actions"></a>

下表列出與資源型政策及跨帳戶存取權相關的[持續備份/還原 (PITR)](Point-in-time-recovery.md) API 操作所提供的 API 層級支援。


| 持續備份/還原 (PITR) API | 資源型政策支援 | 跨帳戶支援 | 
| --- | --- | --- | 
|   [DescribeContinuousBackups](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeContinuousBackups.html)   | 是 | 否 | 
|   [RestoreTableToPointInTime](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_RestoreTableToPointInTime.html)   | 是 | 否 | 
|   [UpdateContinuousBackups](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateContinuousBackups.html)   | 是 | 否 | 

## Contributor Insights API 操作
<a name="rbac-contributor-insights-actions"></a>

下表列出與資源型政策及跨帳戶存取權相關的[持續備份/還原 (PITR)](Point-in-time-recovery.md) API 操作所提供的 API 層級支援。


| Contributor Insights API | 資源型政策支援 | 跨帳戶支援 | 
| --- | --- | --- | 
|   [DescribeContributorInsights](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeContributorInsights.html)   | 是 | 否 | 
|   [ListContributorInsights](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ListContributorInsights.html)   | 否 | 否 | 
|   [UpdateContributorInsights](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateContributorInsights.html)   | 是 | 否 | 

## 匯出 API 操作
<a name="rbac-export-actions"></a>

下表列出匯出 API 操作針對資源型政策與跨帳戶存取權所提供的 API 層級支援。


| 匯出 API | 資源型政策支援 | 跨帳戶支援 | 
| --- | --- | --- | 
|   [DescribeExport](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeExport.html)   | 否 | 否 | 
|   [ExportTableToPointInTime](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ExportTableToPointInTime.html)   | 是 | 否 | 
|   [ListExports](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ListExports.html)   | 否 | 否 | 

## 匯入 API 操作
<a name="rbac-import-actions"></a>

下表列出匯入 API 操作針對資源型政策與跨帳戶存取權所提供的 API 層級支援。


| 匯入 API | 資源型政策支援 | 跨帳戶支援 | 
| --- | --- | --- | 
|   [DescribeImport](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeImport.html)   | 否 | 否 | 
|   [ImportTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ImportTable.html)   | 否 | 否 | 
|   [ListImports](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ListImports.html)   | 否 | 否 | 

## Amazon Kinesis Data Streams API 操作
<a name="rbac-kinesis-actions"></a>

下表列出 Kinesis Data Streams API 操作針對資源型政策與跨帳戶存取權所提供的 API 層級支援。


| Kinesis API | 資源型政策支援 | 跨帳戶支援 | 
| --- | --- | --- | 
|   [DescribeKinesisStreamingDestination](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeKinesisStreamingDestination.html)   | 是 | 否 | 
|   [DisableKinesisStreamingDestination](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DisableKinesisStreamingDestination.html)   | 是 | 否 | 
|   [EnableKinesisStreamingDestination](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_EnableKinesisStreamingDestination.html)   | 是 | 否 | 
|   [UpdateKinesisStreamingDestination](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateKinesisStreamingDestination.html)   | 是 | 否 | 

## 資源型政策 API 操作
<a name="rbac-rbp-actions"></a>

下表列出資源型政策 API 操作針對資源型政策與跨帳戶存取權所提供的 API 層級支援。


| 資源型政策 API | 資源型政策支援 | 跨帳戶支援 | 
| --- | --- | --- | 
|   [GetResourcePolicy](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetResourcePolicy.html)   | 是 | 否 | 
|   [PutResourcePolicy](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutResourcePolicy.html)   | 是 | 否 | 
|   [DeleteResourcePolicy](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteResourcePolicy.html)   | 是 | 否 | 

## 存留時間 API 操作
<a name="rbac-ttl-actions"></a>

下表列出針對資源型政策與跨帳戶存取權，[存留時間](TTL.md) (TTL) API 操作所提供的 API 層級支援。


| TTL API | 資源型政策支援 | 跨帳戶支援 | 
| --- | --- | --- | 
|   [DescribeTimeToLive](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTimeToLive.html)   | 是 | 否 | 
|   [UpdateTimeToLive](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTimeToLive.html)   | 是 | 否 | 

## 其他 API 操作
<a name="rbac-other-actions"></a>

下表列出其他 API 操作針對資源型政策與跨帳戶存取權所提供的 API 層級支援。


| 其他 API | 資源型政策支援 | 跨帳戶支援 | 
| --- | --- | --- | 
|   [DescribeLimits](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeLimits.html)   | 否 | 否 | 
|   [DescribeEndpoint](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeEndpoints.html)   | 否 | 否 | 
|   [ListBackups](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ListBackups.html)   | 否 | 否 | 
|   [ListTables](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ListTables.html)   | 否 | 否 | 

## DynamoDB Streams API 操作
<a name="rbac-ds-actions"></a>

下表列出 DynamoDB Streams API 針對資源型政策與跨帳戶存取權所提供的 API 層級支援。


| DynamoDB Streams API | 資源型政策支援 | 跨帳戶支援 | 
| --- | --- | --- | 
|   [DescribeStream](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_DescribeStream.html)   | 是 | 是 | 
|   [GetRecords](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetRecords.html)   | 是 | 是 | 
|   [GetShardIterator](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetShardIterator.html)   | 是 | 是 | 
|   [ListStreams](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_ListStreams.html)   | 否 | 否 | 

# 使用 IAM 身分型政策與 DynamoDB 資源型政策進行授權
<a name="rbac-auth-iam-id-based-policies-DDB"></a>

**身分型政策**會附加至 IAM 身分 (IAM 使用者、群組或角色)。這些 IAM 政策文件可控制身分能在何種條件下，對哪些資源執行哪些操作。身分型政策可分為[受管](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html)政策或[內嵌](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies)政策。

**資源型政策**是附加至資源 (例如 DynamoDB 資料表) 的 IAM 政策文件。這些政策會授予指定的主體許可，允許在該資源上執行特定的動作，並且定義資源所適用的條件。例如，DynamoDB 資料表的資源型政策同時包含與該資料表關聯的索引。資源型政策是內嵌政策。不存在受管的資源型政策。

如需更多資訊，請參閱《*IAM 使用者指南*》中的[身分型政策與資源型政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)。

若 IAM 主體與資源擁有者屬於同一帳戶，資源型政策即可充分定義資源的存取權限。您仍可同時使用 IAM 身分型政策與資源型政策。對於跨帳戶存取權，您必須在身分政策和資源政策中明確允許存取，如 [DynamoDB 中使用資源型政策的跨帳戶存取權](rbac-cross-account-access.md) 中所指定。當您同時使用這兩種類型的政策時，系統會依據[判斷帳戶內是否允許或拒絕請求](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-denyallow)中的說明來進行評估。

**重要**  
如果身分型政策授予 DynamoDB 資料表 （例如，`dynamodb:GetItem`沒有條件） 的無條件存取權，則允許具有 條件的存取權的資源型政策`dynamodb:Attributes`不會限制該存取權。身分型政策的無條件允許優先，且資源型政策的條件不會套用為限制。若要限制對特定屬性的存取，請使用明確`Deny`陳述式，而不是僅依賴資源型政策中的條件式`Allow`陳述式。

# DynamoDB 資源型政策範例
<a name="rbac-examples"></a>

當您在資源型政策的 `Resource` 欄位中指定 ARN 時，僅當該 ARN 與其所附加的 DynamoDB 資源 ARN 相符時，政策才會生效。

**注意**  
請以資源特定資訊取代*斜體*文字。

## 資料表的資源型政策
<a name="rbac-examples-get"></a>

下列資源型政策附加至名為 *MusicCollection* 的 DynamoDB 資料表，授予 IAM 使用者 *John* 和 *Jane* 在 *MusicCollection* 資源上執行 [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html) 與 [BatchGetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchGetItem.html) 動作的權限。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "1111",
        "Effect": "Allow",
        "Principal": {
          "AWS": [
            "arn:aws:iam::111122223333:user/username",
            "arn:aws:iam::111122223333:user/Jane"
          ]
        },
        "Action": [
          "dynamodb:GetItem",
          "dynamodb:BatchGetItem"
        ],
        "Resource": [
          "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection"
        ]
    }
  ]
}
```

------

## 串流的資源型政策
<a name="rbac-examples-streams"></a>

下列資源型政策附加至名為 `2024-02-12T18:57:26.492` 的 DynamoDB 串流，授予 IAM 使用者 *John* 和 *Jane* 在 `2024-02-12T18:57:26.492` 資源上執行 [GetRecords](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetRecords.html)、[GetShardIterator](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetShardIterator.html) 與 [DescribeStream](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_DescribeStream.html) API 動作的權限。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "1111",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::111122223333:user/username",
          "arn:aws:iam::111122223333:user/Jane"
        ]
      },
      "Action": [
        "dynamodb:DescribeStream",
        "dynamodb:GetRecords",
        "dynamodb:GetShardIterator"
      ],
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection/stream/2024-02-12T18:57:26.492"
      ]
    }
  ]
}
```

------

## 資源型政策：允許對指定資源執行所有動作的存取權
<a name="rbac-examples-wildcard"></a>

若要允許使用者對資料表及其所有相關索引執行所有動作，您可以使用萬用字元 (\$1) 來表示與該資料表相關的動作和資源。將萬用字元用於資源時，使用者即可存取 DynamoDB 資料表及其所有相關索引，包括尚未建立的索引。例如，下列政策將授予使用者 *John* 對 *MusicCollection* 資料表及其所有索引執行任何動作的權限，包括未來建立的索引。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "1111",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:user/role-name"
      },
      "Action": "dynamodb:*",
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection",
        "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection/index/index-name"
      ]
    }
  ]
}
```

------

## 跨帳戶存取權資源型政策
<a name="rbac-examples-cross-account"></a>

您可以為跨帳戶的 IAM 身分指定存取 DynamoDB 資源的權限。例如，您可能需要讓受信任帳戶的使用者讀取資料表內容，但僅能存取特定項目及其特定屬性。下列政策允許使用者 *John* 從信任 AWS 帳戶 ID *111111111111* 存取，以使用 [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html) API 從帳戶 *123456789012* 中的資料表存取資料。此政策可確保使用者僅能存取主索引鍵為 *Jane* 的項目，並且只能擷取屬性 `Artist` 和 `SongTitle`，無法讀取其他屬性。

**重要**  
如果未指定 `SPECIFIC_ATTRIBUTES` 條件，系統將傳回項目的所有屬性。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "CrossAccountTablePolicy",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111111111111:user/John"
            },
            "Action": "dynamodb:GetItem",
            "Resource": [
                "arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection"
            ],
            "Condition": {
                "ForAllValues:StringEquals": {
                    "dynamodb:LeadingKeys": "Jane",
                    "dynamodb:Attributes": [
                        "Artist",
                        "SongTitle"
                    ]
                },
                "StringEquals": {
                    "dynamodb:Select": "SPECIFIC_ATTRIBUTES"
                }
            }
        }
    ]
}
```

------

除了上述資源型政策外，附加於使用者 *John* 的身分型政策也必須允許相關的 `GetItem` API 動作，才能使跨帳戶存取權運作。以下範例顯示您必須附加至使用者 *John* 的身分型政策。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "CrossAccountIdentityBasedPolicy",
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetItem"
            ],
            "Resource": [
                "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection"
            ],
            "Condition": {
                "ForAllValues:StringEquals": {
                    "dynamodb:LeadingKeys": "Jane",
                    "dynamodb:Attributes": [
                        "Artist",
                        "SongTitle"
                    ]
                },
                "StringEquals": {
                    "dynamodb:Select": "SPECIFIC_ATTRIBUTES"
                }
            }
        }
    ]
}
```

------

使用者 John 可以在 `table-name` 參數中指定資料表 ARN，提出 `GetItem` 請求以存取帳戶 *123456789012* 中的 *MusicCollection* 資料表。

```
aws dynamodb get-item \
    --table-name arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection \
    --key '{"Artist": {"S": "Jane"}' \
    --projection-expression 'Artist, SongTitle' \
    --return-consumed-capacity TOTAL
```

## 含 IP 位址條件的資源型政策
<a name="rbac-examples-conditions"></a>

您可以套用條件以限制來源 IP 位址、虛擬私有雲端 (VPC)，以及 VPC 端點 (VPCE)。您可以根據請求的來源 IP 位址指定權限。例如，您可能僅允許使用者從特定 IP 來源 (如公司 VPN 端點) 存取 DynamoDB 資源。請在 `Condition` 陳述式中指定這些 IP 位址。

下列範例允許使用者 *John* 在來源 IP 位址為 `54.240.143.0/24` 和 `2001:DB8:1234:5678::/64` 時，存取任何 DynamoDB 資源。

------
#### [ JSON ]

****  

```
{
  "Id":"PolicyId2",
  "Version":"2012-10-17",		 	 	 
  "Statement":[
    {
      "Sid":"AllowIPmix",
      "Effect":"Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111111111111:user/username"
      },
      "Action":"dynamodb:*",
      "Resource":"*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": [
            "54.240.143.0/24",
            "2001:DB8:1234:5678::/64"
          ]
        }
      }
    }
  ]
}
```

------

您也可以拒絕所有對 DynamoDB 資源的存取，除非來源是特定的 VPC 端點，例如 *vpce-1a2b3c4d*。

**重要**  
當您將 DAX 與IPv6-only環境中具有 IP 資源政策的 DynamoDB 資料表搭配使用時，您必須設定其他存取規則。如果您的資源政策限制存取資料表`0.0.0.0/0`上的 IPv4 地址空間，您必須允許存取與 DAX 叢集相關聯的 IAM 角色。將 `ArnNotEquals`條件新增至您的政策，以確保 DAX 維持對 DynamoDB 資料表的存取。如需詳細資訊，請參閱 [DAX 和 IPv6](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DAX.create-cluster.DAX_and_IPV6.html)。

------
#### [ JSON ]

****  

```
{
  "Id":"PolicyId",
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AccessToSpecificVPCEOnly",
      "Principal": "*",
      "Action": "dynamodb:*",
      "Effect": "Deny",
      "Resource": "*",
      "Condition": {
        "StringNotEquals":{
          "aws:sourceVpce":"vpce-1a2b3c4d"
        }
      }
    }
  ]
}
```

------

## 使用 IAM 角色的資源型政策
<a name="rbac-examples-iam"></a>

您也可以在資源型政策中指定 IAM 服務角色。取得此角色的 IAM 實體，將受限於該角色中所指定的允許動作，以及資源型政策中定義的特定資源集合。

下列範例允許 IAM 實體在 *MusicCollection* 與 *MusicCollection* 兩個 DynamoDB 資源上執行所有 DynamoDB 動作。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "1111",
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::111122223333:role/role-name" },
      "Action": "dynamodb:*",
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection",
        "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection/*"
      ]
    }
  ]
}
```

------

# DynamoDB 資源型政策考量事項
<a name="rbac-considerations"></a>

當您為 DynamoDB 資源定義資源型政策時，請注意以下考量事項：

**一般考量事項**
+ 資源型政策文件的最大支援大小為 20 KB。DynamoDB 在依此限制計算政策大小時，會將空白字元納入計算。
+ 成功更新某資源的政策後，該資源的後續政策更新會在 15 秒內被暫時封鎖。
+ 目前，您只能將資源型政策附加至現有的串流。您無法在建立串流時同時附加政策。

**全域資料表考量事項**
+ [全域資料表版本 2017.11.29 (舊版)](globaltables_HowItWorks.md) 的副本不支援資源型政策。
+ 若在資源型政策中拒絕 DynamoDB 服務連結角色 (SLR) 用於全域資料表資料複寫的動作，新增或刪除複本時將會失敗並產生錯誤。
+ [AWS::DynamoDB::GlobalTable](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-globaltable.html) 資源不支援在非部署堆疊更新所在的區域中，在同一次堆疊更新內建立複本並同時新增資源型政策。

**跨帳戶考量事項**
+ 使用資源型政策的跨帳戶存取不支援具有 AWS 受管金鑰的加密資料表，因為您無法授予 AWS 受管 KMS 政策的跨帳戶存取權。

**CloudFormation 考量事項**
+ 資源型政策不支援[偏離偵測](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html#)。如果您在 AWS CloudFormation 堆疊範本之外更新資源型政策，則需要使用變更來更新 CloudFormation 堆疊。
+ 資源型政策不支援頻外變更。若您在 CloudFormation 範本之外新增、更新或刪除政策，而範本內未變更該政策，則這些變更不會被覆寫。

  例如，假設您的範本包含一項資源型政策，而您稍後在範本之外更新該政策。若未在範本中變更政策，DynamoDB 中更新的政策將不會與範本內的政策同步。

  反之，若範本不包含資源型政策，但您在範本之外新增了政策。只要您未將該政策新增至範本，它就不會從 DynamoDB 中被移除。當您將政策新增至範本並更新堆疊時，DynamoDB 中的現有政策會自動更新，使其與範本中定義的政策一致。

# DynamoDB 資源型政策最佳實務
<a name="rbac-best-practices"></a>

本主題說明定義 DynamoDB 資源存取權限及允許動作的最佳實務。

## 簡化 DynamoDB 資源的存取控制
<a name="rbac-simplify-access-control"></a>

如果需要存取 DynamoDB 資源的 AWS Identity and Access Management 主體與 AWS 帳戶 資源擁有者屬於相同部分，則每個主體不需要 IAM 身分型政策。附加至指定資源的資源型政策即可。此設定方式可簡化存取控制。

## 使用資源型政策保護您的 DynamoDB 資源
<a name="rbac-protect"></a>

 對所有 DynamoDB 資料表與串流建立資源型政策，以強制執行這些資源的存取控制。資源型政策可讓您在資源層級集中管理權限，簡化對 DynamoDB 資料表、索引及串流的存取控制，並降低管理負擔。若未為資料表或串流指定資源型政策，則除非與 IAM 主體關聯的身分型政策允許存取，否則系統會隱含拒絕存取該資料表或串流。

## 套用最低權限許可
<a name="rbac-least-privilege"></a>

當您使用 DynamoDB 資源的資源型政策設定權限時，僅授與執行動作所需的權限。為實現此目的，您可以定義在特定條件下可以對特定資源採取的動作，這也稱為最低權限許可。探索工作負載或使用案例所需的許可時，您可能會從廣泛許可開始。隨著使用案例的成熟，您可以設法減少授予的許可，以便朝向最低權限的目標邁進。

## 分析跨帳戶存取活動以產生最低權限政策
<a name="rbac-analyze-cross-account-access"></a>

IAM 存取分析器會報告資源型政策中指定之外部實體的跨帳戶存取，並提供可視化資訊，協助您最佳化權限設定並符合最低權限政策。如需政策產生的詳細資訊，請參閱 [IAM Access Analyzer 政策產生](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-generation.html)。

## 使用 IAM 存取分析器根據存取活動產生最低權限政策
<a name="rbac-iam-access-analyzer"></a>

若只授予執行任務所需的許可，您可以根據在 AWS CloudTrail中記錄的存取活動產生政策。IAM 存取分析器會分析您的政策中所使用的服務與動作。

# 搭配 DynamoDB 使用屬性型存取控制
<a name="attribute-based-access-control"></a>

[屬性型存取控制 (ABAC)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html) 是一種授權策略，可根據身分型政策或其他 AWS 政策中的[標籤條件](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.html)定義存取許可，例如資源型政策和組織 IAM 政策。您可以將標籤附加至 DynamoDB 資料表，系統會根據標籤式條件進行評估。資料表所關聯的索引會繼承您新增至該資料表的標籤。每個 DynamoDB 資料表最多可新增 50 個標籤。資料表中所有標籤支援的大小上限為 10 KB。如需有關標記 DynamoDB 資源及標記限制的詳細資訊，請參閱[在 DynamoDB 中標記資源](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.Operations.html)與 [DynamoDB 中的標記限制](Tagging.md#TaggingRestrictions)。

如需使用標籤控制 AWS 資源存取的詳細資訊，請參閱《IAM 使用者指南》中的下列主題：
+ [什麼是 ABAC AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)
+ [使用標籤控制對 AWS 資源的存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html)

使用 ABAC，您可以為團隊與應用程式設定不同的存取層級，並以更少的政策在 DynamoDB 資料表上執行操作。您可以在 IAM 政策的[條件元素](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)中指定標籤，以控制對 DynamoDB 資料表或索引的存取。這些條件決定 IAM 主體、使用者或角色對 DynamoDB 資料表與索引的存取層級。當 IAM 主體向 DynamoDB 提出存取請求時，系統會根據 IAM 政策中的標籤條件評估資源與身分的標籤。之後，僅在符合標籤條件時，該政策才會生效。這可讓您建立能實現以下任一條件的 IAM 政策：
+ *允許使用者僅管理具有標籤鍵`X`與值 `Y` 標籤的資源*。
+ *拒絕所有使用者存取具有標籤鍵 `X` 的資源*。

例如，您可以建立政策，僅允許使用者更新具有下列標籤鍵值對的資料表：`"environment": "staging"`。您可以使用 [aws：ResourceTag](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) 條件鍵，根據附加至該資料表的標籤來允許或拒絕存取。

您可以在建立政策時或稍後使用 AWS 管理主控台、 AWS API、 AWS Command Line Interface (AWS CLI)、 AWS SDK 或 包含屬性型條件 AWS CloudFormation。

下列範例允許在名為 `MusicTable` 的資料表上執行 [UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html) 動作，前提是該資料表具有名稱為 `environment`、值為 `production` 的標籤鍵值。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:UpdateItem"
      ],
      "Resource": "arn:aws:dynamodb:*:*:table/MusicTable",
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/environment": "production"
        }
      }
    }
  ]
}
```

------

**Topics**
+ [為什麼要使用 ABAC？](#why-use-abac)
+ [使用 DynamoDB 實作 ABAC 的條件鍵](#condition-keys-implement-abac)
+ [搭配 DynamoDB 使用 ABAC 的注意事項](#abac-considerations)
+ [在 DynamoDB 中啟用 ABAC](abac-enable-ddb.md)
+ [在 DynamoDB 資料表與索引中使用 ABAC](abac-implementation-ddb-tables.md)
+ [使用 ABAC 搭配 DynamoDB 資料表與索引的範例](abac-example-use-cases.md)
+ [疑難排解 DynamoDB 資料表與索引的常見 ABAC 錯誤](abac-troubleshooting.md)

## 為什麼要使用 ABAC？
<a name="why-use-abac"></a>
+ **更簡單的政策管理：**您可以減少使用的政策數量，因為不需為每個 IAM 主體建立不同的政策來定義其存取層級。
+ **可擴展的存取控制：**使用 ABAC 可讓存取控制更容易擴展，因為在建立新的 DynamoDB 資源時，無需更新政策。您可以使用標籤授權存取那些擁有與資源標籤相符標籤的 IAM 主體。您可以新增 IAM 主體或 DynamoDB 資源，套用適當的標籤，即可自動授予必要的權限，無需修改任何政策。
+ **細粒度權限管理：**在建立政策時，最佳實務是[授與最低權限](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。使用 ABAC，您可以為 IAM 主體建立標籤，並依據這些標籤授與符合的特定動作與資源的存取權限。
+ **與公司目錄對應：**您可以將標籤對應至公司目錄中的員工屬性，使存取控制政策與組織結構保持一致。

## 使用 DynamoDB 實作 ABAC 的條件鍵
<a name="condition-keys-implement-abac"></a>

您可以在 AWS 政策中使用下列條件索引鍵來控制 DynamoDB 資料表和索引的存取層級：
+ [aws:ResourceTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag)：根據 DynamoDB 資料表或索引上的標籤鍵值組是否與政策中的標籤鍵和值相符來控制存取。此條件鍵適用於所有針對現有資料表或索引運作的 API。

  這些 `dynamodb:ResourceTag` 條件的評估方式與資源未附加任何標籤時相同。
+ [aws:RequestTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag)：可用於比較請求中傳遞的標籤鍵值組與政策中指定的標籤鍵值組。此條件鍵適用於在請求承載中包含標籤的 API。包含這些 API：[CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html) 與 [TagResource](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TagResource.html)。
+ [aws:TagKeys](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys)：用於比較請求中的標籤鍵與政策中指定的標籤鍵。此條件鍵適用於在請求承載中包含標籤的 API。相關 API 包含 `CreateTable`、`TagResource` 與 `UntagResource`。

## 搭配 DynamoDB 使用 ABAC 的注意事項
<a name="abac-considerations"></a>

當您將 ABAC 用於 DynamoDB 資料表或索引時，請注意以下事項：
+ DynamoDB Streams 不支援標籤與 ABAC。
+ DynamoDB 備份不支援標籤與 ABAC。若要在備份中使用 ABAC，建議您使用 [AWS Backup](https://docs.aws.amazon.com/aws-backup/latest/devguide/whatisbackup.html)。
+ 標籤不會在還原的資料表中保留。您必須先將標籤新增至還原的資料表，才能在政策中使用標籤式條件。

# 在 DynamoDB 中啟用 ABAC
<a name="abac-enable-ddb"></a>

對於大多數 AWS 帳戶，預設為啟用 ABAC。使用 [DynamoDB 主控台](https://console.aws.amazon.com/dynamodb/)，您可以確認帳戶是否已啟用 ABAC。若要執行此操作，請使用具有 [dynamodb：GetAbacStatus](#required-permissions-abac) 權限的角色開啟 DynamoDB 主控台。接著，開啟 DynamoDB 主控台的**設定**頁面。

若您未看到**屬性型存取控制**卡片，或卡片顯示狀態為**開啟**，即表示您的帳戶已啟用 ABAC。不過，如果您看到**屬性型存取控制**卡片顯示狀態為**關閉** (如下圖所示)，表示帳戶未啟用 ABAC。

## 屬性型存取控制 – 未啟用
<a name="abac-disabled-image"></a>

![\[DynamoDB 主控台的設定頁面，顯示屬性型存取控制卡片。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/ddb-console-settings-page.png)


ABAC 不會 AWS 帳戶 為其身分型政策或其他政策中指定的標籤型條件啟用。若您的帳戶未啟用 ABAC，政策中針對 DynamoDB 資料表或索引設計的標籤式條件，將會以資源或 API 請求不含任何標籤的狀態進行評估。當您為帳戶啟用 ABAC 時，系統會依據附加至資料表或 API 請求的標籤，評估帳戶中政策內的標籤式條件。

若要啟用帳戶的 ABAC，我們建議您先依 [政策稽核](#policy-audit-for-abac) 一節所述稽核您的政策。接著，在 IAM 政策中加入 [ABAC 所需的權限](#required-permissions-abac)。最後，依 [在主控台啟用 ABAC](#abac-enable-console) 所述步驟，在目前區域為帳戶啟用 ABAC。啟用 ABAC 後，您可在加入後七個日曆天內選擇退出。

**Topics**
+ [啟用 ABAC 前稽核政策](#policy-audit-for-abac)
+ [啟用 ABAC 所需的 IAM 權限](#required-permissions-abac)
+ [在主控台啟用 ABAC](#abac-enable-console)

## 啟用 ABAC 前稽核政策
<a name="policy-audit-for-abac"></a>

在啟用帳戶的 ABAC 前，請稽核政策，確認帳戶內的標籤式條件均已按預期設定。稽核政策可協助避免啟用 ABAC 後，DynamoDB 工作流程中出現授權變更的意外情況。若要查看使用屬性型條件與標籤的範例，以及 ABAC 實作前後的行為變化，請參閱 [使用 ABAC 搭配 DynamoDB 資料表與索引的範例範例使用案例](abac-example-use-cases.md)。

## 啟用 ABAC 所需的 IAM 權限
<a name="required-permissions-abac"></a>

您需要 `dynamodb:UpdateAbacStatus` 權限，才能在目前區域為帳戶啟用 ABAC。若要確認帳戶是否已啟用 ABAC，您也必須具備 `dynamodb:GetAbacStatus` 權限。具備此權限後，您可在任何區域檢視帳戶的 ABAC 狀態。除了存取 DynamoDB 主控台所需的權限外，您還需要這些額外權限。

下列 IAM 政策授予權限，可啟用 ABAC 並檢視目前區域內帳戶的狀態。

```
{
"version": "2012-10-17", 		 	 	 &TCX5-2025-waiver;
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:UpdateAbacStatus",
                "dynamodb:GetAbacStatus"
             ],
            "Resource": "*"
        }
    ]
}
```

## 在主控台啟用 ABAC
<a name="abac-enable-console"></a>

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/) 開啟 DynamoDB 主控台。

1. 從頂端導覽窗格選取要啟用 ABAC 的區域。

1. 在左側的導覽窗格中，選擇**設定**。

1. 在**設定**頁面執行以下動作：

   1. 在**屬性型存取控制**卡片中，選取**啟用**。

   1. 在**確認屬性型存取控制設定**對話方塊中，選取**啟用**以確認設定。

      這將在目前區域啟用 ABAC，且**屬性型存取控制**卡片會顯示狀態為**開啟**。

      若您在主控台啟用 ABAC 後想退出，可在加入後七個日曆天內執行。若要退出，請前往**設定**頁面，於**屬性型存取控制**卡片中選取**停用**。
**注意**  
更新 ABAC 狀態屬於非同步作業。若政策中的標籤未立即生效，可能需等待一段時間，因為變更的套用會最終一致。

# 在 DynamoDB 資料表與索引中使用 ABAC
<a name="abac-implementation-ddb-tables"></a>

以下步驟示範如何使用 ABAC 設定權限。在此範例中，您將新增標籤至 DynamoDB 資料表，並建立包含標籤式條件的 IAM 角色。接著，您將透過比對標籤條件，測試 DynamoDB 資料表上可用的權限。

**Topics**
+ [步驟 1：將標籤新增至 DynamoDB 資料表](#abac-add-table-tags)
+ [步驟 2：建立包含標籤式條件的 IAM 角色與政策](#abac-create-iam-role)
+ [步驟 3：測試允許的權限](#abac-test-permissions)

## 步驟 1：將標籤新增至 DynamoDB 資料表
<a name="abac-add-table-tags"></a>

您可以使用 AWS 管理主控台、 AWS API、 AWS Command Line Interface (AWS CLI)、 AWS SDK 或 將標籤新增至新的或現有的 DynamoDB 資料表 AWS CloudFormation。例如，下列 [tag-resource](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/tag-resource.html) CLI 指令會將標籤新增至名為 `MusicTable` 的資料表。

```
aws dynamodb tag-resource —resource-arn arn:aws:dynamodb:us-east-1:123456789012:table/MusicTable —tags Key=environment,Value=staging
```

## 步驟 2：建立包含標籤式條件的 IAM 角色與政策
<a name="abac-create-iam-role"></a>

使用 [aws：ResourceTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) 條件金鑰[建立 IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html#access_policies_create-json-editor)，以比較政策中指定的標籤鍵值對與附加至資料表的鍵值對。下列範例政策允許使用者在資料表中放入或更新項目，前提是該資料表包含下列標籤鍵值對：`"environment": "staging"`。若資料表未具指定的標籤鍵值對，系統將拒絕執行這些操作。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:PutItem",
                "dynamodb:UpdateItem"
            ],
            "Resource": "arn:aws:dynamodb:*:*:table/*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/environment": "staging"
                }
            }
        }
    ]
}
```

------

## 步驟 3：測試允許的權限
<a name="abac-test-permissions"></a>

1. 將 IAM 政策附加至 AWS 帳戶中的測試使用者或角色。確認您使用的 IAM 主體未經由其他政策擁有對 DynamoDB 資料表的存取權限。

1. 確認您的 DynamoDB 資料表包含值為 `"staging"` 的 `"environment"` 標籤鍵。

1. 在已標記的資料表上執行 `dynamodb:PutItem` 和 `dynamodb:UpdateItem` 動作。若 `"environment": "staging"` 標籤鍵值對存在，這些動作應可成功執行。

   若在不含 `"environment": "staging"` 標籤鍵值對的資料表上執行這些動作，請求將失敗並返回 `AccessDeniedException`。

您也可以檢閱下一節中說明的其他[範例使用案例](abac-example-use-cases.md)，以實作 ABAC 並進行更多測試。

# 使用 ABAC 搭配 DynamoDB 資料表與索引的範例
<a name="abac-example-use-cases"></a>

下列範例展示使用標籤實作屬性式條件的多種使用案例。

**Topics**
+ [範例 1：使用 aws:ResourceTag 允許動作](#abac-allow-example-resource-tag)
+ [範例 2：使用 aws:RequestTag 允許動作](#abac-allow-example-request-tag)
+ [範例 3：使用 aws:TagKeys 拒絕動作](#abac-deny-example-tag-key)

## 範例 1：使用 aws:ResourceTag 允許動作
<a name="abac-allow-example-resource-tag"></a>

使用 `aws:ResourceTag/tag-key` 條件鍵，您可以比較 IAM 政策中指定的標籤鍵值對與附加在 DynamoDB 資料表中的鍵值對。例如，若 IAM 政策與資料表的標籤條件相符，即可允許執行特定動作，如 [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html)。請依下列步驟操作：

------
#### [ Using the AWS CLI ]

1. 建立資料表。下列範例使用 [create-table](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/create-table.html) AWS CLI 命令來建立名為 的資料表`myMusicTable`。

   ```
   aws dynamodb create-table \
     --table-name myMusicTable \
     --attribute-definitions AttributeName=id,AttributeType=S \
     --key-schema AttributeName=id,KeyType=HASH \
     --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \
     --region us-east-1
   ```

1. 為此資料表新增一個標籤。下列 [tag-resource](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/tag-resource.html) AWS CLI 命令範例會將標籤鍵值對新增至 `Title: ProductManager` `myMusicTable`。

   ```
   aws dynamodb tag-resource --region us-east-1 --resource-arn arn:aws:dynamodb:us-east-1:123456789012:table/myMusicTable --tags Key=Title,Value=ProductManager
   ```

1. 建立[內嵌政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies)並將其新增至已連接 [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html) AWS 受管政策的角色，如下列範例所示。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": "dynamodb:PutItem",
         "Resource": "arn:aws:dynamodb:*:*:table/*",
         "Condition": {
           "StringEquals": {
             "aws:ResourceTag/Title": "ProductManager"
           }
         }
       }
     ]
   }
   ```

------

   當附加至資料表的標籤鍵和值與政策中指定的標籤相符時，此政策允許在該資料表上執行 `PutItem` 動作。

1. 依步驟 3 中說明的政策假設該角色。

1. 使用 [put-item](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/put-item.html) AWS CLI 命令將項目放入 `myMusicTable`。

   ```
   aws dynamodb put-item \
       --table-name myMusicTable --region us-east-1 \
       --item '{
           "id": {"S": "2023"},
           "title": {"S": "Happy Day"},
           "info": {"M": {
               "rating": {"N": "9"},
               "Artists": {"L": [{"S": "Acme Band"}, {"S": "No One You Know"}]},
               "release_date": {"S": "2023-07-21"}
           }}
       }'
   ```

1. 掃描資料表以確認項目是否已成功新增。

   ```
   aws dynamodb scan --table-name myMusicTable  --region us-east-1
   ```

------
#### [ Using the AWS SDK for Java 2.x ]

1. 建立資料表。下列範例使用 [CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html) API 建立名為 `myMusicTable` 的資料表。

   ```
   DynamoDbClient dynamoDB = DynamoDbClient.builder().region(region).build();
   CreateTableRequest createTableRequest = CreateTableRequest.builder()
       .attributeDefinitions(
           Arrays.asList(
               AttributeDefinition.builder()
               .attributeName("id")
               .attributeType(ScalarAttributeType.S)
               .build()
           )
       )
       .keySchema(
           Arrays.asList(
               KeySchemaElement.builder()
               .attributeName("id")
               .keyType(KeyType.HASH)
               .build()
           )
       )
       .provisionedThroughput(ProvisionedThroughput.builder()
           .readCapacityUnits(5L)
           .writeCapacityUnits(5L)
           .build()
       )
       .tableName("myMusicTable")
       .build();
   
   CreateTableResponse createTableResponse = dynamoDB.createTable(createTableRequest);
   String tableArn = createTableResponse.tableDescription().tableArn();
   String tableName = createTableResponse.tableDescription().tableName();
   ```

1. 為此資料表新增一個標籤。下列範例中，[TagResource](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TagResource.html) API 會將標籤鍵值對 `Title: ProductManager` 新增至 `myMusicTable`。

   ```
   TagResourceRequest tagResourceRequest = TagResourceRequest.builder()
       .resourceArn(tableArn)
       .tags(
           Arrays.asList(
               Tag.builder()
               .key("Title")
               .value("ProductManager")
               .build()
           )
       )
       .build();
   dynamoDB.tagResource(tagResourceRequest);
   ```

1. 建立[內嵌政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies)並將其新增至已連接 [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html) AWS 受管政策的角色，如下列範例所示。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": "dynamodb:PutItem",
         "Resource": "arn:aws:dynamodb:*:*:table/*",
         "Condition": {
           "StringEquals": {
             "aws:ResourceTag/Title": "ProductManager"
           }
         }
       }
     ]
   }
   ```

------

   當附加至資料表的標籤鍵和值與政策中指定的標籤相符時，此政策允許在該資料表上執行 `PutItem` 動作。

1. 依步驟 3 中說明的政策假設該角色。

1. 使用 [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html) API 將項目新增至 `myMusicTable`。

   ```
   HashMap<String, AttributeValue> info = new HashMap<>();
   info.put("rating", AttributeValue.builder().s("9").build());
   info.put("artists", AttributeValue.builder().ss(List.of("Acme Band","No One You Know").build());
   info.put("release_date", AttributeValue.builder().s("2023-07-21").build());
   
   HashMap<String, AttributeValue> itemValues = new HashMap<>();
   itemValues.put("id", AttributeValue.builder().s("2023").build());
   itemValues.put("title", AttributeValue.builder().s("Happy Day").build());
   itemValues.put("info", AttributeValue.builder().m(info).build());
   
   
   PutItemRequest putItemRequest = PutItemRequest.builder()
                   .tableName(tableName)
                   .item(itemValues)
                   .build();
   dynamoDB.putItem(putItemRequest);
   ```

1. 掃描資料表以確認項目是否已成功新增。

   ```
   ScanRequest scanRequest = ScanRequest.builder()
                   .tableName(tableName)
                   .build();
                   
   ScanResponse scanResponse = dynamoDB.scan(scanRequest);
   ```

------
#### [ Using the 適用於 Python (Boto3) 的 AWS SDK ]

1. 建立資料表。下列範例使用 [CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html) API 建立名為 `myMusicTable` 的資料表。

   ```
   create_table_response = ddb_client.create_table(
       AttributeDefinitions=[
           {
               'AttributeName': 'id',
               'AttributeType': 'S'
           },
       ],
       TableName='myMusicTable',
       KeySchema=[
           {
               'AttributeName': 'id',
               'KeyType': 'HASH'
           },
       ],
           ProvisionedThroughput={
           'ReadCapacityUnits': 5,
           'WriteCapacityUnits': 5
       },
   )
   
   table_arn = create_table_response['TableDescription']['TableArn']
   ```

1. 為此資料表新增一個標籤。下列範例中，[TagResource](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TagResource.html) API 會將標籤鍵值對 `Title: ProductManager` 新增至 `myMusicTable`。

   ```
   tag_resouce_response = ddb_client.tag_resource(
       ResourceArn=table_arn,
       Tags=[
           {
               'Key': 'Title',
               'Value': 'ProductManager'
           },
       ]
   )
   ```

1. 建立[內嵌政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies)並將其新增至已連接 [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html) AWS 受管政策的角色，如下列範例所示。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
           "Effect": "Allow",
           "Action": "dynamodb:PutItem",
           "Resource": "arn:aws:dynamodb:*:*:table/*",
           "Condition": {
               "StringEquals": {
               "aws:ResourceTag/Title": "ProductManager"
               }
           }
           }
       ]
       }
   ```

------

   當附加至資料表的標籤鍵和值與政策中指定的標籤相符時，此政策允許在該資料表上執行 `PutItem` 動作。

1. 依步驟 3 中說明的政策假設該角色。

1. 使用 [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html) API 將項目新增至 `myMusicTable`。

   ```
   put_item_response = client.put_item(
       TableName = 'myMusicTable'
       Item = {
           'id': '2023',
           'title': 'Happy Day',
           'info': {
               'rating': '9',
               'artists': ['Acme Band','No One You Know'],
               'release_date': '2023-07-21'
           }
       }
   )
   ```

1. 掃描資料表以確認項目是否已成功新增。

   ```
   scan_response = client.scan(
       TableName='myMusicTable'
   )
   ```

------

**未啟用 ABAC**  
如果您的 未啟用 ABAC AWS 帳戶，則 IAM 政策和 DynamoDB 資料表中的標籤條件不相符。因此，`PutItem` 動作會因 `AmazonDynamoDBReadOnlyAccess` 政策的影響而返回 `AccessDeniedException`。

```
An error occurred (AccessDeniedException) when calling the PutItem operation: User: arn:aws:sts::123456789012:assumed-role/DynamoDBReadOnlyAccess/Alice is not authorized to perform: dynamodb:PutItem on resource: arn:aws:dynamodb:us-east-1:123456789012:table/myMusicTable because no identity-based policy allows the dynamodb:PutItem action.
```

**啟用 ABAC**  
如果您的 已啟用 ABAC AWS 帳戶，則`put-item`動作會成功完成，並將新項目新增至您的資料表。這是因為當 IAM 政策與資料表中的標籤條件相符時，資料表中的內嵌政策會允許執行 `PutItem` 動作。

## 範例 2：使用 aws:RequestTag 允許動作
<a name="abac-allow-example-request-tag"></a>

使用 [aws：RequestTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag) 條件金鑰，您可以比較請求中傳遞的標籤鍵值對與 IAM 政策中指定的鍵值對。例如，若標籤條件不相符，您可以使用 `aws:RequestTag` 來允許特定動作 (如 `CreateTable`)。請依下列步驟操作：

------
#### [ Using the AWS CLI ]

1. 建立[內嵌政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies)並將其新增至已連接 [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/ReadOnlyAccess.html) AWS 受管政策的角色，如下列範例所示。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "dynamodb:CreateTable",
                   "dynamodb:TagResource"
               ],
               "Resource": "arn:aws:dynamodb:*:*:table/*",
               "Condition": {
                   "StringEquals": {
                       "aws:RequestTag/Owner": "John"
                   }
               }
           }
       ]
   }
   ```

------

1. 建立一個包含 `"Owner": "John"` 標籤鍵值對的資料表。

   ```
   aws dynamodb create-table \
   --attribute-definitions AttributeName=ID,AttributeType=S \
   --key-schema AttributeName=ID,KeyType=HASH  \
   --provisioned-throughput ReadCapacityUnits=1000,WriteCapacityUnits=500 \
   --region us-east-1 \
   --tags Key=Owner,Value=John \
   --table-name myMusicTable
   ```

------
#### [ Using the 適用於 Python (Boto3) 的 AWS SDK ]

1. 建立[內嵌政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies)並將其新增至已連接 [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html) AWS 受管政策的角色，如下列範例所示。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "dynamodb:CreateTable",
                   "dynamodb:TagResource"
               ],
               "Resource": "arn:aws:dynamodb:*:*:table/*",
               "Condition": {
                   "StringEquals": {
                       "aws:RequestTag/Owner": "John"
                   }
               }
           }
       ]
   }
   ```

------

1. 建立一個包含 `"Owner": "John"` 標籤鍵值對的資料表。

   ```
   ddb_client = boto3.client('dynamodb')
   
   create_table_response = ddb_client.create_table(
       AttributeDefinitions=[
           {
               'AttributeName': 'id',
               'AttributeType': 'S'
           },
       ],
       TableName='myMusicTable',
       KeySchema=[
           {
               'AttributeName': 'id',
               'KeyType': 'HASH'
           },
       ],
           ProvisionedThroughput={
           'ReadCapacityUnits': 1000,
           'WriteCapacityUnits': 500
       },
       Tags=[
           {
               'Key': 'Owner',
               'Value': 'John'
           },
       ],
   )
   ```

------

**未啟用 ABAC**  
如果您的 未啟用 ABAC AWS 帳戶，則內嵌政策和 DynamoDB 資料表中的標籤條件不相符。因此，`CreateTable` 請求會失敗，資料表將不會建立。

```
An error occurred (AccessDeniedException) when calling the CreateTable operation: User: arn:aws:sts::123456789012:assumed-role/Admin/John is not authorized to perform: dynamodb:CreateTable on resource: arn:aws:dynamodb:us-east-1:123456789012:table/myMusicTable because no identity-based policy allows the dynamodb:CreateTable action.
```

**啟用 ABAC**  
如果您的 已啟用 ABAC AWS 帳戶，則您的資料表建立請求會成功完成。由於 `"Owner": "John"` 的標籤鍵值對存在於 `CreateTable` 請求中，內嵌政策允許使用者 `John` 執行 `CreateTable` 動作。

## 範例 3：使用 aws:TagKeys 拒絕動作
<a name="abac-deny-example-tag-key"></a>

使用 [aws：TagKeys](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys) 條件金鑰，您可以比較請求中的標籤金鑰與 IAM 政策中指定的金鑰。例如，若請求中未包含特定標籤鍵 *not*，您可以使用 `aws:TagKeys` 來拒絕特定動作 (如 `CreateTable`)。請依下列步驟操作：

------
#### [ Using the AWS CLI ]

1. 將[客戶受管政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies)新增至已連接 [AmazonDynamoDBFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBFullAccess.html) AWS 受管政策的角色，如下列範例所示。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Deny",
               "Action": [
                   "dynamodb:CreateTable",
                   "dynamodb:TagResource"
               ],
               "Resource": "arn:aws:dynamodb:*:*:table/*",
               "Condition": {
                   "Null": {
                       "aws:TagKeys": "false"
                   },
                   "ForAllValues:StringNotEquals": {
                       "aws:TagKeys": "CostCenter"
                   }
               }
           }
       ]
   }
   ```

------

1. 以附加該政策的角色身分建立含有標籤鍵 `Title` 的資料表。

   ```
   aws dynamodb create-table \
   --attribute-definitions AttributeName=ID,AttributeType=S \
   --key-schema AttributeName=ID,KeyType=HASH  \
   --provisioned-throughput ReadCapacityUnits=1000,WriteCapacityUnits=500 \
   --region us-east-1 \
   --tags Key=Title,Value=ProductManager \
   --table-name myMusicTable
   ```

------
#### [ Using the 適用於 Python (Boto3) 的 AWS SDK ]

1. 將[客戶受管政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies)新增至已連接 [AmazonDynamoDBFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBFullAccess.html) AWS 受管政策的角色，如下列範例所示。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Deny",
               "Action": [
                   "dynamodb:CreateTable",
                   "dynamodb:TagResource"
               ],
               "Resource": "arn:aws:dynamodb:*:*:table/*",
               "Condition": {
                   "Null": {
                       "aws:TagKeys": "false"
                   },
                   "ForAllValues:StringNotEquals": {
                       "aws:TagKeys": "CostCenter"
                   }
               }
           }
       ]
   }
   ```

------

1. 以附加該政策的角色身分建立含有標籤鍵 `Title` 的資料表。

   ```
   ddb_client = boto3.client('dynamodb')
   
   create_table_response = ddb_client.create_table(
       AttributeDefinitions=[
           {
               'AttributeName': 'id',
               'AttributeType': 'S'
           },
       ],
       TableName='myMusicTable',
       KeySchema=[
           {
               'AttributeName': 'id',
               'KeyType': 'HASH'
           },
       ],
           ProvisionedThroughput={
           'ReadCapacityUnits': 1000,
           'WriteCapacityUnits': 500
       },
       Tags=[
           {
               'Key': 'Title',
               'Value': 'ProductManager'
           },
       ],
   )
   ```

------

**未啟用 ABAC**  
如果您的 未啟用 ABAC AWS 帳戶，DynamoDB 不會將`create-table`命令中的標籤金鑰傳送至 IAM。`Null` 條件可確保當請求中沒有標籤鍵時，條件的評估結果為 `false`。由於 `Deny` 政策不相符，`create-table` 指令將成功完成。

**啟用 ABAC**  
如果您的 已啟用 ABAC AWS 帳戶，則 `create-table`命令中傳遞的標籤金鑰會傳遞給 IAM。標籤鍵 `Title` 會根據 `Deny` 政策中所設定的條件型標籤鍵 `CostCenter` 進行比對。由於 `StringNotEquals` 運算子，`Title` 標籤鍵與 `Deny` 政策中的標籤鍵不相符。因此，`CreateTable` 動作將失敗，資料表不會建立。執行 `create-table` 指令時會傳回 `AccessDeniedException`。

```
An error occurred (AccessDeniedException) when calling the CreateTable operation: User: arn:aws:sts::123456789012:assumed-role/DynamoFullAccessRole/ProductManager is not authorized to perform: dynamodb:CreateTable on resource: arn:aws:dynamodb:us-east-1:123456789012:table/myMusicTable with an explicit deny in an identity-based policy.
```

# 疑難排解 DynamoDB 資料表與索引的常見 ABAC 錯誤
<a name="abac-troubleshooting"></a>

本主題提供在 DynamoDB 資料表或索引中實作 ABAC 時，可能遇到的常見錯誤與問題的疑難排解建議。

## 政策中使用服務特定條件金鑰會導致錯誤
<a name="abac-troubleshooting-service-specific-keys"></a>

服務特定條件金鑰不被視為有效的條件金鑰。若在政策中使用此類金鑰，將導致錯誤。若要解決此問題，請將服務特定條件金鑰替換為合適的[條件金鑰，以在 DynamoDB 中實作 ABAC](attribute-based-access-control.md#condition-keys-implement-abac)。

例如，假設您在執行 [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html) 請求的[內嵌政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies)中使用了 `dynamodb:ResourceTag` 條件金鑰。假設請求因 `AccessDeniedException` 而失敗。下列範例顯示包含 `dynamodb:ResourceTag` 條件金鑰的錯誤內嵌政策。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:PutItem"
            ],
            "Resource": "arn:aws:dynamodb:*:*:table/*",
            "Condition": {
                "StringEquals": {
                    "dynamodb:ResourceTag/Owner": "John"
                }
            }
        }
    ]
}
```

------

若要解決此問題，請將 `dynamodb:ResourceTag` 條件金鑰替換為 `aws:ResourceTag`，如下例所示。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:PutItem"
            ],
            "Resource": "arn:aws:dynamodb:*:*:table/*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/Owner": "John"
                }
            }
        }
    ]
}
```

------

## 無法停用 ABAC
<a name="abac-troubleshooting-unable-opt-out"></a>

如果您的帳戶已透過 啟用 ABAC 支援，您將無法透過 DynamoDB 主控台選擇退出 ABAC。若要停用，請聯絡 [支援](https://console.aws.amazon.com/support)。

僅當 *only if* 下列條件成立時，您才可自行停用 ABAC：
+ 您已使用[透過 DynamoDB 主控台選擇加入](abac-enable-ddb.md#abac-enable-console)的自助式流程。
+ 您在選擇加入後七天內停用。

# DynamoDB 中的資料保護
<a name="data-protection"></a>

Amazon DynamoDB 提供高耐用性儲存基礎設施，專為任務關鍵型及主要資料儲存體所設計。資料會以備援方式存放在 Amazon DynamoDB 區域中多個設施的多部裝置上。

DynamoDB 會保護靜態儲存的使用者資料，以及內部部署用戶端與 DynamoDB 之間，以及 DynamoDB 與相同 AWS 區域內其他 AWS 資源之間傳輸中的資料。

**Topics**
+ [DynamoDB 靜態加密](EncryptionAtRest.md)
+ [使用 VPC 端點與 IAM 政策強化 DynamoDB 連線安全性](inter-network-traffic-privacy.md)

# DynamoDB 靜態加密
<a name="EncryptionAtRest"></a>

儲存在 Amazon DynamoDB 中的所有使用者資料都會完全靜態加密。DynamoDB 靜態加密使用存放在 [AWS Key Management Service (AWS KMS)](https://aws.amazon.com/kms/) 的加密金鑰來加密所有靜態資料，藉此提供加強的安全性。此功能協助降低了保護敏感資料所涉及的操作負擔和複雜性。您可以透過靜態加密，建立符合嚴格加密合規和法規要求，而且對安全性要求甚高的應用程式。

每當資料存放到耐用的媒體時，DynamoDB 靜態加密就會透過保護加密資料表中的資料：包括其主索引鍵、本機及全域次要索引、串流、全域資料表、備份和 DynamoDB Accelerator (DAX) 叢集，來提供另一層資料保護。組織政策、行業或政府法規，以及合規要求可能會經常需要使用靜態加密來增加應用程式的資料安全性。如需有關資料庫應用程式加密的詳細資訊，請參閱 [AWS 資料庫加密 SDK](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/what-is-database-encryption-sdk.html)。

靜態加密與 整合 AWS KMS ，用於管理用來加密資料表的加密金鑰。如需金鑰類型與狀態的詳細資訊，請參閱AWS Key Management Service 開發人員指南**中的 [AWS Key Management Service 概念](https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html#key-state-cmk-type)。

建立新資料表時，您可以選擇下列其中一種 AWS KMS key 類型來加密資料表。您可以隨時在這些金鑰類型之間切換。
+ **AWS 擁有的金鑰 –** 預設加密類型。此金鑰是由 DynamoDB 所擁有 (不需額外費用)。
+ **AWS 受管金鑰 –** 金鑰會存放在您的帳戶中，並由 管理 AWS KMS （需AWS KMS 付費）。
+ **客戶自管金鑰 –** 金鑰會存放在您的帳戶中，並且由您建立、擁有且管理。您可以完全控制 KMS 金鑰 （需支付AWS KMS 費用）。

如需金鑰類型的詳細資訊，請參閱[客戶金鑰和 AWS 金鑰](/kms/latest/developerguide/concepts.html#key-mgmt)。

**注意**  
建立啟用靜態加密的新 DAX 叢集時， AWS 受管金鑰 會用來加密叢集中的靜態資料。
如果您的資料表有排序索引鍵，則某些標示範圍界限的排序索引鍵將會以純文字的格式存放在資料表中繼資料中。

當您存取加密的資料表，DynamoDB 會以透明方式解密資料表資料。您不必變更任何代碼或應用程式來使用或管理加密的資料表。DynamoDB 會繼續提供您預期的個位數毫秒的相同延遲，且所有 DynamoDB 查詢會在加密資料上順暢地運作。

您可以使用 AWS 管理主控台、 AWS Command Line Interface (AWS CLI) 或 Amazon DynamoDB API，在建立新資料表或切換現有資料表上的加密金鑰時指定加密金鑰。若要了解作法，請參閱[在 DynamoDB 中管理加密資料表](encryption.tutorial.md)。

使用 AWS 擁有的金鑰 進行靜態加密是免費的。不過， AWS KMS AWS 受管金鑰 和 適用於客戶受管金鑰。如需定價的詳細資訊，請參閱 [AWS KMS 定價](https://aws.amazon.com/kms/pricing)。

DynamoDB 靜態加密適用於所有 AWS 區域，包括 AWS 中國 （北京） 和 AWS 中國 （寧夏） 區域和 AWS GovCloud （美國） 區域。如需詳細資訊，請參閱[DynamoDB 靜態加密運作原理](encryption.howitworks.md)及[DynamoDB 靜態加密使用須知](encryption.usagenotes.md)。

# DynamoDB 靜態加密運作原理
<a name="encryption.howitworks"></a>

Amazon DynamoDB 靜態加密功能會使用 256 位元的進階加密標準 (AES-256) 來加密您的資料，此項標準有助於防止對底層儲存未經授權的存取，進而保護您的資料。

靜態加密與 AWS Key Management Service (AWS KMS) 整合，用於管理用來加密資料表的加密金鑰。

**注意**  
在 2022 年 5 月， 的輪換排程 AWS 受管金鑰 從每三年 （約 1，095 天） AWS KMS 變更為每年 （約 365 天）。  
新的 AWS 受管金鑰 會在建立後自動輪換一年，之後大約每年輪換一次。  
現有的 AWS 受管金鑰 會在最近一次輪換後一年自動輪換，之後每年輪換一次。

## AWS 擁有的金鑰
<a name="ddb-owned"></a>

 AWS 擁有的金鑰 不會存放在您的帳戶中 AWS 。它們是 KMS 金鑰集合的一部分，其 AWS 擁有和管理用於多個 AWS 帳戶。 AWS 服務可以使用 AWS 擁有的金鑰 來保護您的資料。DynamoDB AWS 擁有的金鑰 使用的 會每年輪換 （約 365 天）。

您無法檢視、管理或使用 AWS 擁有的金鑰或稽核其使用方式。不過，您不需要執行任何工作或變更任何程式，即可保護加密您的資料的金鑰。

您不需要支付每月費用或使用費 AWS 擁有的金鑰，也不會計入您帳戶的 AWS KMS 配額。

## AWS 受管金鑰
<a name="managed-key-service-default-kms"></a>

AWS 受管金鑰 是您帳戶中的 KMS 金鑰，由與 整合的 AWS 服務代表您建立、管理和使用 AWS KMS。您可以檢視您的帳戶中的 AWS 受管金鑰 ，檢視其金鑰政策，以及在 AWS CloudTrail 日誌中稽核其使用方式。不過，您無法管理這些 KMS 金鑰或變更其許可。

靜態加密會自動與 整合 AWS KMS ，以管理用於加密資料表 AWS 受管金鑰 的 DynamoDB (`aws/dynamodb`) 專用 。如果在建立加密的 DynamoDB 資料表時 AWS 受管金鑰 不存在 ， AWS KMS 會自動為您建立新的金鑰。此金鑰會與未來建立的加密資料表搭配使用。 AWS KMS 結合安全、高可用性的硬體和軟體，以提供針對雲端擴展的金鑰管理系統。

如需管理 許可的詳細資訊 AWS 受管金鑰，請參閱[《 開發人員指南》中的授權使用 AWS 受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-authz) 。 *AWS Key Management Service *

## 客戶自管金鑰
<a name="managed-key-customer-managed"></a>

客戶受管金鑰是您帳戶中建立、擁有和管理 AWS 的 KMS 金鑰。您可以完全控制這些 KMS 金鑰，包括建立和維護其金鑰政策、IAM 政策和授與、啟用和停用它們、輪換其密碼編譯材料、新增標籤、建立參考別名，以及排程供刪除。如需管理客戶自管金鑰權限的詳細資訊，請參閱[客戶自管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。

當您指定一個客戶自管金鑰作為資料表層級加密金鑰時，DynamoDB 資料表、本機和全域次要索引及串流皆會以相同的客戶自管金鑰加密。隨需備份會以於備份建立時指定的資料表層級加密金鑰加密。更新資料表層級加密金鑰並不會變更與現有隨需備份相關的加密金鑰。

將客戶自管金鑰的狀態設為停用，或排定其刪除時間，可避免所有使用者和 DynamoDB 服務可在資料表上加密或解密資料，以及執行讀取或寫入操作。DynamoDB 必須能夠存取您的加密金鑰，才能確保您可以繼續存取資料表並避免資料遺失。

如果您停用客戶自管金鑰或排定其刪除的時間，您的資料表狀態就會成為 **Inaccessible** (無法存取)。為確保您可以持續使用資料表進行作業，您必須在七天內為指定的加密金鑰提供 DynamoDB 存取權限。只要服務偵測到您的加密金鑰無法存取，DynamoDB 就會寄送電子通知提醒您。

**注意**  
如果您的客戶自管金鑰仍然無法由 DynamoDB 服務存取且時間超過七天，資料表就會存檔並無法再存取。DynamoDB 會建立資料表的隨需備份，並會向您收取費用。您可以使用隨需備份還原您的資料至新的資料表。若要開始還原，最後一個在資料表中的客戶自管金鑰必須啟用，且 DynamoDB 必須可以存取該資料表。
如果用來加密全域資料表複本的客戶自管金鑰無法存取，DynamoDB 會從複寫群組中移除此複本。將不會刪除複本，且複寫將會在偵測到客戶自管金鑰為無法存取後 20 小時停止進出此區域。

如需更多詳細資訊，請參閱[啟用金鑰](/kms/latest/developerguide/enabling-keys.html)和[刪除金鑰。](/kms/latest/developerguide/deleting-keys.html)

## 使用 的注意事項 AWS 受管金鑰
<a name="managed-key-notes"></a>

除非 Amazon DynamoDB 可存取存放在您 AWS KMS 帳戶中的 KMS 金鑰，否則無法讀取您的資料表資料。DynamoDB 使用封套加密和金鑰階層來加密資料。您的 AWS KMS 加密金鑰用於加密此金鑰階層的根金鑰。如需詳細資訊，請參閱《AWS Key Management Service 開發人員指南》中的[封套加密](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#enveloping)。

 DynamoDB 不會 AWS KMS 呼叫每個 DynamoDB 操作。對於每個具活躍流量的用戶端連線，金鑰會每 5 分鐘重新整理一次。

請確定您已設定好 SDK，來重複使用連線。否則，您會遇到來自 DynamoDB 的延遲，必須為每個 DynamoDB 操作重新建立新的 AWS KMS 快取項目。此外，您可能必須面對更高的 AWS KMS 和 CloudTrail 成本。例如，若要使用 Node.js SDK 來執行這項動作，您可以在 `keepAlive` 開啟時，建立新的 HTTPS 代理。如需詳細資訊，請參閱《*適用於 JavaScript 的 AWS SDK 開發人員指南*》中的[在 Node.js 中設定 keepAlive](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/node-reusing-connections.html)。

# DynamoDB 靜態加密使用須知
<a name="encryption.usagenotes"></a>

在您使用 Amazon DynamoDB 中靜態加密時請考量以下項目。

## 所有資料表資料都會加密
<a name="encryption.usagenotes.tabledata"></a>

已對所有 DynamoDB 資料表資料啟用伺服器端靜態加密，且無法停用。您無法僅加密資料表中的項目子集。

只有持久性儲存媒體上的資料是靜態 (靜止) 時，靜態加密才會加密資料。如果對傳輸中資料或使用中資料有資料安全性的疑慮，您可能需要進行額外的措施：
+ 傳輸中的資料：DynamoDB 中的所有資料都是在傳輸中加密的。根據預設，與 DynamoDB 之間的通訊會使用 HTTPS 協定，其使用 Secure Sockets Layer (SSL)/Transport Layer Security (TLS) 加密保護網路流量。
+ 使用中資料：在將資料傳送至 DynamoDB 前使用用戶端加密來保護資料。如需詳細資訊，請參閱《Amazon DynamoDB Encryption Client 開發人員指南》中的[用戶端與伺服器端加密](https://docs.aws.amazon.com/dynamodb-encryption-client/latest/devguide/client-server-side.html)。

您可以將串流與加密的資料表搭配著使用。DynamoDB Streams 一律會以資料表層級加密金鑰加密。如需詳細資訊，請參閱 [DynamoDB Streams 的變更資料擷取](Streams.md)。

DynamoDB 的備份會受到加密，且從備份恢復的資料表也已啟用加密。您可以使用 AWS 擁有的金鑰 AWS 受管金鑰或客戶受管金鑰來加密備份資料。如需詳細資訊，請參閱[DynamoDB 的備份與還原](Backup-and-Restore.md)。

本機次要索引和全域次要索引會使用與基礎資料表相同的金鑰加密。

## 加密類型
<a name="encryption.usagenotes.encryptiontypes"></a>

**注意**  
Global Table 版本 2017 不支援客戶自管金鑰。如果要在 DynamoDB Global Table 中使用客戶自管金鑰，則需要將資料表升級為 Global Table 版本 2019，然後將其啟用。

在 上 AWS 管理主控台，加密類型是當您使用 AWS 受管金鑰 或客戶受管金鑰來加密資料`KMS`時。使用 AWS 擁有的金鑰時，加密類型為 `DEFAULT`。在 Amazon DynamoDB API 中，加密類型是當您使用 AWS 受管金鑰 或客戶受管金鑰`KMS`時。在缺少加密類型的情況下，會使用 AWS 擁有的金鑰來加密資料。您可以隨時在 AWS 擁有的金鑰 AWS 受管金鑰和客戶受管金鑰之間切換。您可以使用 主控台、 AWS Command Line Interface (AWS CLI) 或 Amazon DynamoDB API 來切換加密金鑰。

請注意，使用客戶自管金鑰時有下列限制：
+ 您無法搭配 DynamoDB Accelerator (DAX) 叢集使用客戶自管金鑰。如需詳細資訊，請參閱 [DAX 靜態加密](DAXEncryptionAtRest.md)。
+ 您可以使用客戶自管金鑰來加密使用交易的資料表。不過，為了確保交易傳播的持久性，服務會暫時儲存交易請求的副本，並使用 AWS 擁有的金鑰進行加密。資料表和次要索引中已遞交的資料一律會使用客戶自管金鑰進行靜態加密。
+ 您可以使用客戶自管金鑰來加密使用 Contributor Insights 的資料表。不過，傳輸至 的資料 Amazon CloudWatch 會使用 加密 AWS 擁有的金鑰。
+ 當您轉換到新的客戶受管金鑰時，請務必保持啟用原始金鑰，直到程序完成為止。 AWS 仍然需要原始金鑰來解密資料，才能使用新的金鑰進行加密。當資料表的 SSE 描述狀態為「啟用」，且顯示新客戶自管金鑰的 KMSMasterKeyArn 時，程序就會完成。此時可以停用或排程刪除原始金鑰。
+ 顯示新的客戶自管金鑰後，資料表和任何新的隨需備份都會使用新的金鑰加密。
+ 任何現有的隨需備份都會使用建立備份時使用的客戶自管金鑰進行加密。您將需要相同的金鑰來還原這些備份。您可以使用 DescribeBackup API 來檢視該備份的 SSE 描述，識別建立每個備份的期間的金鑰。
+ 如果您停用客戶自管金鑰或排定其刪除的時間，所有在 DynamoDB Streams 中的資料仍有 24 小時的生命週期。任何未擷取的活動資料如果超過 24 小時，則符合裁剪的資格。
+ 如果您停用客戶自管金鑰或排定其刪除的時間，存留時間 (TTL) 刪除就會持續 30 分鐘。這些 TTL 刪除會持續發出至 DynamoDB Streams，並符合標準裁剪/保留間隔。

  如需更多詳細資訊，請參閱[啟用金鑰](/kms/latest/developerguide/enabling-keys.html)和[刪除金鑰。](/kms/latest/developerguide/deleting-keys.html)

## 使用 KMS 金鑰和資料金鑰
<a name="dynamodb-kms"></a>

DynamoDB 靜態加密功能使用 AWS KMS key 和資料金鑰階層來保護您的資料表資料。當 DynamoDB 串流、全域資料表和備份寫入到持久性媒體時，DynamoDB 會使用相同的金鑰階層來保護 DynamoDB 串流、全域資料表和備份。

我們建議您先規劃加密策略，再於 DynamoDB 中使用資料表。如果您將敏感或機密資料儲存在 DynamoDB，請考慮在計劃中加入用戶端加密。如此一來，您就能盡量靠近資料來源進行加密，並確保資料在整個生命週期受到保護。如需詳細資訊，請參閱 [DynamoDB 加密客戶端](https://docs.aws.amazon.com/dynamodb-encryption-client/latest/devguide/what-is-ddb-encrypt.html)文件。

**AWS KMS key**  
靜態加密會保護 AWS KMS key下的 DynamoDB 資料表。根據預設，DynamoDB 會使用 [AWS 擁有的金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk)，這是一種在 DynamoDB 服務帳戶中建立和管理的多租用戶加密金鑰。但是，您可以使用[客戶自管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)或 AWS 帳戶中 DynamoDB (`aws/dynamodb`) 加密您的 DynamoDB 資料表。您可以為每個資料表選取不同的 KMS 金鑰。您為資料表選取的 KMS 金鑰也會用來加密其本機和全域次要索引、串流和備份。  
建立或更新資料表時，您可以選取資料表的 KMS 金鑰。您可以隨時在 DynamoDB 主控台或使用 [UpdateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html) 操作變更資料表的 KMS 金鑰。切換金鑰的程序是無縫的，且不需要停機時間或降低服務效能。  
DynamoDB 僅支援[對稱 KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#symmetric-cmks)。您無法使用[非對稱 KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html#asymmetric-cmks)來加密您的 DynamoDB 資料表。
使用客戶自管金鑰來取得下列功能：  
+ 您可以建立和管理 KMS 金鑰，包括設定[金鑰政策](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)、[IAM 政策](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html)和[授予](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)來控制對 KMS 金鑰的存取。您可以[啟用和停用](https://docs.aws.amazon.com/kms/latest/developerguide/enabling-keys.html) KMS 金鑰、啟用和停用[自動金鑰輪換](https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html)，以及於不再使用時[刪除 KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/deleting-keys.html)。
+ 您可以搭配[匯入的金鑰材料](https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html)使用客戶自管金鑰，或是使用位於您所擁有及管理[自訂金鑰存放區](https://docs.aws.amazon.com/kms/latest/developerguide/custom-key-store-overview.html)中的客戶自管金鑰。
+ 您可以在 [AWS CloudTrail 日誌](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-cmk-trail) AWS KMS 中檢查對 的 DynamoDB API 呼叫，以稽核 DynamoDB 資料表的加密和解密。
 AWS 受管金鑰 如果您需要以下任何功能，請使用 ：  
+ 您可以[檢視 KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/viewing-keys.html)和[檢視其金鑰政策](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-viewing.html)。(您無法變更金鑰政策。)
+ 您可以在[AWS CloudTrail 日誌](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-cmk-trail) AWS KMS 中檢查對 的 DynamoDB API 呼叫，以稽核 DynamoDB 資料表的加密和解密。
不過， AWS 擁有的金鑰 是免費的，其使用不會計入[AWS KMS 資源或請求配額](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html)。客戶受管金鑰和 會針對每個 API AWS KMS 呼叫 AWS 受管金鑰 [產生費用](https://aws.amazon.com/kms/pricing/)，而配額適用於這些 KMS 金鑰。

**資料表金鑰**  
DynamoDB 對資料表使用 KMS 金鑰來為資料表[產生](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)和加密唯一的[資料金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys)，稱為*資料表金鑰*。資料表金鑰會在加密資料表的生命週期內持續存在。  
資料表金鑰用作金鑰加密金鑰。DynamoDB 使用此資料表金鑰來保護用於加密資料表資料的資料加密金鑰。DynamoDB 會為資料表中的每個基礎結構產生唯一的資料加密金鑰，但多個資料表項目可能受到相同的資料加密金鑰保護。  

![\[使用靜態加密來加密 DynamoDB 資料表\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/service-ddb-encrypt.png)

當您第一次存取加密的資料表時，DynamoDB 會傳送請求給 AWS KMS ，以使用 KMS 金鑰來解密資料表金鑰。然後，它使用純文字資料表金鑰來解密資料加密金鑰，並使用純文字資料加密金鑰來解密資料表資料。  
DynamoDB 會存放並使用 外部的資料表金鑰和資料加密金鑰 AWS KMS。它使用[進階加密標準](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) (AES) 加密和 256 位元加密金鑰來保護所有金鑰。然後，它會將加密金鑰與加密資料一起存放，以便這些資料可用來隨需解密資料表。  
如果您變更了資料表的 KMS 金鑰，DynamoDB 便會產生新的資料表金鑰。然後，使用新的資料表金鑰來重新加密資料加密金鑰。

**資料表金鑰快取**  
為了避免 AWS KMS 針對每個 DynamoDB 操作呼叫 ，DynamoDB 會快取記憶體中每個呼叫者的純文字資料表金鑰。如果 DynamoDB 在閒置五分鐘後收到快取資料表金鑰的請求，則會將新的請求傳送至 AWS KMS 以解密資料表金鑰。此呼叫將擷取自上次請求解密資料表金鑰以來，對 或 AWS Identity and Access Management (IAM) 中 AWS KMS KMS 金鑰存取政策所做的任何變更。

## 授權使用您的 KMS 金鑰
<a name="dynamodb-kms-authz"></a>

如果您使用[客戶自管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)或帳戶中的 [AWS 受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) 保護您的 DynamoDB 資料表，該 KMS 金鑰的政策必須允許 DynamoDB 代您使用該金鑰。 AWS 受管金鑰 適用於 DynamoDB 的 上的授權內容包含其金鑰政策和授予，以委派使用它的許可。

您可以完全控制客戶自管金鑰的政策和授予，因為 AWS 受管金鑰 在您的帳戶中，您可以檢視其政策和授予。但是，由於由 管理 AWS，您無法變更政策。

DynamoDB 不需要額外的授權，即可使用預設值[AWS 擁有的金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys)來保護您 中的 DynamoDB 資料表 AWS 帳戶。

**Topics**
+ [的金鑰政策 AWS 受管金鑰](#dynamodb-policies)
+ [客戶自管金鑰的金鑰政策](#dynamodb-customer-cmk-policy)
+ [使用授予來授權 DynamoDB](#dynamodb-grants)

### 的金鑰政策 AWS 受管金鑰
<a name="dynamodb-policies"></a>

當 DynamoDB 在密碼編譯操作中使用適用於 DynamoDB (`aws/dynamodb`) 的 [AWS 受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) 時，它是代表正在存取 [DynamoDB 資源](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/access-control-overview.html)的使用者進行這項操作。上的金鑰政策 AWS 受管金鑰 提供帳戶中所有使用者使用 AWS 受管金鑰 進行指定操作的許可。但是，只有在 DynamoDB 代表使用者提出請求時才會授予許可。除非請求源自 DynamoDB 服務， AWS 受管金鑰 否則金鑰政策中的 [ViaService 條件](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-via-service)不允許任何使用者使用 。

此金鑰政策與所有政策一樣 AWS 受管金鑰，是由 建立 AWS。您不能改變它，但可以隨時檢視它。如需詳細資訊，請參閱[檢視金鑰政策](https://docs.aws.amazon.com//kms/latest/developerguide/key-policy-viewing.html)。

金鑰政策中的政策陳述式具有下列效果：
+ 當請求來自 DynamoDB 時，允許帳戶中的使用者在密碼編譯操作中使用 AWS 受管金鑰 適用於 DynamoDB 的 。此政策也允許使用者為 KMS 金鑰[建立授予](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-grants)。
+ 允許帳戶中授權的 IAM 身分檢視 DynamoDB AWS 受管金鑰 的屬性，並[撤銷允許 DynamoDB 使用 KMS 金鑰的授予](https://docs.aws.amazon.com/kms/latest/APIReference/API_RevokeGrant.html)。DynamoDB 使用[授予](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-grants)進行持續的維護操作。
+ 允許 DynamoDB 執行唯讀操作，在您的帳戶中尋找 AWS 受管金鑰 適用於 DynamoDB 的 。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Id" : "auto-dynamodb-1",
  "Statement" : [ {
    "Sid" : "Allow access through Amazon DynamoDB for all principals in the account that are authorized to use Amazon DynamoDB",
    "Effect" : "Allow",
    "Principal" : {
      "AWS" : "*"
    },
    "Action" : [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:CreateGrant", "kms:DescribeKey" ],
    "Resource" : "*",
    "Condition" : {
      "StringEquals" : {
        "kms:CallerAccount" : "111122223333",
        "kms:ViaService" : "dynamodb.us-west-2.amazonaws.com"
      }
    }
  }, {
    "Sid" : "Allow direct access to key metadata to the account",
    "Effect" : "Allow",
    "Principal" : {
      "AWS" : "arn:aws:iam::111122223333:root"
    },
    "Action" : [ "kms:Describe*", "kms:Get*", "kms:List*", "kms:RevokeGrant" ],
    "Resource" : "*"
  }, {
    "Sid" : "Allow DynamoDB Service with service principal name dynamodb.amazonaws.com to describe the key directly",
    "Effect" : "Allow",
    "Principal" : {
      "Service" : "dynamodb.amazonaws.com"
    },
    "Action" : [ "kms:Describe*", "kms:Get*", "kms:List*" ],
    "Resource" : "*"
  } ]
}
```

------

### 客戶自管金鑰的金鑰政策
<a name="dynamodb-customer-cmk-policy"></a>

當您選取[客戶自管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)來保護 DynamoDB 資料表時，DynamoDB 會取得許可，代替進行選取的主體使用 KMS 金鑰。該主體 (使用者或角色) 必須在 KMS 金鑰上擁有 DynamoDB 需要的許可。您可以在[金鑰政策](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)、[IAM 政策](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html)或[授予](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)中提供這些許可。

至少，DynamoDB 在客戶自管金鑰上需要具備下列許可：
+ [kms:Encrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Encrypt.html)
+ [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)
+ [kms:ReEncrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html)\$1 (適用於 kms:ReEncryptFrom and kms:ReEncryptTo)
+ kms:GenerateDataKey\$1 (適用於 [kms:GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) 和 [kms:GenerateDataKeyWithoutPlaintext](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html))
+ [kms:DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)
+ [kms:CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html)

例如，以下範例金鑰政策只會提供必要許可。政策具有下列效果：
+ 允許 DynamoDB 在密碼編譯操作中使用 KMS 金鑰並建立授予，但只有在其代替具備使用 DynamoDB 許可帳戶中的主體時才能進行。如果政策陳述式中指定的主體沒有使用 DynamoDB 的許可，呼叫便會失敗，即使呼叫是來自 DynamoDB 服務也一樣。
+ [kms:ViaService](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-via-service) 條件索引鍵只會在請求來自 DynamoDB，且其是代替政策陳述式中列出的主體時，才會允許許可。這些主體無法直接呼叫這些操作。請注意，`kms:ViaService` 值 (`dynamodb.*.amazonaws.com`) 在區域位置中有星號 (\$1)。DynamoDB 需要獨立於任何特定 的許可， AWS 區域 才能進行跨區域呼叫以支援 [DynamoDB 全域資料表](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html)。
+ 給予 KMS 金鑰管理員 (可取得 `db-team` 角色的使用者) 對 KMS 金鑰的唯讀存取權以及撤銷授予的許可，包括 [DynamoDB 需要用來保護資料表的授予](#dynamodb-grants)。

使用範例金鑰政策之前，請將範例主體取代為來自您的實際主體 AWS 帳戶。

------
#### [ JSON ]

****  

```
{
  "Id": "key-policy-dynamodb",
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid" : "Allow access through Amazon DynamoDB for all principals in the account that are authorized to use Amazon DynamoDB",
      "Effect": "Allow",
      "Principal": {"AWS": "arn:aws:iam::111122223333:user/db-lead"},
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey",
        "kms:CreateGrant"
      ],
      "Resource": "*",      
      "Condition": { 
         "StringLike": {
           "kms:ViaService" : "dynamodb.*.amazonaws.com"
         }
      }
    },
    {
      "Sid":  "Allow administrators to view the KMS key and revoke grants",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:role/db-team"
       },
      "Action": [
        "kms:Describe*",
        "kms:Get*",
        "kms:List*",
        "kms:RevokeGrant"
      ],
      "Resource": "*"
    }
  ]
}
```

------

### 使用授予來授權 DynamoDB
<a name="dynamodb-grants"></a>

除了金鑰政策外，DynamoDB 會使用授予在客戶自管金鑰或 AWS 受管金鑰 for DynamoDB (`aws/dynamodb`) 上設定許可。若要檢視您帳戶中 KMS 金鑰的授予，請使用 [ListGrants](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListGrants.html) 操作。DynamoDB 不需要授予或任何其他許可，即可使用 [AWS 擁有的金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk) 來保護您的資料表。

DynamoDB 在執行背景系統維護和持續資料保護任務時使用授予許可。它還使用授與來產生[資料表金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-encrypt)。

每個授與都專屬於一個資料表。如果帳戶包含使用相同 KMS 金鑰加密的多個資料表，則每個資料表有每一種類型的授予。授予受到 [DynamoDB 加密內容](#dynamodb-encryption-context)的限制，其中包含資料表名稱和 AWS 帳戶 ID，並包含不再需要的淘[汰授予](https://docs.aws.amazon.com/kms/latest/APIReference/API_RetireGrant.html)的許可。

如要建立授予，DynamoDB 必須擁有代替建立加密資料表使用者呼叫 `CreateGrant` 的許可。對於 AWS 受管金鑰，DynamoDB 會從[金鑰政策](#dynamodb-policies)取得`kms:CreateGrant`許可，這允許帳戶使用者只有在 DynamoDB 代表授權使用者提出請求時，才對 KMS 金鑰呼叫 [CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html)。

金鑰政策也會允許帳戶[撤銷 KMS 金鑰上的授予](https://docs.aws.amazon.com/kms/latest/APIReference/API_RevokeGrant.html)。不過，如果您撤銷作用中加密資料表的授予，DynamoDB 將無法保護和維護資料表。

## DynamoDB 加密內容
<a name="dynamodb-encryption-context"></a>

[加密內容](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)是一組金鑰/值對，其中包含任意非私密資料。當您在加密資料的請求中包含加密內容時， 會以 AWS KMS 加密方式將加密內容繫結至加密的資料。若要解密資料，您必須傳遞相同的加密內容。

DynamoDB 在所有 AWS KMS 密碼編譯操作中使用相同的加密內容。如果使用[客戶自管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)或 [AWS 受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) 來保護您的 DynamoDB 資料表，您可以使用加密內容來識別在稽核記錄和日誌中使用 KMS 金鑰的情況。它還會在日誌中以純文字顯示，例如 [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) 和 [Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html)。

加密內容也可以用作政策和授予中的授權條件。DynamoDB 使用加密內容來限制允許存取客戶受管金鑰或您 AWS 受管金鑰 帳戶和區域中的[授予](#dynamodb-grants)。

在其對 的請求中 AWS KMS，DynamoDB 使用具有兩個鍵/值對的加密內容。

```
"encryptionContextSubset": {
    "aws:dynamodb:tableName": "Books"
    "aws:dynamodb:subscriberId": "111122223333"
}
```
+ **資料表** – 第一個鍵值對會識別 DynamoDB 正在加密的資料表。金鑰為 `aws:dynamodb:tableName`。值是資料表的名稱。

  ```
  "aws:dynamodb:tableName": "<table-name>"
  ```

  例如：

  ```
  "aws:dynamodb:tableName": "Books"
  ```
+ **帳戶** – 第二個鍵值對會識別 AWS 帳戶。金鑰為 `aws:dynamodb:subscriberId`。值是帳戶 ID。

  ```
  "aws:dynamodb:subscriberId": "<account-id>"
  ```

  例如：

  ```
  "aws:dynamodb:subscriberId": "111122223333"
  ```

## 監控 DynamoDB 與 的互動 AWS KMS
<a name="dynamodb-cmk-trail"></a>

如果您使用[客戶受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)或 [AWS 受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk)來保護 DynamoDB 資料表，您可以使用 AWS CloudTrail 日誌來追蹤 DynamoDB AWS KMS 代表您傳送到 的請求。

本節將討論 `GenerateDataKey`、`Decrypt` 和 `CreateGrant` 請求。此外，DynamoDB 會使用 [DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html) 操作來判斷您選取的 KMS 金鑰是否存在於帳戶和區域內。當您刪除資料表時，它也使用 [RetireGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_RetireGrant.html) 操作來移除授與。

**GenerateDataKey**  
當您在資料表上啟用靜態加密時，DynamoDB 會建立唯一的資料表金鑰。它會將 *[GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)* 請求傳送至 AWS KMS ，以指定資料表的 KMS 金鑰。  
記錄 `GenerateDataKey` 操作的事件類似於以下範例事件。使用者是 DynamoDB 服務帳戶。參數包括秘密 KMS 金鑰的 Amazon Resource Name (ARN)、需要 256 位元金鑰的金鑰規範，以及識別資料表和 AWS 帳戶的[加密內容](#dynamodb-encryption-context)。  

```
{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "AWSService", 
        "invokedBy": "dynamodb.amazonaws.com" 
    },
    "eventTime": "2018-02-14T00:15:17Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "GenerateDataKey",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "dynamodb.amazonaws.com",
    "userAgent": "dynamodb.amazonaws.com",
    "requestParameters": {
        "encryptionContext": {
            "aws:dynamodb:tableName": "Services",
            "aws:dynamodb:subscriberId": "111122223333"
        }, 
        "keySpec": "AES_256", 
        "keyId": "1234abcd-12ab-34cd-56ef-1234567890ab"
    }, 
    "responseElements": null,
    "requestID": "229386c1-111c-11e8-9e21-c11ed5a52190",
    "eventID": "e3c436e9-ebca-494e-9457-8123a1f5e979",
    "readOnly": true,
    "resources": [
        {
            "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "accountId": "111122223333",
            "type": "AWS::KMS::Key" 
        } 
    ],
    "eventType": "AwsApiCall",
    "recipientAccountId": "111122223333",
    "sharedEventID": "bf915fa6-6ceb-4659-8912-e36b69846aad"
}
```

**解密**  
當您存取加密的 DynamoDB 資料表時，DynamoDB 需要解密資料表金鑰以便解密階層下方的金鑰。然後解密資料表中的資料。解密資料表金鑰。DynamoDB 會將[解密](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)請求傳送至 AWS KMS ，以指定資料表的 KMS 金鑰。  
記錄 `Decrypt` 操作的事件類似於以下範例事件。使用者是您存取資料表的委託 AWS 帳戶 人。這些參數包括加密的資料表金鑰 （做為加密文字 Blob)，以及識別資料表和 的[加密內容](#dynamodb-encryption-context) AWS 帳戶。 會從加密文字 AWS KMS 衍生 KMS 金鑰的 ID。  

```
{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROAIGDTESTANDEXAMPLE:user01",
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/user01",
        "accountId": "111122223333",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "sessionContext": {
            "attributes": {
                "mfaAuthenticated": "false", 
                "creationDate": "2018-02-14T16:42:15Z"
            },
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROAIGDT3HGFQZX4RY6RU",
                "arn": "arn:aws:iam::111122223333:role/Admin",
                "accountId": "111122223333",
                "userName": "Admin" 
            }
        },
        "invokedBy": "dynamodb.amazonaws.com"
    },
    "eventTime": "2018-02-14T16:42:39Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "Decrypt",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "dynamodb.amazonaws.com",
    "userAgent": "dynamodb.amazonaws.com",
    "requestParameters": 
    {
        "encryptionContext":
        {
            "aws:dynamodb:tableName": "Books",
            "aws:dynamodb:subscriberId": "111122223333" 
        }
    }, 
    "responseElements": null, 
    "requestID": "11cab293-11a6-11e8-8386-13160d3e5db5",
    "eventID": "b7d16574-e887-4b5b-a064-bf92f8ec9ad3", 
    "readOnly": true, 
    "resources": [ 
        {
            "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "accountId": "111122223333", 
            "type": "AWS::KMS::Key" 
        }
    ],
    "eventType": "AwsApiCall", 
    "recipientAccountId": "111122223333"
}
```

**CreateGrant**  
當您使用[客戶自管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)或 [AWS 受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) 保護您的 DynamoDB 資料表時，DynamoDB 會使用[授權](#dynamodb-grants)，以允許服務執行持續資料保護和維護及耐用性任務。[AWS 擁有的金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk) 上不需要這些授予。  
DynamoDB 建立的授予專屬於特定資料表。[CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html) 請求中的主體是建立資料表的使用者。  
記錄 `CreateGrant` 操作的事件類似於以下範例事件。參數包括資料表的 KMS 金鑰的 Amazon Resource Name (ARN)、承授者主體和淘汰主體 (DynamoDB 服務)，以及授予涵蓋的操作。它還包含一個限制，要求所有加密操作使用指定的[加密內容](#dynamodb-encryption-context)。  

```
{ 
    "eventVersion": "1.05", 
    "userIdentity": 
    { 
        "type": "AssumedRole", 
        "principalId": "AROAIGDTESTANDEXAMPLE:user01", 
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/user01", 
        "accountId": "111122223333", 
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE", 
        "sessionContext": { 
            "attributes": { 
                "mfaAuthenticated": "false", 
                "creationDate": "2018-02-14T00:12:02Z" 
            }, 
            "sessionIssuer": { 
                "type": "Role", 
                "principalId": "AROAIGDTESTANDEXAMPLE", 
                "arn": "arn:aws:iam::111122223333:role/Admin", 
                "accountId": "111122223333", 
                "userName": "Admin" 
            }
        }, 
        "invokedBy": "dynamodb.amazonaws.com" 
    }, 
    "eventTime": "2018-02-14T00:15:15Z", 
    "eventSource": "kms.amazonaws.com", 
    "eventName": "CreateGrant", 
    "awsRegion": "us-west-2", 
    "sourceIPAddress": "dynamodb.amazonaws.com", 
    "userAgent": "dynamodb.amazonaws.com", 
    "requestParameters": { 
        "keyId": "1234abcd-12ab-34cd-56ef-1234567890ab", 
        "retiringPrincipal": "dynamodb.us-west-2.amazonaws.com", 
        "constraints": { 
            "encryptionContextSubset": {
                "aws:dynamodb:tableName": "Books",
                "aws:dynamodb:subscriberId": "111122223333" 
            } 
        }, 
        "granteePrincipal": "dynamodb.us-west-2.amazonaws.com", 
        "operations": [ 
            "DescribeKey", 
            "GenerateDataKey", 
            "Decrypt", 
            "Encrypt", 
            "ReEncryptFrom", 
            "ReEncryptTo", 
            "RetireGrant" 
        ] 
    }, 
    "responseElements": { 
        "grantId": "5c5cd4a3d68e65e77795f5ccc2516dff057308172b0cd107c85b5215c6e48bde" 
    }, 
    "requestID": "2192b82a-111c-11e8-a528-f398979205d8", 
    "eventID": "a03d65c3-9fee-4111-9816-8bf96b73df01", 
    "readOnly": false, 
    "resources": [ 
        { 
            "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "accountId": "111122223333", 
            "type": "AWS::KMS::Key" 
        } 
    ], 
    "eventType": "AwsApiCall",
    "recipientAccountId": "111122223333"
}
```

# 在 DynamoDB 中管理加密資料表
<a name="encryption.tutorial"></a>

您可以使用 AWS 管理主控台 或 AWS Command Line Interface (AWS CLI) 在新資料表上指定加密金鑰，並更新 Amazon DynamoDB 中現有資料表上的加密金鑰。

**Topics**
+ [指定新資料表的加密金鑰](#encryption.tutorial-creating)
+ [更新加密金鑰](#encryption.tutorial-update)

## 指定新資料表的加密金鑰
<a name="encryption.tutorial-creating"></a>

請依照這些步驟，使用 Amazon DynamoDB 主控台或 AWS CLI在新資料表上指定加密金鑰。

### 建立加密資料表 (主控台)
<a name="encryption.tutorial-console"></a>

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/) 開啟 DynamoDB 主控台。

1.  在主控台左側的導覽窗格中，選擇 **Tables** (資料表)。

1. 選擇 **Create Table** (建立資料表)。針對**資料表名稱**，輸入 **Music**。針對主索引鍵，輸入 **Artist**，對於排序索引鍵，輸入 **SongTitle**，兩者都做為字串。

1. 在 **Settings** (設定) 中，確認選取 **Customize settings** (自訂設定)。
**注意**  
如果選取**使用預設設定**，則會使用 AWS 擁有的金鑰 靜態加密資料表，無需額外費用。

1. 在**靜態加密**下，選擇加密類型 - AWS 擁有的金鑰 AWS 受管金鑰、 或客戶受管金鑰。
   +  **由 Amazon DynamoDB ** AWS 擁有的金鑰，由 DynamoDB 特別擁有和管理。使用此金鑰不會向您收取額外費用。
   + **AWS 受管金鑰**。金鑰別名：`aws/dynamodb`。金鑰會存放在您的帳戶中，並由 AWS Key Management Service (AWS KMS) 管理。需支付 AWS KMS 費用。
   +  **儲存在您的帳戶中，且由您擁有和管理。**客戶自管金鑰。金鑰會存放在您的帳戶中，並由 AWS Key Management Service (AWS KMS) 管理。需支付 AWS KMS 費用。
**注意**  
如果您選擇擁有和管理自己的金鑰，請確保已正確設定 KMS 金鑰政策。如需詳細資訊及範例，請參閱[客戶自管金鑰的金鑰政策](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。

1. 選擇 **Create table** (建立資料表) 以建立加密資料表。若要確認加密類型，選取 **Overview** (概觀) 標籤中的資料表詳細資訊並檢閱 **Additional details** (其他詳細資訊) 區段。

### 建立加密資料表 (AWS CLI)
<a name="encryption.tutorial-cli"></a>

使用 AWS CLI 為 Amazon DynamoDB 建立具有預設 AWS 擁有的金鑰、 AWS 受管金鑰或客戶受管金鑰的資料表。

**使用預設值建立加密的資料表 AWS 擁有的金鑰**
+ 建立加密的 `Music` 資料表，如下所示。

  ```
  aws dynamodb create-table \
    --table-name Music \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --provisioned-throughput \
        ReadCapacityUnits=10,WriteCapacityUnits=5
  ```
**注意**  
此資料表現在使用 AWS 擁有的金鑰 DynamoDB 服務帳戶中的預設值加密。

**使用 AWS 受管金鑰 適用於 DynamoDB 的 建立加密資料表**
+ 建立加密的 `Music` 資料表，如下所示。

  ```
  aws dynamodb create-table \
    --table-name Music \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --provisioned-throughput \
        ReadCapacityUnits=10,WriteCapacityUnits=5 \
    --sse-specification Enabled=true,SSEType=KMS
  ```

   資料表描述的 `SSEDescription` 狀態會設為 `ENABLED`，而 `SSEType` 設為 `KMS`。

  ```
  "SSEDescription": {
    "SSEType": "KMS",
    "Status": "ENABLED",
    "KMSMasterKeyArn": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-abcd-1234-a123-ab1234a1b234",
  }
  ```

**使用 DynamoDB 由客戶自管金鑰建立加密資料表**
+ 建立加密的 `Music` 資料表，如下所示。

  ```
  aws dynamodb create-table \
    --table-name Music \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --provisioned-throughput \
        ReadCapacityUnits=10,WriteCapacityUnits=5 \
    --sse-specification Enabled=true,SSEType=KMS,KMSMasterKeyId=abcd1234-abcd-1234-a123-ab1234a1b234
  ```
**注意**  
對於 `KMSMasterKeyId`，您可以使用金鑰 ID、金鑰 ARN 或金鑰別名。如果您使用金鑰別名 （例如 `alias/my-key`)，DynamoDB 會解析別名，並將基礎 AWS KMS 金鑰與資料表建立關聯。在資料表描述中， `KMSMasterKeyArn`一律會顯示已解析金鑰的金鑰 ARN，而不是別名。如需金鑰識別符的詳細資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的[金鑰識別符 (KeyId)](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id)。

   資料表描述的 `SSEDescription` 狀態會設為 `ENABLED`，而 `SSEType` 設為 `KMS`。

  ```
  "SSEDescription": {
    "SSEType": "KMS",
    "Status": "ENABLED",
    "KMSMasterKeyArn": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-abcd-1234-a123-ab1234a1b234",
  }
  ```

## 更新加密金鑰
<a name="encryption.tutorial-update"></a>

您也可以使用 DynamoDB 主控台或 AWS CLI ，隨時更新 AWS 擁有的金鑰 AWS 受管金鑰和客戶受管金鑰之間現有資料表的加密金鑰。

### 更新加密金鑰 (主控台)
<a name="encryption.tutorial-update-console"></a>

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/) 開啟 DynamoDB 主控台。

1.  在主控台左側的導覽窗格中，選擇 **Tables** (資料表)。

1. 選擇您要更新的資料表。

1. 選取 **Actions** (動作) 下拉式清單，然後選取 **Update settings** (更新設定) 選項。

1. 轉至 **Additional settings** (其他設定) 索引標籤。

1. 在 **Encryption** (加密) 下，選擇 **Manage encryption** (管理加密)。

1. 選擇加密類型：
   +  **由 Amazon DynamoDB 擁有。** AWS KMS 金鑰由 DynamoDB 擁有和管理。使用此金鑰不會向您收取額外費用。
   + **AWS 受管金鑰**金鑰別名：`aws/dynamodb`。金鑰會存放在您的帳戶中，並由 管理 AWS Key Management Service。 (AWS KMS)。需支付 AWS KMS 費用。
   +  **儲存在您的帳戶中，且由您擁有和管理。**金鑰會存放在您的帳戶中，並由 管理 AWS Key Management Service。 (AWS KMS)。需支付 AWS KMS 費用。
**注意**  
如果您選擇擁有和管理自己的金鑰，請確保已正確設定 KMS 金鑰政策。如需詳細資訊，請參閱[客戶自管金鑰的金鑰政策](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。

   然後，選擇 **Save (儲存)** 以更新加密資料表。若要確認加密類型，檢查 **Overview (概觀)** 索引標籤下的資料表詳細資訊。

### 更新加密金鑰 (AWS CLI)
<a name="encryption.tutorial-update-cli"></a>

下列範例顯示如何使用 AWS CLI更新加密資料表。

**使用預設值更新加密的資料表 AWS 擁有的金鑰**
+ 更新加密的 `Music` 資料表，如下列範例所示。

  ```
  aws dynamodb update-table \
    --table-name Music \
    --sse-specification Enabled=false
  ```
**注意**  
此資料表現在使用 AWS 擁有的金鑰 DynamoDB 服務帳戶中的預設值加密。

**使用 AWS 受管金鑰 適用於 DynamoDB 的 更新加密的資料表**
+ 更新加密的 `Music` 資料表，如下列範例所示。

  ```
  aws dynamodb update-table \
    --table-name Music \
    --sse-specification Enabled=true
  ```

   資料表描述的 `SSEDescription` 狀態會設為 `ENABLED`，而 `SSEType` 設為 `KMS`。

  ```
  "SSEDescription": {
    "SSEType": "KMS",
    "Status": "ENABLED",
    "KMSMasterKeyArn": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-abcd-1234-a123-ab1234a1b234",
  }
  ```

**使用 DynamoDB 由客戶自管金鑰更新加密資料表**
+ 更新加密的 `Music` 資料表，如下列範例所示。

  ```
  aws dynamodb update-table \
    --table-name Music \
    --sse-specification Enabled=true,SSEType=KMS,KMSMasterKeyId=abcd1234-abcd-1234-a123-ab1234a1b234
  ```
**注意**  
對於 `KMSMasterKeyId`，您可以使用金鑰 ID、金鑰 ARN 或金鑰別名。如果您使用金鑰別名 （例如 `alias/my-key`)，DynamoDB 會解析別名，並將基礎 AWS KMS 金鑰與資料表建立關聯。在資料表描述中， `KMSMasterKeyArn`一律會顯示已解析金鑰的金鑰 ARN，而不是別名。

   資料表描述的 `SSEDescription` 狀態會設為 `ENABLED`，而 `SSEType` 設為 `KMS`。

  ```
  "SSEDescription": {
    "SSEType": "KMS",
    "Status": "ENABLED",
    "KMSMasterKeyArn": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-abcd-1234-a123-ab1234a1b234",
  }
  ```

# 使用 VPC 端點與 IAM 政策強化 DynamoDB 連線安全性
<a name="inter-network-traffic-privacy"></a>

Amazon DynamoDB 和內部部署應用程式之間，以及 DynamoDB 和相同 AWS 區域內其他 AWS 資源之間的連線都會受到保護。

## 端點所需的政策
<a name="inter-network-traffic-DescribeEndpoints"></a>

Amazon DynamoDB 提供 [DescribeEndpoints](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeEndpoints.html) API，可讓您列舉區域端點資訊。對於公用 DynamoDB 端點的請求，即使 IAM 或 VPC 端點政策中設定了明確或隱含的拒絕條件，API 仍會回應，而不受 DynamoDB IAM 政策影響。這是因為 DynamoDB 會刻意略過 `DescribeEndpoints` API 的授權程序。

對於來自 VPC 端點的請求，IAM 和虛擬私有雲端 (VPC) 端點政策都必須使用 IAM `dynamodb:DescribeEndpoints` 動作針對請求身分和存取管理 (IAM) 主體授權 `DescribeEndpoints` API 呼叫。否則，將拒絕存取 `DescribeEndpoints` API。

以下是端點政策的範例。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "dynamodb:DescribeEndpoints",
            "Resource": "*"
        }
    ]
}
```

------

## 服務和內部部署用戶端與應用程式之間的流量。
<a name="inter-network-traffic-privacy-on-prem"></a>

您的私有網路與 之間有兩個連線選項 AWS：
+  AWS Site-to-Site VPN 連線。如需詳細資訊，請參閱《 AWS Site-to-Site VPN使用者指南**》中的[什麼是AWS Site-to-Site VPN ？](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)。
+  Direct Connect 連線。如需詳細資訊，請參閱《 Direct Connect使用者指南**》中的[什麼是Direct Connect ？](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html)。

透過網路存取 DynamoDB 是透過 AWS 發佈APIs。用戶端必須支援 Transport Layer Security (TLS) 1.2。我們建議使用 TLS 1.3。用戶端還必須支援具備完全正向加密 (PFS) 功能的密碼套件，例如臨時 Diffie-Hellman (DHE) 或橢圓曲線臨時 Diffie-Hellman (ECDHE)。現代系統 (如 Java 7 和更新版本) 大多會支援這些模式。此外，您必須使用存取金鑰 ID，以及與 IAM 主體相關聯的私密存取金鑰來簽署請求，或者您可以使用 [AWS Security Token Service (STS)](https://docs.aws.amazon.com/STS/latest/APIReference/Welcome.html) 來產生臨時安全憑證來簽署請求。

## 相同區域中 AWS 資源之間的流量
<a name="inter-network-traffic-privacy-within-region"></a>

適用於 DynamoDB 的 Amazon Virtual Private Cloud (Amazon VPC) 端點是 VPC 中的邏輯實體，僅允許連線到 DynamoDB。Amazon VPC 會將請求路由至 DynamoDB，並將回應路由回 VPC。如需詳細資訊，請參閱《Amazon VPC 使用者指南》中的 [VPC 端點](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints.html)。如需可從 VPC 端點控制存取權限的政策範例，請參閱[使用 IAM 政策控制對 DynamoDB 的存取](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-ddb.html)。

**注意**  
Amazon VPC 端點無法透過 AWS Site-to-Site VPN 或 存取 Direct Connect。

# AWS Identity and Access Management (IAM) 和 DynamoDB
<a name="identity-and-access-mgmt"></a>

 AWS Identity and Access Management 是一種 AWS 服務，可協助管理員安全地控制對 AWS 資源的存取。管理員可以控制透過驗證 (已登入) 和授權 (具有許可) 來使用 Amazon DynamoDB 和 DynamoDB Accelerator 資源的對象。您可以使用 IAM 來管理存取許可，並為 Amazon DynamoDB 和 DynamoDB Accelerator 實作安全政策。IAM 是一項服務 AWS ，您可以免費使用。

 

**Topics**
+ [Amazon DynamoDB 的 Identity and Access Management](security-iam.md)
+ [使用 IAM 政策條件進行精細定義存取控制](specifying-conditions.md)

# Amazon DynamoDB 的 Identity and Access Management
<a name="security-iam"></a>





AWS Identity and Access Management (IAM) 是一種 AWS 服務 ，可協助管理員安全地控制對 AWS 資源的存取。IAM 管理員可以控制誰能「完成身分驗證」(已登入) 和「獲得授權」(具有許可) 而得以使用 DynamoDB 資源。****IAM 是您可以免費使用 AWS 服務 的 。

**Topics**
+ [目標對象](#security_iam_audience)
+ [使用身分驗證](#security_iam_authentication)
+ [使用政策管理存取權](#security_iam_access-manage)
+ [Amazon DynamoDB 如何搭配 IAM 運作](security_iam_service-with-iam.md)
+ [Amazon DynamoDB 以身分為基礎的政策範例](security_iam_id-based-policy-examples.md)
+ [Amazon DynamoDB 身分識別和存取疑難排解](security_iam_troubleshoot.md)
+ [避免購買 DynamoDB 預留容量的 IAM 政策](iam-policy-prevent-purchase-reserved-capacity.md)

## 目標對象
<a name="security_iam_audience"></a>

使用方式 AWS Identity and Access Management (IAM) 會根據您的角色而有所不同：
+ **服務使用者** — 若無法存取某些功能，請向管理員申請所需許可 (請參閱 [Amazon DynamoDB 身分識別和存取疑難排解](security_iam_troubleshoot.md))
+ **服務管理員** — 負責設定使用者存取權並提交相關許可請求 (請參閱 [Amazon DynamoDB 如何搭配 IAM 運作](security_iam_service-with-iam.md))
+ **IAM 管理員** — 撰寫政策以管理存取控制 (請參閱 [Amazon DynamoDB 以身分為基礎的政策範例](security_iam_id-based-policy-examples.md))

## 使用身分驗證
<a name="security_iam_authentication"></a>

身分驗證是您 AWS 使用身分憑證登入 的方式。您必須以 AWS 帳戶根使用者、IAM 使用者或擔任 IAM 角色進行身分驗證。

您可以使用身分來源的登入資料，例如 AWS IAM Identity Center (IAM Identity Center)、單一登入身分驗證或 Google/Facebook 登入資料，以聯合身分的形式登入。如需有關登入的詳細資訊，請參閱《AWS 登入 使用者指南》**中的[如何登入您的 AWS 帳戶](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html)。

對於程式設計存取， AWS 提供 SDK 和 CLI 以密碼編譯方式簽署請求。如需詳細資訊，請參閱《IAM 使用者指南》**中的 [API 請求的AWS 第 4 版簽署程序](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html)。

### AWS 帳戶 根使用者
<a name="security_iam_authentication-rootuser"></a>

 當您建立 時 AWS 帳戶，您會從一個名為 AWS 帳戶 *theroot 使用者的*登入身分開始，該身分可完整存取所有 AWS 服務 和 資源。強烈建議不要使用根使用者來執行日常任務。有關需要根使用者憑證的任務，請參閱《IAM 使用者指南》**中的[需要根使用者憑證的任務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)。

### 聯合身分
<a name="security_iam_authentication-federated"></a>

最佳實務是要求人類使用者使用聯合身分提供者，以 AWS 服務 使用臨時憑證存取 。

*聯合身分*是來自您的企業目錄、Web 身分提供者的使用者，或使用來自身分來源的 AWS 服務 憑證存取 Directory Service 的使用者。聯合身分會擔任角色，而該角色會提供臨時憑證。

若需集中化管理存取權限，建議使用 AWS IAM Identity Center。如需詳細資訊，請參閱 *AWS IAM Identity Center 使用者指南*中的[什麼是 IAM Identity Center？](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)。

### IAM 使用者和群組
<a name="security_iam_authentication-iamuser"></a>

*IAM 使用者*[https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)是一種身分具備單人或應用程式的特定許可權。建議以臨時憑證取代具備長期憑證的 IAM 使用者。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[要求人類使用者使用聯合身分提供者來 AWS 使用臨時憑證存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp) 。

[IAM 群組](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html)**會指定 IAM 使用者集合，使管理大量使用者的許可權更加輕鬆。如需詳細資訊，請參閱《IAM 使用者指南》**中的 [IAM 使用者的使用案例](https://docs.aws.amazon.com/IAM/latest/UserGuide/gs-identities-iam-users.html)。

### IAM 角色
<a name="security_iam_authentication-iamrole"></a>

*IAM 角色*[https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)的身分具有特定許可權，其可以提供臨時憑證。您可以透過[從使用者切換到 IAM 角色 （主控台） ](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-console.html)或呼叫 AWS CLI 或 AWS API 操作來擔任角色。如需詳細資訊，請參閱《IAM 使用者指南》**中的[擔任角色的方法](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage-assume.html)。

IAM 角色適用於聯合身分使用者存取、臨時 IAM 使用者許可、跨帳戶存取權與跨服務存取，以及在 Amazon EC2 執行的應用程式。如需詳細資訊，請參閱《*IAM 使用者指南*》中的 [IAM 中的快帳戶資源存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

## 使用政策管理存取權
<a name="security_iam_access-manage"></a>

您可以透過建立政策並將其連接到身分或資源 AWS 來控制 AWS 中的存取。政策定義與身分或資源相關聯的許可。當委託人提出請求時 AWS ， 會評估這些政策。大多數政策會以 JSON 文件 AWS 形式存放在 中。如需進一步了解 JSON 政策文件，請參閱《*IAM 使用者指南*》中的 [JSON 政策概觀](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#access_policies-json)。

管理員會使用政策，透過定義哪些**主體**可在哪些**條件**下對哪些**資源**執行**動作**，以指定可存取的範圍。

預設情況下，使用者和角色沒有許可。IAM 管理員會建立 IAM 政策並將其新增至角色，供使用者後續擔任。IAM 政策定義動作的許可，無論採用何種方式執行。

### 身分型政策
<a name="security_iam_access-manage-id-based-policies"></a>

身分型政策是附加至身分 (使用者、使用者群組或角色) 的 JSON 許可政策文件。這類政策控制身分可對哪些資源執行哪些動作，以及適用的條件。如需了解如何建立身分型政策，請參閱《*IAM 使用者指南*》中的[透過客戶管理政策定義自訂 IAM 許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

身分型政策可分為*內嵌政策* (直接內嵌於單一身分) 與*受管政策* (可附加至多個身分的獨立政策)。如需了解如何在受管政策及內嵌政策之間做選擇，請參閱《IAM 使用者指南》**中的[在受管政策與內嵌政策之間選擇](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-choosing-managed-or-inline.html)。

### 資源型政策
<a name="security_iam_access-manage-resource-based-policies"></a>

資源型政策是附加到資源的 JSON 政策文件。範例包括 IAM *角色信任政策*與 Amazon S3 *儲存貯體政策*。在支援資源型政策的服務中，服務管理員可以使用它們來控制對特定資源的存取權限。您必須在資源型政策中[指定主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)。

資源型政策是位於該服務中的內嵌政策。您無法在以資源為基礎的政策中使用來自 IAM 的 AWS 受管政策。

### 其他政策類型
<a name="security_iam_access-manage-other-policies"></a>

AWS 支援其他政策類型，可設定更多常見政策類型授予的最大許可：
+ **許可界限** — 設定身分型政策可授與 IAM 實體的最大許可。如需詳細資訊，請參閱《 IAM 使用者指南》**中的 [IAM 實體許可界限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)。
+ **服務控制政策 (SCP)** — 為 AWS Organizations中的組織或組織單位指定最大許可。如需詳細資訊，請參閱《AWS Organizations 使用者指南》**中的[服務控制政策](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)。
+ **資源控制政策 (RCP)** — 設定您帳戶中資源可用許可的上限。如需詳細資訊，請參閱《AWS Organizations 使用者指南》**中的[資源控制政策 (RCP)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html)。
+ **工作階段政策** — 在以程式設計方式為角色或聯合身分使用者建立臨時工作階段時，以參數形式傳遞的進階政策。如需詳細資訊，請參《*IAM 使用者指南*》中的[工作階段政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session)。

### 多種政策類型
<a name="security_iam_access-manage-multiple-policies"></a>

當多種類型的政策適用於請求時，產生的許可會更複雜而無法理解。若要了解如何 AWS 在涉及多個政策類型時決定是否允許請求，請參閱《*IAM 使用者指南*》中的[政策評估邏輯](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)。

# Amazon DynamoDB 如何搭配 IAM 運作
<a name="security_iam_service-with-iam"></a>

在您使用 IAM 管理 DynamoDB 的存取權之前，請了解搭配 DynamoDB 使用的 IAM 功能有哪些。






| IAM 功能 | DynamoDB 支援 | 
| --- | --- | 
|  [身分型政策](#security_iam_service-with-iam-id-based-policies)  |   是  | 
|  [資源型政策](#security_iam_service-with-iam-resource-based-policies)  |   是  | 
|  [政策動作](#security_iam_service-with-iam-id-based-policies-actions)  |   是  | 
|  [政策資源](#security_iam_service-with-iam-id-based-policies-resources)  |   是  | 
|  [政策條件索引鍵](#security_iam_service-with-iam-id-based-policies-conditionkeys)  |   是  | 
|  [ACL](#security_iam_service-with-iam-acls)  |   否   | 
|  [ABAC (政策中的標籤)](#security_iam_service-with-iam-tags)  |   是  | 
|  [臨時憑證](#security_iam_service-with-iam-roles-tempcreds)  |   是  | 
|  [主體許可](#security_iam_service-with-iam-principal-permissions)  |   是  | 
|  [服務角色](#security_iam_service-with-iam-roles-service)  |   是  | 
|  [服務連結角色](#security_iam_service-with-iam-roles-service-linked)  |   是  | 

若要全面了解 DynamoDB 和其他 AWS 服務如何與大多數 IAM 功能搭配使用，請參閱《[AWS IAM 使用者指南》中的與 IAM 搭配使用的 服務](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)。 **

## 適用於 DynamoDB 的以身分為基礎的政策
<a name="security_iam_service-with-iam-id-based-policies"></a>

**支援身分型政策：**是

身分型政策是可以附加到身分 (例如 IAM 使用者、使用者群組或角色) 的 JSON 許可政策文件。這些政策可控制身分在何種條件下能對哪些資源執行哪些動作。如需了解如何建立身分型政策，請參閱《*IAM 使用者指南*》中的[透過客戶管理政策定義自訂 IAM 許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

使用 IAM 身分型政策，您可以指定允許或拒絕的動作和資源，以及在何種條件下允許或拒絕動作。如要了解您在 JSON 政策中使用的所有元素，請參閱《*IAM 使用者指南*》中的 [IAM JSON 政策元素參考](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html)。

### DynamoDB 以身分為基礎的政策範例
<a name="security_iam_service-with-iam-id-based-policies-examples"></a>



若要檢視 DynamoDB 以身分為基礎的政策範例，請參閱 [Amazon DynamoDB 以身分為基礎的政策範例](security_iam_id-based-policy-examples.md)。

## DynamoDB 內以資源為基礎的政策
<a name="security_iam_service-with-iam-resource-based-policies"></a>

**支援資源型政策：**是

資源型政策是附加到資源的 JSON 政策文件。資源型政策的最常見範例是 IAM *角色信任政策*和 Amazon S3 *儲存貯體政策*。在支援資源型政策的服務中，服務管理員可以使用它們來控制對特定資源的存取權限。對於附加政策的資源，政策會定義指定的主體可以對該資源執行的動作以及在何種條件下執行的動作。您必須在資源型政策中[指定主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)。委託人可以包含帳戶、使用者、角色、聯合身分使用者或 AWS 服務。

如需啟用跨帳戶存取權，您可以在其他帳戶內指定所有帳戶或 IAM 實體作為資源型政策的主體。如需詳細資訊，請參閱《*IAM 使用者指南*》中的 [IAM 中的快帳戶資源存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

## DynamoDB 的政策動作
<a name="security_iam_service-with-iam-id-based-policies-actions"></a>

**支援政策動作：**是

管理員可以使用 AWS JSON 政策來指定誰可以存取內容。也就是說，哪個**主體**在什麼**條件**下可以對什麼**資源**執行哪些**動作**。

JSON 政策的 `Action` 元素描述您可以用來允許或拒絕政策中存取的動作。政策會使用動作來授予執行相關聯動作的許可。



若要查看 DynamoDB 動作的清單，請參閱《*服務授權參考*》中的 [Amazon DynamoDB 定義的動作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-actions-as-permissions)。

DynamoDB 中的政策動作會在動作之前使用以下字首：

```
aws
```

若要在單一陳述式中指定多個動作，請用逗號分隔。

```
"Action": [
      "aws:action1",
      "aws:action2"
         ]
```





若要檢視 DynamoDB 以身分為基礎的政策範例，請參閱 [Amazon DynamoDB 以身分為基礎的政策範例](security_iam_id-based-policy-examples.md)。

## DynamoDB 的政策資源
<a name="security_iam_service-with-iam-id-based-policies-resources"></a>

**支援政策資源：**是

管理員可以使用 AWS JSON 政策來指定誰可以存取內容。也就是說，哪個**主體**在什麼**條件**下可以對什麼**資源**執行哪些**動作**。

`Resource` JSON 政策元素可指定要套用動作的物件。最佳實務是使用其 [Amazon Resource Name (ARN)](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html) 來指定資源。若動作不支援資源層級許可，使用萬用字元 (\$1) 表示該陳述式適用於所有資源。

```
"Resource": "*"
```

若要查看 DynamoDB 資源類型清單及其 ARN，請參閱《*服務授權參考*》中的 [Amazon DynamoDB 定義的資源](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-resources-for-iam-policies)。若要了解您可以使用哪些動作指定每個資源的 ARN，請參閱 [Amazon DynamoDB 定義的動作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-actions-as-permissions)。





若要檢視 DynamoDB 以身分為基礎的政策範例，請參閱 [Amazon DynamoDB 以身分為基礎的政策範例](security_iam_id-based-policy-examples.md)。

## DynamoDB 的政策條件索引鍵
<a name="security_iam_service-with-iam-id-based-policies-conditionkeys"></a>

**支援服務特定政策條件金鑰：**是

管理員可以使用 AWS JSON 政策來指定誰可以存取內容。也就是說，哪個**主體**在什麼**條件**下可以對什麼**資源**執行哪些**動作**。

`Condition` 元素會根據定義的條件，指定陳述式的執行時機。您可以建立使用[條件運算子](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html)的條件運算式 (例如等於或小於)，來比對政策中的條件和請求中的值。若要查看所有 AWS 全域條件索引鍵，請參閱《*IAM 使用者指南*》中的[AWS 全域條件內容索引鍵](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)。

如要查看 DynamoDB 條件索引鍵的清單，請參閱《*服務授權參考*》中的 [Amazon DynamoDB 的條件索引鍵](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-policy-keys)。若要了解您可以搭配哪些動作和資源使用條件索引鍵，請參閱 [Amazon DynamoDB 定義的動作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-actions-as-permissions)。

若要檢視 DynamoDB 以身分為基礎的政策範例，請參閱 [Amazon DynamoDB 以身分為基礎的政策範例](security_iam_id-based-policy-examples.md)。

## DynamoDB 中的存取控制清單 (ACL)
<a name="security_iam_service-with-iam-acls"></a>

**支援 ACL：**否 

存取控制清單 (ACL) 可控制哪些主體 (帳戶成員、使用者或角色) 擁有存取某資源的許可。ACL 類似於資源型政策，但它們不使用 JSON 政策文件格式。

## 搭配 DynamoDB 的屬性型存取控制 (ABAC)
<a name="security_iam_service-with-iam-tags"></a>

**支援 ABAC (政策中的標籤)：**是

屬性型存取控制 (ABAC) 是一種授權策略，依據稱為標籤的屬性來定義許可。您可以將標籤連接至 IAM 實體 AWS 和資源，然後設計 ABAC 政策，以便在主體的標籤符合資源上的標籤時允許操作。

如需根據標籤控制存取，請使用 `aws:ResourceTag/key-name`、`aws:RequestTag/key-name` 或 `aws:TagKeys` 條件索引鍵，在政策的[條件元素](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)中，提供標籤資訊。

如果服務支援每個資源類型的全部三個條件金鑰，則對該服務而言，值為 **Yes**。如果服務僅支援某些資源類型的全部三個條件金鑰，則值為 **Partial**。

如需 ABAC 的詳細資訊，請參閱《*IAM 使用者指南*》中的[使用 ABAC 授權定義許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)。如要查看含有設定 ABAC 步驟的教學課程，請參閱《*IAM 使用者指南*》中的[使用屬性型存取控制 (ABAC)](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html)。

## 將臨時憑證與 DynamoDB 搭配使用
<a name="security_iam_service-with-iam-roles-tempcreds"></a>

**支援臨時憑證：**是

臨時登入資料提供 AWS 資源的短期存取權，當您使用聯合或切換角色時，會自動建立。 AWS 建議您動態產生臨時登入資料，而不是使用長期存取金鑰。如需詳細資訊，請參閱《*IAM 使用者指南*》中的 [IAM 中的臨時安全憑證](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html)與[可與 IAM 搭配運作的AWS 服務](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)。

## DynamoDB 的跨服務主體許可
<a name="security_iam_service-with-iam-principal-permissions"></a>

**支援轉寄存取工作階段 (FAS)：**是

 轉送存取工作階段 (FAS) 使用呼叫 的委託人許可 AWS 服務，並結合 AWS 服務 請求向下游服務提出請求。如需提出 FAS 請求時的政策詳細資訊，請參閱[轉發存取工作階段](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_forward_access_sessions.html)。

## DynamoDB 的服務角色
<a name="security_iam_service-with-iam-roles-service"></a>

**支援服務角色：**是

 服務角色是服務擔任的 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)，可代您執行動作。IAM 管理員可以從 IAM 內建立、修改和刪除服務角色。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[建立角色以委派許可權給 AWS 服務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

**警告**  
變更服務角色的許可有可能會讓 DynamoDB 功能出現故障。只有 DynamoDB 提供指引時，才能編輯服務角色。

## DynamoDB 的服務連結角色
<a name="security_iam_service-with-iam-roles-service-linked"></a>

**支援服務連結角色：**是

 服務連結角色是連結至 的一種服務角色 AWS 服務。服務可以擔任代表您執行動作的角色。服務連結角色會出現在您的 中 AWS 帳戶 ，並由服務擁有。IAM 管理員可以檢視，但不能編輯服務連結角色的許可。

如需建立或管理服務連結角色的詳細資訊，請參閱[可搭配 IAM 運作的AWS 服務](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)。在資料表中尋找服務，其中包含**服務連結角色**欄中的 `Yes`。選擇**是**連結，以檢視該服務的服務連結角色文件。

### DynamoDB 支援的服務連結角色
<a name="security_iam_service-with-iam-roles-service-linked-supported-by-dynamodb"></a>

DynamoDB 支援下列服務連結角色。
+ DynamoDB 使用服務連結角色 **AWSServiceRoleForDynamoDBReplication** 來執行跨 AWS 區域的全域資料表複寫。如需 **AWSServiceRoleForDynamoDBReplication** 服務連結角色的詳細資訊，請參閱 [DynamoDB 全域資料表安全性](globaltables-security.md)。
+ DynamoDB Accelerator (DAX) 使用服務連結角色 **AWSServiceRoleForDAX** 來設定與維護 DAX 叢集。如需 **AWSServiceRoleForDAX** 服務連結角色的詳細資訊，請參閱 [使用 DAX 的服務連結 IAM 角色](using-service-linked-roles.md)。

除了這些 DynamoDB 服務連結角色外，DynamoDB 也會使用 Application Auto Scaling 服務自動管理佈建容量模式資料表的輸送量設定。Application Auto Scaling 服務會使用服務連結角色 **AWSServiceRoleForApplicationAutoScaling\$1DynamoDBTable**，以管理已啟用自動調整的 DynamoDB 資料表之輸送量設定。如需更多詳細資訊，請參閱 [Application Auto Scaling 的服務連結角色](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-service-linked-roles.html)。

# Amazon DynamoDB 以身分為基礎的政策範例
<a name="security_iam_id-based-policy-examples"></a>

根據預設，使用者和角色不具備建立或修改 DynamoDB 資源的許可。若要授予使用者對其所需資源執行動作的許可，IAM 管理員可以建立 IAM 政策。

如需了解如何使用這些範例 JSON 政策文件建立 IAM 身分型政策，請參閱《*IAM 使用者指南*》中的[建立 IAM 政策 (主控台)](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)。

如需 DynamoDB 所定義之動作和資源類型的詳細資訊，包括每種資源類型的 ARN 格式，請參閱《*服務授權參考*》中 [Amazon DynamoDB 適用的動作、資源和條件索引鍵](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html)。

**Topics**
+ [政策最佳實務](#security_iam_service-with-iam-policy-best-practices)
+ [使用 DynamoDB 主控台](#security_iam_id-based-policy-examples-console)
+ [允許使用者檢視他們自己的許可](#security_iam_id-based-policy-examples-view-own-permissions)
+ [搭配 Amazon DynamoDB 使用身分型政策](using-identity-based-policies.md)

## 政策最佳實務
<a name="security_iam_service-with-iam-policy-best-practices"></a>

以身分為基礎的政策會判斷您帳戶中的某個人員是否可以建立、存取或刪除 DynamoDB 資源。這些動作可能會讓您的 AWS 帳戶產生費用。當您建立或編輯身分型政策時，請遵循下列準則及建議事項：
+ **開始使用 AWS 受管政策並邁向最低權限許可** – 若要開始將許可授予您的使用者和工作負載，請使用將許可授予許多常見使用案例的 *AWS 受管政策*。它們可在您的 中使用 AWS 帳戶。我們建議您定義特定於使用案例 AWS 的客戶受管政策，以進一步減少許可。如需更多資訊，請參閱《*IAM 使用者指南*》中的 [AWS 受管政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)或[任務職能的AWS 受管政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html)。
+ **套用最低權限許可** – 設定 IAM 政策的許可時，請僅授予執行任務所需的許可。為實現此目的，您可以定義在特定條件下可以對特定資源採取的動作，這也稱為*最低權限許可*。如需使用 IAM 套用許可的更多相關資訊，請參閱《*IAM 使用者指南*》中的 [IAM 中的政策和許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)。
+ **使用 IAM 政策中的條件進一步限制存取權** – 您可以將條件新增至政策，以限制動作和資源的存取。例如，您可以撰寫政策條件，指定必須使用 SSL 傳送所有請求。如果透過特定 等使用服務動作 AWS 服務，您也可以使用條件來授予其存取權 CloudFormation。如需詳細資訊，請參閱《*IAM 使用者指南*》中的 [IAM JSON 政策元素：條件](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)。
+ **使用 IAM Access Analyzer 驗證 IAM 政策，確保許可安全且可正常運作** – IAM Access Analyzer 驗證新政策和現有政策，確保這些政策遵從 IAM 政策語言 (JSON) 和 IAM 最佳實務。IAM Access Analyzer 提供 100 多項政策檢查及切實可行的建議，可協助您撰寫安全且實用的政策。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[使用 IAM Access Analyzer 驗證政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html)。
+ **需要多重要素驗證 (MFA)** – 如果您的案例需要 IAM 使用者或 中的根使用者 AWS 帳戶，請開啟 MFA 以提高安全性。如需在呼叫 API 操作時請求 MFA，請將 MFA 條件新增至您的政策。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[透過 MFA 的安全 API 存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html)。

如需 IAM 中最佳實務的相關資訊，請參閱《*IAM 使用者指南*》中的 [IAM 安全最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

## 使用 DynamoDB 主控台
<a name="security_iam_id-based-policy-examples-console"></a>

若要存取 Amazon DynamoDB 主控台，您必須擁有最基本的一組許可。這些許可必須允許您列出和檢視 中 DynamoDB 資源的詳細資訊 AWS 帳戶。如果您建立比最基本必要許可更嚴格的身分型政策，則對於具有該政策的實體 (使用者或角色) 而言，主控台就無法如預期運作。

對於僅呼叫 AWS CLI 或 AWS API 的使用者，您不需要允許最低主控台許可。反之，只需允許存取符合他們嘗試執行之 API 操作的動作就可以了。

為了確保使用者和角色仍然可以使用 DynamoDB 主控台，請將 DynamoDB `ConsoleAccess`或 `ReadOnly` AWS 受管政策連接到實體。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[新增許可到使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console)。

## 允許使用者檢視他們自己的許可
<a name="security_iam_id-based-policy-examples-view-own-permissions"></a>

此範例會示範如何建立政策，允許 IAM 使用者檢視附加到他們使用者身分的內嵌及受管政策。此政策包含在主控台或使用 或 AWS CLI AWS API 以程式設計方式完成此動作的許可。

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ViewOwnUserInfo",
            "Effect": "Allow",
            "Action": [
                "iam:GetUserPolicy",
                "iam:ListGroupsForUser",
                "iam:ListAttachedUserPolicies",
                "iam:ListUserPolicies",
                "iam:GetUser"
            ],
            "Resource": ["arn:aws:iam::*:user/${aws:username}"]
        },
        {
            "Sid": "NavigateInConsole",
            "Effect": "Allow",
            "Action": [
                "iam:GetGroupPolicy",
                "iam:GetPolicyVersion",
                "iam:GetPolicy",
                "iam:ListAttachedGroupPolicies",
                "iam:ListGroupPolicies",
                "iam:ListPolicyVersions",
                "iam:ListPolicies",
                "iam:ListUsers"
            ],
            "Resource": "*"
        }
    ]
}
```

# 搭配 Amazon DynamoDB 使用身分型政策
<a name="using-identity-based-policies"></a>

本主題涵蓋搭配 Amazon DynamoDB 使用身分型 AWS Identity and Access Management (IAM) 政策，並提供範例。這些範例會示範帳戶管理員如何將許可政策連接至 IAM 身分 (使用者、群組和角色)，並藉此授與許可，以取得在 Amazon DynamoDB 資源上執行操作的許可。

本主題中的各節涵蓋下列內容：
+ [使用 Amazon DynamoDB 主控台所需的 IAM 許可](#console-permissions)
+ [AWS Amazon DynamoDB 的受管 （預先定義） IAM 政策](#access-policy-examples-aws-managed)
+ [客戶管理政策範例](#access-policy-examples-for-sdk-cli)



以下是許可政策的範例。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DescribeQueryScanBooksTable",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeTable",
                "dynamodb:Query",
                "dynamodb:Scan"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:111122223333:table/Books"
        }
    ]
}
```

------

 上述政策有一個陳述式，可授予 `us-west-2` AWS 區域中資料表上三個 DynamoDB 動作 (`dynamodb:DescribeTable`、 `dynamodb:Query`和 `dynamodb:Scan`) 的許可，該動作由 指定的 AWS 帳戶所擁有`account-id`。`Resource` 值中的 *Amazon Resource Name (ARN)* 會指定許可適用的資料表。

## 使用 Amazon DynamoDB 主控台所需的 IAM 許可
<a name="console-permissions"></a>

若要使用 DynamoDB 主控台，使用者必須擁有一組最低許可，允許使用者使用其 AWS 帳戶的 DynamoDB 資源。除了這些 DynamoDB 許可之外，主控台還需要以下許可：
+ 顯示指標和圖形的 Amazon CloudWatch 許可。
+ AWS Data Pipeline 匯出和匯入 DynamoDB 資料的許可。
+  AWS Identity and Access Management 存取匯出和匯入所需角色的許可。
+ 只要觸發 CloudWatch 警示就通知您的 Amazon Simple Notification Service 許可。
+ AWS Lambda 處理 DynamoDB Streams 記錄的許可。

如果您建立比最基本必要許可更嚴格的 IAM 政策，則對於採取該 IAM 政策的使用者而言，主控台就無法如預期運作。為了確保這些使用者仍然可以使用 DynamoDB 主控台，也請將 `AmazonDynamoDBReadOnlyAccess` AWS 受管政策連接至使用者，如中所述[AWS Amazon DynamoDB 的受管 （預先定義） IAM 政策](#access-policy-examples-aws-managed)。

對於僅呼叫 AWS CLI 或 Amazon DynamoDB API 的使用者，您不需要允許最低主控台許可。

**注意**  
 若您參考 VPC 端點，您也需使用 IAM 動作 (dynamodb:DescribeEndpoints)，對請求的 IAM 主體授權 DescribeEndpoints API 呼叫。如需更多資訊，請參閱[端點所需的政策](inter-network-traffic-privacy.md#inter-network-traffic-DescribeEndpoints)。

## AWS Amazon DynamoDB 的受管 （預先定義） IAM 政策
<a name="access-policy-examples-aws-managed"></a>

AWS 提供由 建立和管理的獨立 IAM 政策，以解決一些常見的使用案例 AWS。這些 AWS 受管政策會授予常見使用案例的必要許可，讓您不必調查需要哪些許可。如需詳細資訊，請參閱《*IAM 使用者指南*》中的 [AWS 受管政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)。

下列 AWS 受管政策可連接至您帳戶中的使用者，其專屬於 DynamoDB，並依使用案例案例分組：
+ **AmazonDynamoDBReadOnlyAccess** – 透過 授予 DynamoDB 資源的唯讀存取權 AWS 管理主控台。
+ **AmazonDynamoDBFullAccess** – 透過 授予 DynamoDB 資源的完整存取權 AWS 管理主控台。

您可以登入 IAM 主控台並在其中搜尋特定政策，以檢閱這些 AWS 受管許可政策。

**重要**  
最佳實務是建立自訂 IAM 政策，授予[最低權限](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)給需要的使用者、角色或群組。

## 客戶管理政策範例
<a name="access-policy-examples-for-sdk-cli"></a>

在本節中，您可以找到授予各種 DynamoDB 動作許可之政策範例。當您使用 AWS SDKs或 時，這些政策即可運作 AWS CLI。在您使用主控台時，需要授予特定的其他許可給主控台。如需詳細資訊，請參閱[使用 Amazon DynamoDB 主控台所需的 IAM 許可](#console-permissions)。

**注意**  
下列所有政策範例都使用其中一個 AWS 區域，並包含虛構的帳戶 IDs 和資料表名稱。

範例：
+ [將許可授與資料表上所有 DynamoDB 動作的 IAM 政策](grant-permissions-to-any-action-on-table.md)
+ [用來授予 DynamoDB 資料表項目唯讀許可的 IAM 政策](read-only-permissions-on-table-items.md)
+ [授予特定 DynamoDB 資料表及其索引存取權限的 IAM 政策](iam-policy-specific-table-indexes.md)
+ [讀取、寫入、更新和刪除 DynamoDB 資料表存取權限的 IAM 政策](iam-policy-example-data-crud.md)
+ [在相同 AWS 帳戶中分隔 DynamoDB 環境的 IAM 政策](iam-policy-separate-environments.md)
+ [避免購買 DynamoDB 預留容量的 IAM 政策](iam-prevent-purchase-reserved-capacity.md)
+ [僅授予 DynamoDB 串流讀取存取權限的 IAM 政策 (不適用於資料表)](iam-policy-read-stream-only.md)
+ [允許 AWS Lambda 函數存取 DynamoDB 串流記錄的 IAM 政策](iam-policy-example-lamda-process-dynamodb-streams.md)
+ [允許對 DynamoDB Accelerator (DAX) 叢集進行讀取和寫入的 IAM 政策](iam-policy-example-read-write-dax-access.md)

 《IAM 使用者指南》包含[三個其他 DynamoDB 範例](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_examples.html)：
+ [Amazon DynamoDB：允許存取特定資料表](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_dynamodb_specific-table.html)
+ [Amazon DynamoDB：允許存取特定資料欄](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_dynamodb_columns.html)
+ [Amazon DynamoDB：允許根據 Amazon Cognito ID 對 DynamoDB 進行資料列層級存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_dynamodb_rows.html)

# 將許可授與資料表上所有 DynamoDB 動作的 IAM 政策
<a name="grant-permissions-to-any-action-on-table"></a>

下列政策會對資料表上名為 `Books` 的*所有* DynamoDB 動作授予許可。中指定的資源 ARN `Resource`可識別特定 AWS 區域中的資料表。如果以萬用字元 (\$1) 代替 `Resource` ARN 中的資料表名稱 `Books`，則允許對帳戶中的*所有*資料表執行*所有* DynamoDB 動作。在此或任何 IAM 政策上使用萬用字元之前，請仔細考慮可能發生的安全性影響。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllAPIActionsOnBooks",
            "Effect": "Allow",
            "Action": "dynamodb:*",
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
        }
    ]
}
```

------

**注意**  
這是使用萬用字元 (\$1) 允許*所有*動作的範例，包括管理、資料操作、監控和購買 DynamoDB 預留容量。反之，最佳實務是明確指定要授予的每個動作，以及只指定該使用者、角色或群組所需的動作。

# 用來授予 DynamoDB 資料表項目唯讀許可的 IAM 政策
<a name="read-only-permissions-on-table-items"></a>

下列許可政策只會授予 `GetItem`、`BatchGetItem`、`Scan`、`Query` 和 `ConditionCheckItem` DynamoDB 動作的許可，進而在 `Books` 資料表上設定唯讀存取權。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ReadOnlyAPIActionsOnBooks",
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetItem",
                "dynamodb:BatchGetItem",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:ConditionCheckItem"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
        }
    ]
}
```

------

# 授予特定 DynamoDB 資料表及其索引存取權限的 IAM 政策
<a name="iam-policy-specific-table-indexes"></a>

下列政策會針對名為 `Books` 的 DynamoDB 資料表上的資料修改動作和該表所有的索引授予許可。如需索引運作方式的詳細資訊，請參閱 [在 DynamoDB 中使用次要索引來改善資料存取](SecondaryIndexes.md)。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AccessTableAllIndexesOnBooks",
            "Effect": "Allow",
            "Action": [
              "dynamodb:PutItem",
              "dynamodb:UpdateItem",
              "dynamodb:DeleteItem",
              "dynamodb:BatchWriteItem",
              "dynamodb:GetItem",
              "dynamodb:BatchGetItem",
              "dynamodb:Scan",
              "dynamodb:Query",
              "dynamodb:ConditionCheckItem"
            ],
            "Resource": [
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books",
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books/index/*"
            ]
        }
    ]
}
```

------

# 讀取、寫入、更新和刪除 DynamoDB 資料表存取權限的 IAM 政策
<a name="iam-policy-example-data-crud"></a>

如果您需要允許應用程式建立、讀取、更新和刪除 Amazon DynamoDB 資料表、索引和串流中的資料，請使用此政策。視需要替換 AWS 區域名稱、您的帳戶 ID，以及資料表名稱或萬用字元 (\$1)。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DynamoDBIndexAndStreamAccess",
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetShardIterator",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:DescribeStream",
                "dynamodb:GetRecords",
                "dynamodb:ListStreams"
            ],
            "Resource": [
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books/index/*",
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books/stream/*"
            ]
        },
        {
            "Sid": "DynamoDBTableAccess",
            "Effect": "Allow",
            "Action": [
                "dynamodb:BatchGetItem",
                "dynamodb:BatchWriteItem",
                "dynamodb:ConditionCheckItem",
                "dynamodb:PutItem",
                "dynamodb:DescribeTable",
                "dynamodb:DeleteItem",
                "dynamodb:GetItem",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:UpdateItem"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
        },
        {
            "Sid": "DynamoDBDescribeLimitsAccess",
            "Effect": "Allow",
            "Action": "dynamodb:DescribeLimits",
            "Resource": [
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books",
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books/index/*"
            ]
        }
    ]
}
```

------

若要展開此政策以涵蓋此帳戶所有 AWS 區域中的所有 DynamoDB 資料表，請針對區域和資料表名稱使用萬用字元 (\$1)。例如：

```
"Resource":[
                "arn:aws:dynamodb:*:123456789012:table/*",
                "arn:aws:dynamodb:*:123456789012:table/*/index/*"
                ]
```

# 在相同 AWS 帳戶中分隔 DynamoDB 環境的 IAM 政策
<a name="iam-policy-separate-environments"></a>

假設您有不同的環境，且每個環境都會維護各自版本的資料表 (名為 `ProductCatalog`)。如果您在同一個 AWS 帳戶中建立兩個`ProductCatalog`資料表，由於許可的設定方式，在一個環境中工作可能會影響另一個環境。例如，在 AWS 帳戶層級設定並行控制平面操作數量的配額 （例如 `CreateTable`)。

因此，一個環境中的每個動作都會減少另一個環境中可用的操作數目。還有一種風險是，一個環境中的程式碼可能會在另一個環境中意外存取資料表。

**注意**  
若想區隔生產和測試工作負載來協助控制事件的潛在「爆炸範圍」，最佳實務是為測試和生產工作負載建立不同的 AWS 帳戶。如需詳細資訊，請參閱 [AWS 帳戶管理與區隔](https://docs.aws.amazon.com//wellarchitected/latest/security-pillar/aws-account-management-and-separation.html)。

進一步假設您有兩位開發人員 (Amit 和 Alice) 正在測試 `ProductCatalog` 資料表。您的開發人員可以共用相同的測試 AWS 帳戶，而不是每個需要個別 AWS 帳戶的開發人員。在此測試帳戶中，您可以建立相同資料表的複本以供每位開發人員處理 (例如 `Alice_ProductCatalog` 和 `Amit_ProductCatalog`)。在這種情況下，您可以在為測試環境建立的 AWS 帳戶中建立使用者 Alice 和 Amit。您接著可以將許可授予這些使用者，以對他們擁有的資料表執行 DynamoDB 動作。

若要授予這些 IAM 使用者許可，您可以執行下列其中一項：
+ 為每位使用者建立不同的政策，然後分別將每個政策連接至其使用者。例如，您可以將下列政策連接至使用者 Alice，允許她存取 `Alice_ProductCatalog` 資料表上的所有 DynamoDB 動作：

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "AllAPIActionsOnAliceTable",
              "Effect": "Allow",
              "Action": [
                "dynamodb:DeleteItem",
                "dynamodb:DescribeContributorInsights",
                "dynamodb:RestoreTableToPointInTime",
                "dynamodb:ListTagsOfResource",
                "dynamodb:CreateTableReplica",
                "dynamodb:UpdateContributorInsights",
                "dynamodb:CreateBackup",
                "dynamodb:DeleteTable",
                "dynamodb:UpdateTableReplicaAutoScaling",
                "dynamodb:UpdateContinuousBackups",
                "dynamodb:TagResource",
                "dynamodb:DescribeTable",
                "dynamodb:GetItem",
                "dynamodb:DescribeContinuousBackups",
                "dynamodb:BatchGetItem",
                "dynamodb:UpdateTimeToLive",
                "dynamodb:BatchWriteItem",
                "dynamodb:ConditionCheckItem",
                "dynamodb:UntagResource",
                "dynamodb:PutItem",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:UpdateItem",
                "dynamodb:DeleteTableReplica",
                "dynamodb:DescribeTimeToLive",
                "dynamodb:RestoreTableFromBackup",
                "dynamodb:UpdateTable",
                "dynamodb:DescribeTableReplicaAutoScaling",
                "dynamodb:GetShardIterator",
                "dynamodb:DescribeStream",
                "dynamodb:GetRecords",
                "dynamodb:DescribeLimits",
                "dynamodb:ListStreams"
              ],
              "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Alice_ProductCatalog/*"
          }
      ]
  }
  ```

------

  然後，您可以為使用者 Amit 建立具有不同資源 (`Amit_ProductCatalog` 資料表) 的類似政策。
+ 您可以使用 IAM 政策變數來撰寫單一政策，並將它連接至群組，而不是將政策連接至個別使用者。您需要建立群組，而在此範例中，會將使用者 Alice 和 Amit 新增至群組。下列範例授予對 `${aws:username}_ProductCatalog` 資料表執行所有 DynamoDB 動作的許可。評估政策時，政策變數 `${aws:username}` 會取代為申請者的使用者名稱。例如，如果 Alice 傳送新增項目的請求，則只有在 Alice 將項目新增至 `Alice_ProductCatalog` 資料表時，才允許此動作。

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "ActionsOnUserSpecificTable",
              "Effect": "Allow",
              "Action": [
                "dynamodb:PutItem",
                "dynamodb:UpdateItem",
                "dynamodb:DeleteItem",
                "dynamodb:BatchWriteItem",
                "dynamodb:GetItem",
                "dynamodb:BatchGetItem",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:ConditionCheckItem"
              ],
              "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/${aws:username}_ProductCatalog"
          },
          {
              "Sid": "AdditionalPrivileges",
              "Effect": "Allow",
              "Action": [
                  "dynamodb:ListTables",
                  "dynamodb:DescribeTable",
                  "dynamodb:DescribeContributorInsights"
              ],
              "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/*"
          }
      ]
  }
  ```

------

**注意**  
使用 IAM 政策變數時，您必須在政策中明確地指定 `2012-10-17` 版本的 IAM 政策語言。IAM 政策語言 (`2008-10-17`) 的預設版本不支援政策變數。

您可以對資料表使用萬用字元 (\$1) 授予許可 (而不是如同一般作法將特定資料表識別為資源)，在這些資料表中，資料表名稱的前面會加上提出請求的使用者，如下範例所示。

```
"Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/${aws:username}_*"
```

# 避免購買 DynamoDB 預留容量的 IAM 政策
<a name="iam-prevent-purchase-reserved-capacity"></a>

使用 Amazon DynamoDB 預留容量，您會支付一次性預付費用，並承諾在一段時間支付最低消費額，以大幅降低成本。您可以使用 AWS 管理主控台 檢視和購買預留容量。不過，您可能不希望組織中的所有使用者都可以購買預留容量。如需預留容量的詳細資訊，請參閱 [Amazon DynamoDB 定價](https://aws.amazon.com/dynamodb/pricing)。

DynamoDB 提供下列 API 操作，以控制對預留容量管理的存取：
+ `dynamodb:DescribeReservedCapacity`：傳回目前生效的預留容量購買。
+ `dynamodb:DescribeReservedCapacityOfferings`：傳回 AWS目前所提供之預留容量方案的詳細資訊。
+ `dynamodb:PurchaseReservedCapacityOfferings`：執行實際購買的預留容量。

 AWS 管理主控台 使用這些 API 動作來顯示預留容量資訊並進行購買。您無法從應用程式呼叫這些操作，因為只有從主控台才能加以存取。不過，您可以在 IAM 許可政策中允許或拒絕存取這些操作。

下列政策允許使用者使用 檢視預留容量購買和優惠 AWS 管理主控台 ，但拒絕新購買。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowReservedCapacityDescriptions",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeReservedCapacity",
                "dynamodb:DescribeReservedCapacityOfferings"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:*"
        },
        {
            "Sid": "DenyReservedCapacityPurchases",
            "Effect": "Deny",
            "Action": "dynamodb:PurchaseReservedCapacityOfferings",
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:*"
        }
    ]
}
```

------

請注意，此政策使用萬用字元 (\$1) 來允許所有、和描述許可，以拒絕為所有人購買 DynamoDB 預留容量。

# 僅授予 DynamoDB 串流讀取存取權限的 IAM 政策 (不適用於資料表)
<a name="iam-policy-read-stream-only"></a>

當您為資料表啟用 DynamoDB Streams 時，會擷取資料表中每個資料項目的修改資訊。如需詳細資訊，請參閱 [DynamoDB Streams 的變更資料擷取](Streams.md)。

在部分情況下，建議您防止應用程式讀取 DynamoDB 資料表中的資料，但同時仍然允許存取該資料表的串流。例如，您可以 AWS Lambda 設定 在偵測到項目更新時輪詢串流和叫用 Lambda 函數，然後執行其他處理。

下列動作可用來控制對 DynamoDB Streams 的存取：
+ `dynamodb:DescribeStream`
+ `dynamodb:GetRecords`
+ `dynamodb:GetShardIterator`
+ `dynamodb:ListStreams`

下列範例政策會將存取名為 `GameScores` 之資料表上串流的許可授予使用者。ARN 中的萬用字元 (\$1) 可符合與該資料表建立關聯的任何串流。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AccessGameScoresStreamOnly",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeStream",
                "dynamodb:GetRecords",
                "dynamodb:GetShardIterator",
                "dynamodb:ListStreams"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/stream/*"
        }
    ]
}
```

------

請注意，此政策會授予存取 `GameScores` 資料表串流的權限，但不允許存取資料表本身。

# 允許 AWS Lambda 函數存取 DynamoDB 串流記錄的 IAM 政策
<a name="iam-policy-example-lamda-process-dynamodb-streams"></a>

如果您想要根據 DynamoDB 串流中的事件執行特定動作，您可以撰寫由這些事件觸發的 AWS Lambda 函數。這類 Lambda 函式需要從 DynamoDB Streams 讀取資料的許可。如需有關搭配使用 Lambda 和 DynamoDB Streams 的詳細資訊，請參閱 [DynamoDB 串流和 AWS Lambda 觸發](Streams.Lambda.md)。

若要將許可授予 Lambda，請使用與 Lambda 函式 IAM 角色相關聯的許可政策 (也稱為執行角色)。在您建立 Lambda 函式時，請指定此政策。

例如，您可以將下列許可政策與執行角色建立關聯，以授予執行所列 DynamoDB Streams 動作的 Lambda 許可。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "APIAccessForDynamoDBStreams",
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetRecords",
                "dynamodb:GetShardIterator",
                "dynamodb:DescribeStream",
                "dynamodb:ListStreams"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/stream/*"
        }
    ]
}
```

------

如需詳細資訊，請參閱《*AWS Lambda 開發人員指南*》中的 [AWS Lambda 許可](https://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html)。

# 允許對 DynamoDB Accelerator (DAX) 叢集進行讀取和寫入的 IAM 政策
<a name="iam-policy-example-read-write-dax-access"></a>

以下政策允許對 DynamoDB Accelerator (DAX) 叢集 (而非相關聯的 DynamoDB 資料表)，執行讀取、寫入、更新和刪除。若要使用此政策，請取代 AWS 區域名稱、您的帳戶 ID 和 DAX 叢集的名稱。

**注意**  
此政策允許存取 DAX 叢集，但不允許存取相關聯的 DynamoDB 資料表。請確定您的 DAX 叢集具有正確政策，可代表您在 DynamoDB 資料表上執行這些相同操作。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AmazonDynamoDBDAXDataOperations",
            "Effect": "Allow",
            "Action": [
                "dax:GetItem",
                "dax:PutItem",
                "dax:ConditionCheckItem",
                "dax:BatchGetItem",
                "dax:BatchWriteItem",
                "dax:DeleteItem",
                "dax:Query",
                "dax:UpdateItem",
                "dax:Scan"
            ],
            "Resource": "arn:aws:dax:eu-west-1:123456789012:cache/MyDAXCluster"
        }
    ]
}
```

------

若要展開此政策以涵蓋帳戶所有 AWS 區域的 DAX 存取，請針對區域名稱使用萬用字元 (\$1)。

```
"Resource": "arn:aws:dax:*:123456789012:cache/MyDAXCluster"
```







# Amazon DynamoDB 身分識別和存取疑難排解
<a name="security_iam_troubleshoot"></a>

請使用以下資訊來協助您診斷和修正使用 DynamoDB 和 IAM 時發生的常見問題。

**Topics**
+ [我未獲授權，不得在 DynamoDB 中執行動作](#security_iam_troubleshoot-no-permissions)
+ [我未獲得執行 iam:PassRole 的授權](#security_iam_troubleshoot-passrole)
+ [我想要允許 以外的人員 AWS 帳戶 存取我的 DynamoDB 資源](#security_iam_troubleshoot-cross-account-access)

## 我未獲授權，不得在 DynamoDB 中執行動作
<a name="security_iam_troubleshoot-no-permissions"></a>

如果 AWS 管理主控台 告訴您無權執行 動作，則必須聯絡您的管理員尋求協助。您的管理員是為您提供使用者名稱和密碼的人員。

下列範例錯誤會在 `mateojackson` 使用者嘗試使用主控台檢視一個虛構 `my-example-widget` 資源的詳細資訊，但卻無虛構 `aws:GetWidget` 許可時發生。

```
User: arn:aws:iam::123456789012:user/mateojackson is not authorized to perform: aws:GetWidget on resource: my-example-widget
```

在此情況下，Mateo 會請求管理員更新他的政策，允許他使用 `my-example-widget` 動作存取 `aws:GetWidget` 資源。

## 我未獲得執行 iam:PassRole 的授權
<a name="security_iam_troubleshoot-passrole"></a>

如果您收到錯誤，告知您無權執行 `iam:PassRole` 動作，您的政策必須更新，允許您將角色傳遞給 DynamoDB。

有些 AWS 服務 可讓您將現有角色傳遞給該服務，而不是建立新的服務角色或服務連結角色。如需執行此作業，您必須擁有將角色傳遞至該服務的許可。

當名為 `marymajor` 的 IAM 使用者嘗試使用主控台在 DynamoDB 中執行動作時，發生下列範例錯誤。但是，動作請求服務具備服務角色授予的許可。Mary 沒有將角色傳遞給服務的許可。

```
User: arn:aws:iam::123456789012:user/marymajor is not authorized to perform: iam:PassRole
```

在這種情況下，Mary 的政策必須更新，允許她執行 `iam:PassRole` 動作。

如果您需要協助，請聯絡您的 AWS 管理員。您的管理員提供您的簽署憑證。

## 我想要允許 以外的人員 AWS 帳戶 存取我的 DynamoDB 資源
<a name="security_iam_troubleshoot-cross-account-access"></a>

您可以建立一個角色，讓其他帳戶中的使用者或您組織外部的人員存取您的資源。您可以指定要允許哪些信任物件取得該角色。針對支援基於資源的政策或存取控制清單 (ACL) 的服務，您可以使用那些政策來授予人員存取您的資源的許可。

如需進一步了解，請參閱以下內容：
+ 若要了解 DynamoDB 是否支援這些功能，請參閱 [Amazon DynamoDB 如何搭配 IAM 運作](security_iam_service-with-iam.md)。
+ 若要了解如何 AWS 帳戶 在您擁有的 資源間提供存取權，請參閱《[IAM 使用者指南》中的在您擁有 AWS 帳戶 的另一個 IAM 使用者中提供存取權](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_aws-accounts.html)。 **
+ 若要了解如何將資源的存取權提供給第三方 AWS 帳戶，請參閱《*IAM 使用者指南*》中的[將存取權提供給第三方 AWS 帳戶 擁有](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_third-party.html)。
+ 如需了解如何透過聯合身分提供存取權，請參閱《*IAM 使用者指南*》中的[將存取權提供給在外部進行身分驗證的使用者 (聯合身分)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_federated-users.html)。
+ 如需了解使用角色和資源型政策進行跨帳戶存取之間的差異，請參閱《*IAM 使用者指南*》中的 [IAM 中的跨帳戶資源存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

# 避免購買 DynamoDB 預留容量的 IAM 政策
<a name="iam-policy-prevent-purchase-reserved-capacity"></a>

使用 Amazon DynamoDB 預留容量，您會支付一次性預付費用，並承諾在一段時間支付最低消費額，以大幅降低成本。您可以使用 AWS 管理主控台 檢視和購買預留容量。不過，您可能不希望組織中的所有使用者都可以購買預留容量。如需預留容量的詳細資訊，請參閱 [Amazon DynamoDB 定價](https://aws.amazon.com/dynamodb/pricing)。

DynamoDB 提供下列 API 操作，以控制對預留容量管理的存取：
+ `dynamodb:DescribeReservedCapacity`：傳回目前生效的預留容量購買。
+ `dynamodb:DescribeReservedCapacityOfferings`：傳回 AWS目前所提供之預留容量方案的詳細資訊。
+ `dynamodb:PurchaseReservedCapacityOfferings`：執行實際購買的預留容量。

 AWS 管理主控台 使用這些 API 動作來顯示預留容量資訊並進行購買。您無法從應用程式呼叫這些操作，因為只有從主控台才能加以存取。不過，您可以在 IAM 許可政策中允許或拒絕存取這些操作。

下列政策允許使用者使用 檢視預留容量購買和優惠 AWS 管理主控台 ，但拒絕新購買。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowReservedCapacityDescriptions",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeReservedCapacity",
                "dynamodb:DescribeReservedCapacityOfferings"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:*"
        },
        {
            "Sid": "DenyReservedCapacityPurchases",
            "Effect": "Deny",
            "Action": "dynamodb:PurchaseReservedCapacityOfferings",
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:*"
        }
    ]
}
```

------

請注意，此政策使用萬用字元 (\$1) 來允許所有、和描述許可，以拒絕為所有人購買 DynamoDB 預留容量。

# 使用 IAM 政策條件進行精細定義存取控制
<a name="specifying-conditions"></a>

您在 DynamoDB 中授予許可時，可以指定條件，以決定許可政策的生效方式。

## 概觀
<a name="FGAC_DDB.Overview"></a>

在 DynamoDB 中，您可以選擇在使用 IAM 政策授予許可時指定條件 (請參閱 [Amazon DynamoDB 的 Identity and Access Management](security-iam.md))。例如，您可以：
+ 授予許可，允許使用者唯讀存取資料表或次要索引中的特定項目和屬性。
+ 授予許可，允許使用者根據該使用者的身分唯寫存取資料表中的特定屬性。

在 DynamoDB 中，您可以使用條件金鑰在 IAM 政策中指定條件，如下節中的使用案例所述。

### 許可使用案例
<a name="FGAC_DDB.OverviewUseCase"></a>

除了控制對 DynamoDB API 動作的存取之外，您也可以控制對個別資料項目和屬性的存取。例如，您可以執行下列動作：
+ 授予資料表的許可，但根據特定主索引鍵值來限制存取該資料表中的特定項目。範例可能是遊戲的社交聯網應用程式，而所有使用者的已儲存遊戲資料都會存放在單一資料表中，但使用者無法存取他們未擁有的資料項目，如下圖所示：  
![\[授予使用者資料表層級存取權，但限制特定資料項目存取的使用案例。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/info-hiding-horizontal.png)
+ 隱藏資訊，讓使用者只能看到一部分的屬性。範例可能是根據使用者位置來顯示附近機場之航班資料的應用程式。航空公司名稱、到達和起飛時間，以及航班編號全部會顯示。不過，會隱藏駕駛員名稱或乘客數目這類屬性，如下圖所示：  
![\[僅向使用者顯示部分資料，但隱藏資料中的特定屬性。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/info-hiding-vertical.png)

若要實作這類精細定義存取控制，您可以撰寫 IAM 許可政策，以指定條件來存取安全憑證和相關聯許可。您接著將政策套用至使用 IAM 主控台所建立的使用者、群組或角色。您的 IAM 政策可以限制對資料表中個別項目的存取、對這些項目中屬性的存取，或同時限制兩者的存取。

您可以選擇性地使用 Web 聯合身分來控制透過 Login with Amazon、Facebook 或 Google 進行身分驗證之使用者的存取。如需詳細資訊，請參閱 [使用 Web 聯合身分](WIF.md)。

您可以使用 IAM `Condition` 元素來實作精細定義存取控制政策。將 `Condition` 元素新增至許可政策，即可根據特定商業需求來允許或拒絕存取 DynamoDB 資料表和索引中的項目和屬性。

以下影片說明如何在 DynamoDB 中透過 IAM 政策條件實作精細存取控制。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/LbEmo_yulb0?si=VTSlNHVocAEYwhJi/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/LbEmo_yulb0?si=VTSlNHVocAEYwhJi)


## 了解 DynamoDB 中的精細存取控制
<a name="FGAC_DDB.UnderstandingFineGrainedAccess"></a>

DynamoDB 中的精細存取控制可讓您在多個層級建立精確的許可界限：

1. **項目層級存取控制：**限制使用者只能存取包含特定金鑰值的項目，通常符合其身分或許可範圍。

1. **屬性層級存取控制：**限制使用者可以檢視或修改哪些屬性 （資料欄），可讓您保護敏感資訊，同時允許存取相同項目中的非敏感資料。

1. **操作特定的控制項：**根據正在執行的操作類型，套用不同的許可規則。

這些控制項是透過使用 DynamoDB 特定條件金鑰的 IAM 政策實作。

## 指定條件：使用條件金鑰
<a name="FGAC_DDB.ConditionKeys"></a>

AWS 為支援 IAM 進行存取控制的所有 AWS 服務提供一組預先定義的條件金鑰 (AWS全條件金鑰）。例如，您可以使用 `aws:SourceIp` 條件金鑰先檢查申請者的 IP 位址，再允許執行動作。如需詳細資訊和 AWS全局金鑰清單，請參閱《IAM 使用者指南》中的[可用條件金鑰](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#AvailableKeys)。

以下是適用於 DynamoDB 的 DynamoDB 服務特定條件金鑰。

**`dynamodb:LeadingKeys`**  
代表資料表的第一個索引鍵屬性，換言之，即分割區索引鍵。索引鍵名稱 `LeadingKeys` 是複數，即使索引鍵與單一項目動作一起使用也是一樣。此外，在條件中使用 `ForAllValues` 時，您必須使用 `LeadingKeys` 修飾詞。

**`dynamodb:Select`**  
代表請求的 `Select` 參數。`Select` 可以是下列的任何值：  
+ `ALL_ATTRIBUTES`
+ `ALL_PROJECTED_ATTRIBUTES`
+ `SPECIFIC_ATTRIBUTES`
+ `COUNT`
雖然通常與查詢和掃描操作相關聯，但此條件索引鍵適用於傳回項目屬性的所有 DynamoDB 操作，且對於控制所有 API 動作的屬性存取至關重要。在此條件金鑰上使用 StringEqualsIfExists 或類似限制條件，會對套用此條件金鑰的操作施加限制，同時忽略不適用的操作。

**`dynamodb:Attributes`**  
代表請求存取*的最上層*屬性清單。如果請求或其包含的任何巢狀屬性是在請求參數中指定，則會由請求存取頂層屬性。例如，指定 `ProjectionExpression`的`GetItem`請求`"Name, Address.City"`，`dynamodb:Attributes`清單將包含 "Name" 和 "Address"。如果在精細存取控制政策中列舉 `Attributes` 參數，請考慮同時限制 `ReturnValues`和 `Select` 參數，以確保限制存取多個 API 動作中的指定屬性`Query`，例如 `GetItem`、 和 `Scan`。  
此條件只會根據請求中指定的屬性 （例如 ProjectionExpression) 進行評估，而不是回應中的屬性。如果請求中未提供 ProjectionExpression，無論政策中的任何屬性限制，都會傳回所有屬性。如需如何正確保護屬性存取的詳細資訊，請參閱以下「強制執行屬性型限制」一節。

**`dynamodb:ReturnValues`**  
代表請求的 `ReturnValues` 參數。根據 API 動作， `ReturnValues`可以是下列任何值：  
+ `ALL_OLD`
+ `UPDATED_OLD`
+ `ALL_NEW`
+ `UPDATED_NEW`
+ `NONE`

**`dynamodb:ReturnConsumedCapacity`**  
代表請求的 `ReturnConsumedCapacity` 參數。`ReturnConsumedCapacity` 可以是下列的一個值：  
+ `TOTAL`
+ `NONE`

**`dynamodb:FirstPartitionKeyValues`**  
代表資料表的第一個索引鍵屬性，也就是第一個分割區索引鍵。索引鍵名稱 `FirstPartitionKeyValues` 是複數，即使索引鍵與單一項目動作一起使用也是一樣。此外，在條件`FirstPartitionKeyValues`中使用 `ForAllValues` 時，您必須使用 修飾詞。 `FirstPartitionKeyValues`和 `LeadingKeys`可以使用可交換。

**`dynamodb:SecondPartitionKeyValues`**  
類似於 `dynamodb:FirstPartitionKeyValues`。代表資源的第二個分割區索引鍵。索引鍵名稱 `SecondPartitionKeyValues` 是複數，即使索引鍵與單一項目動作一起使用也是一樣。

**`dynamodb:ThirdPartitionKeyValues`**  
類似於 `dynamodb:FirstPartitionKeyValues`。代表資源的第三個分割區索引鍵。索引鍵名稱 `ThirdPartitionKeyValues` 是複數，即使索引鍵與單一項目動作一起使用也是一樣。

**`dynamodb:FourthPartitionKeyValues`**  
類似於 `dynamodb:FirstPartitionKeyValues`。代表資源的第四個分割區索引鍵。索引鍵名稱 `FourthPartitionKeyValues` 是複數，即使索引鍵與單一項目動作一起使用也是一樣。

### 確保強制執行屬性型限制
<a name="FGAC_DDB.EnsuringAttributeRestrictions"></a>

使用屬性型條件來限制對特定屬性的存取時，請務必了解這些條件的評估方式：
+ **屬性條件只會對請求中指定的屬性進行評估**，而不是對回應中的屬性進行評估。
+ **對於沒有 ProjectionExpression (GetItem、Query、Scan 等） 的讀取操作**，無論政策中的屬性限制為何，都會傳回所有屬性。 GetItem 為了防止暴露這種潛在的敏感資料，必須同時實作屬性條件 (`dynamodb:Attributes`) 和需要特定屬性的條件 (`dynamodb:Select`)。
+ **對於寫入操作** (PutItem、UpdateItem、DeleteItem)，ReturnValues 參數可以傳回完整項目，即使寫入操作本身符合您的政策，也可能會公開受限屬性。若要防止此暴露，請在政策中對 ReturnValues (`dynamodb:Attributes`) 實作屬性條件 (`dynamodb:ReturnValues`) 和限制。

### 限制使用者存取
<a name="FGAC_DDB.LimitingAccess"></a>

許多 IAM 許可政策可讓使用者只存取資料表中分割區索引鍵值符合使用者識別符的項目。例如，遊戲應用程式先前限制是使用此方式所存取，因此使用者只能存取與其使用者 ID 建立關聯的遊戲資料。IAM 替換變數 `${www.amazon.com:user_id}`、`${graph.facebook.com:id}` 和 `${accounts.google.com:sub}` 包含用於 Login with Amazon、Facebook 及 Google 的使用者識別符。若要了解應用程式如何登入其中一個身分提供者，並取得這些識別符，請參閱 [使用 Web 聯合身分](WIF.md)。

**重要**  
不支援使用精細存取控制來限制全域資料表的複寫。將精細存取控制的原則條件套用至用於全域資料表複寫的 DynamoDB [服務主體或服務連結角色](globaltables-security.md)，可能導致全域資料表內的複寫中斷。

**注意**  
下節中的每個範例都會將 `Effect` 子句設定為 `Allow`，而且只指定允許的動作、資源及參數。只允許存取 IAM 政策中明確列出的項目。  
在某些情況下，有可能會重新撰寫這些政策，讓它們成為拒絕類型 (即，將 `Effect` 子句設定為 `Deny`，並反轉政策中的所有邏輯)。不過，建議您避免在 DynamoDB 中使用以拒絕為基礎的原則，因為這類原則比以允許為基礎的原則更難正確撰寫。此外，DynamoDB API 的未來變更 (或現有 API 輸入的變更) 也可能會導致無效的拒絕類型政策。

### 範例政策：使用條件進行精細定義存取控制
<a name="FGAC_DDB.Examples"></a>

本節顯示數個政策，來實作 DynamoDB 資料表和索引上的精細定義存取控制。

**注意**  
所有範例都會使用 us-west-2 區域，並且包含虛構帳戶 ID。

#### 範例 1. 具有屬性限制的基本分割區金鑰型存取控制
<a name="FGAC_DDB.Examples.BasicPartitionKeyAccess"></a>

例如，試想有一個能讓玩家選取和玩各種不同遊戲的手機遊戲應用程式。應用程式使用名為 的 DynamoDB 資料表`GameScores`來追蹤高分和其他使用者資料。資料表中的每個項目都是依使用者 ID 和使用者所玩遊戲的名稱進行唯一識別。`GameScores` 資料表的主索引鍵包含分割區索引鍵 (`UserId`) 與排序索引鍵 (`GameTitle`)。使用者只可存取與其使用者 ID 建立關聯的遊戲資料。想要玩遊戲的使用者必須屬於名為 `GameRole` 且已連接安全政策的 IAM 角色。

若要管理應用程式中的使用者許可，您可以撰寫下列這類許可政策：

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"AllowAccessToOnlyItemsMatchingUserID",
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query",
            "dynamodb:PutItem",
            "dynamodb:UpdateItem",
            "dynamodb:DeleteItem",
            "dynamodb:BatchWriteItem"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${www.amazon.com:user_id}"
               ],
               "dynamodb:Attributes":[
                  "UserId",
                  "GameTitle",
                  "Wins",
                  "Losses",
                  "TopScore",
                  "TopScoreDateTime"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

除了授予 `GameScores` 資料表 (`Action` 元素) 上特定 DynamoDB 動作 (`Resource` 元素) 的許可之外，`Condition` 元素還會使用 DynamoDB 特有的下列條件金鑰來限制許可，如下所示：
+ `dynamodb:LeadingKeys`：此條件金鑰可讓使用者只存取分割區索引鍵值符合其使用者 ID 的項目。此 ID `${www.amazon.com:user_id}` 是替換變數。如需替換變數的詳細資訊，請參閱 [使用 Web 聯合身分](WIF.md)。
+ `dynamodb:Attributes`：此條件金鑰會限制對所指定屬性的存取，因此只有許可政策中所列的動作才能傳回這些屬性的值。此外，`StringEqualsIfExists` 子句可以確保應用程式必須一律提供要處理的特定屬性清單，以及確保應用程式無法請求所有屬性。

評估 IAM 政策時，結果一律是 true (允許存取) 或 false (拒絕存取)。如果 `Condition` 元素的任一部分是 false，則整個政策會評估為 false，並拒絕存取。

**重要**  
如果您使用 `dynamodb:Attributes`，則必須指定政策中所列資料表和任何次要索引之所有主索引鍵和索引鍵屬性的名稱。否則，DynamoDB 無法使用這些索引鍵屬性來執行所請求的動作。

IAM 政策文件只能包含下列 Unicode 字元：水平定位字元 (U\$10009)、換行字元 (U\$1000A)、歸位字元 (U\$1000D)，以及 U\$10020 到 U\$100FF 範圍內的字元。

#### 範例 2：授予許可，以限制對具有特定分割區索引鍵值之項目的存取
<a name="FGAC_DDB.Examples.PartitionKeyValue"></a>

下列許可政策授予許可，以允許 `GamesScore` 資料表上的一組 DynamoDB 動作。它會使用 `dynamodb:LeadingKeys` 條件金鑰，只限制下列項目的使用者動作：其 `UserID` 主索引鍵值符合此應用程式之 Login with Amazon 唯一使用者 ID 的項目。

**重要**  
動作清單不包含 `Scan` 的許可，因為 `Scan` 會傳回所有項目，不論前導索引鍵為何。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"FullAccessToUserItems",
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query",
            "dynamodb:PutItem",
            "dynamodb:UpdateItem",
            "dynamodb:DeleteItem",
            "dynamodb:BatchWriteItem"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${www.amazon.com:user_id}"
               ]
            }
         }
      }
   ]
}
```

------

**注意**  
使用政策變數時，您必須在政策中明確指定 2012-10-17 版。存取政策語言的預設版本 2008-10-17，不支援政策變數。

若要實作唯讀存取權，您可以移除任何可修改資料的動作。在下列政策中，條件中只會包含提供唯讀存取權的動作。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"ReadOnlyAccessToUserItems",
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${www.amazon.com:user_id}"
               ]
            }
         }
      }
   ]
}
```

------

**重要**  
如果您使用 `dynamodb:Attributes`，則必須指定政策中所列資料表和任何次要索引之所有主索引鍵和索引鍵屬性的名稱。否則，DynamoDB 無法使用這些金鑰屬性來執行所請求的動作。

#### 範例 3：授予許可，限制對資料表中特定屬性的存取
<a name="FGAC_DDB.Examples.SpecificAttributes"></a>

下列許可政策透過新增 `dynamodb:Attributes` 條件金鑰，來允許只存取資料表中的兩個特定屬性。在條件式寫入或掃描篩選條件中，可以讀取、寫入或評估這些屬性。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"LimitAccessToSpecificAttributes",
         "Effect":"Allow",
         "Action":[
            "dynamodb:UpdateItem",
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:BatchGetItem",
            "dynamodb:Scan"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:Attributes":[
                  "UserId",
                  "TopScore"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES",
               "dynamodb:ReturnValues":[
                  "NONE",
                  "UPDATED_OLD",
                  "UPDATED_NEW"
               ]
            }
         }
      }
   ]
}
```

------

**注意**  
政策會採用允許清單方式，以允許存取一組指定的屬性。您可以撰寫同等的政策，改為拒絕存取其他屬性。我們不建議使用此拒絕清單方式。使用者可以決定這些受拒絕的屬性，請遵循最低權限政策，如 Wikipedia (網址為 http://en.wikipedia.org/wiki/Principle\$1of\$1least\$1privilege) 中所述，並使用允許清單方式來列舉所有允許值，而不是指定拒絕屬性。

此政策不允許 `PutItem`、`DeleteItem` 或 `BatchWriteItem`。這些動作一律會取代整個先前項目，以允許使用者刪除不允許它們存取之屬性的先前值。

許可政策中的 `StringEqualsIfExists` 子句確保下列狀況：
+ 如果使用者指定 `Select` 參數，則其值必須是 `SPECIFIC_ATTRIBUTES`。此需求防止 API 動作傳回任何不允許的屬性，例如來自索引投影。
+ 如果使用者指定 `ReturnValues` 參數，則其值必須是 `NONE`、`UPDATED_OLD` 或 `UPDATED_NEW`。這是必要項目，因為 `UpdateItem` 動作也會執行隱含讀取操作來檢查項目在取代前是否存在，因此，請求時可以傳回先前的屬性值。以這種方式限制 `ReturnValues` 可確定使用者只能讀取或寫入允許的屬性。
+ `StringEqualsIfExists` 子句可確保在允許動作內容中，一個請求只能使用其中一個參數：`Select` 或 `ReturnValues`。

以下是此政策的某些變化：
+ 若只要允許讀取動作，您可以從允許動作清單中移除 `UpdateItem`。因為其餘動作不接受 `ReturnValues` 動作，所以您可以從條件中移除 `ReturnValues`。您也可以將 `StringEqualsIfExists` 變更為 `StringEquals`，因為 `Select` 參數一律會有值 (除非特別指定，否則為 `ALL_ATTRIBUTES`)。
+ 若只要允許寫入動作，您可以從允許動作清單中移除所有項目，但 `UpdateItem` 除外。因為 `UpdateItem` 未使用 `Select` 參數，所以您可以從條件中移除 `Select`。您也必須將 `StringEqualsIfExists` 變更為 `StringEquals`，因為 `ReturnValues` 參數一律會有值 (除非特別指定，否則為 `NONE`)。
+ 若要允許名稱符合某模式的所有屬性，請使用 `StringLike`，而非 `StringEquals`，並使用多字元模式相符萬用字元 (\$1)。

#### 範例 4：授予許可以防止更新特定屬性
<a name="FGAC_DDB.Examples.PreventUpdates"></a>

下列許可政策限制只更新 `dynamodb:Attributes` 條件金鑰所識別之特定屬性的使用者存取。`StringNotLike` 條件防止應用程式更新使用 `dynamodb:Attributes` 條件金鑰所指定的屬性。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"PreventUpdatesOnCertainAttributes",
         "Effect":"Allow",
         "Action":[
            "dynamodb:UpdateItem"
         ],
         "Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/GameScores",
         "Condition":{
            "ForAllValues:StringNotLike":{
               "dynamodb:Attributes":[
                  "FreeGamesAvailable",
                  "BossLevelUnlocked"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES",
               "dynamodb:ReturnValues":[
                  "NONE",
                  "UPDATED_OLD",
                  "UPDATED_NEW"
               ]
            }
         }
      }
   ]
}
```

------

注意下列事項：
+ `UpdateItem` 動作 (如同其他寫入動作) 需要項目的讀取存取，以便其傳回更新前後的值。在政策中，您會限制只存取特定屬性的動作，且這些屬性僅限於允許藉由指定 `dynamodb:ReturnValues` 條件金鑰來進行更新者。條件金鑰會限制請求中的 `ReturnValues`，只指定 `NONE`、`UPDATED_OLD` 或 `UPDATED_NEW`，而且未包含 `ALL_OLD` 或 `ALL_NEW`。
+ `StringEqualsIfExists` 運算子可確保如果 `dynamodb:Select`或 `dynamodb:ReturnValues` 存在於請求中，則必須符合指定的值。這可防止操作傳回完整項目。
+ 限制屬性更新時，您也應該控制可以傳回哪些資料，以防止受保護屬性的資訊洩露。
+ `PutItem` 和 `DeleteItem` 動作會取代整個項目，因此允許應用程式修改任何屬性。因此，限制應用程式只更新特定屬性時，您不應該授予這些 API 的許可。

#### 範例 5：授予僅查詢索引中投影屬性的許可
<a name="FGAC_DDB.Examples.QueryProjectedAttributes"></a>

下列許可政策使用 `dynamodb:Attributes` 條件金鑰，允許對次要索引 (`TopScoreDateTimeIndex`) 進行查詢。政策也會限制只請求已投影到索引之特定屬性的查詢。

若需要應用程式在查詢中指定屬性清單，政策也會指定 `dynamodb:Select` 條件金鑰需要 DynamoDB `Query` 動作的 `Select` 參數是 `SPECIFIC_ATTRIBUTES`。屬性清單限制為使用 `dynamodb:Attributes` 條件金鑰所提供的特定清單。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"QueryOnlyProjectedIndexAttributes",
         "Effect":"Allow",
         "Action":[
            "dynamodb:Query"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/TopScoreDateTimeIndex"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:Attributes":[
                  "TopScoreDateTime",
                  "GameTitle",
                  "Wins",
                  "Losses",
                  "Attempts"
               ]
            },
            "StringEquals":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

下列許可政策類似，但查詢必須請求所有已投影到索引的屬性。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"QueryAllIndexAttributes",
         "Effect":"Allow",
         "Action":[
            "dynamodb:Query"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/TopScoreDateTimeIndex"
         ],
         "Condition":{
            "StringEquals":{
               "dynamodb:Select":"ALL_PROJECTED_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

#### 範例 6：授予許可，以限制對特定屬性和分割區索引鍵值的存取
<a name="FGAC_DDB.Examples.AttributesAndKeyValues"></a>

下列許可政策允許資料表和資料表索引 (指定於 `Action` 元素) 的特定 DynamoDB 動作 (指定於 `Resource` 元素)。此政策使用 `dynamodb:LeadingKeys`條件索引鍵來限制許可，僅限分割區索引鍵值符合使用者 Facebook ID 的項目。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"LimitAccessToCertainAttributesAndKeyValues",
         "Effect":"Allow",
         "Action":[
            "dynamodb:UpdateItem",
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:BatchGetItem"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores",
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/TopScoreDateTimeIndex"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${graph.facebook.com:id}"
               ],
               "dynamodb:Attributes":[
                  "attribute-A",
                  "attribute-B"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES",
               "dynamodb:ReturnValues":[
                  "NONE",
                  "UPDATED_OLD",
                  "UPDATED_NEW"
               ]
            }
         }
      }
   ]
}
```

------

注意下列事項：
+ 政策 (`UpdateItem`) 允許的寫入動作只能修改屬性 A 或屬性 B。
+ 因為政策允許 `UpdateItem`，所以應用程式可以插入新項目，而隱藏屬性在新項目中會是 Null。如果這些屬性投影到 `TopScoreDateTimeIndex`，則政策將有助於防止會致使從資料表擷取的查詢。
+ 應用程式無法讀取 `dynamodb:Attributes` 中所列屬性以外的任何屬性。在此政策下，應用程式必須將讀取請求中的 `Select` 參數設定為 `SPECIFIC_ATTRIBUTES`，而且只能請求列於允許清單上的屬性。對於寫入請求，應用程式無法將 `ReturnValues` 設定為 `ALL_OLD` 或 `ALL_NEW`，而且無法根據任何其他屬性來執行條件式寫入操作。

#### 範例 7：拒絕限制存取資料表中特定屬性的許可
<a name="FGAC_DDB.Examples.DenySpecificAttributes"></a>

下列政策拒絕存取敏感屬性，並確保無法透過省略投影表達式來略過此限制。它允許對`CustomerData`資料表的一般存取，同時明確拒絕對 `SSN`和 `CreditCardNumber` 屬性的存取。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:Scan"
         ],
         "Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/CustomerData"
      },
      {
         "Effect":"Deny",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:Scan"
         ],
         "Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/CustomerData",
         "Condition":{
            "ForAnyValue:StringEquals":{
               "dynamodb:Attributes":[
                  "SSN",
                  "CreditCardNumber"
               ]
            }
         }
      },
      {
         "Effect":"Deny",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:Scan"
         ],
         "Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/CustomerData",
         "Condition":{
            "StringNotEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

## 相關主題
<a name="w2aac39c21c15c11"></a>
+  [Amazon DynamoDB 的 Identity and Access Management](security-iam.md) 
+ [DynamoDB API 許可：動作、資源和條件參考](api-permissions-reference.md)

# 使用 Web 聯合身分
<a name="WIF"></a>

如果您要撰寫以大量使用者為目標的應用程式，也可以選擇使用 *web 聯合身分*進行身分驗證和授權。Web 聯合身分讓您不再需要建立個別的使用者。反之，使用者可以登入身分提供者，然後從 AWS Security Token Service () 取得臨時安全登入資料AWS STS。然後，應用程式可以使用這些登入資料來存取 AWS 服務。

Web 聯合身分支援下列身分提供者：
+ 登入 Amazon
+ Facebook
+ Google

## Web 聯合身分的其他資源
<a name="WIF.AdditionalResources"></a>

下列資源可協助您進一步了解 Web 聯合身分：
+  AWS 開發人員部落格中的[使用 適用於 .NET 的 AWS SDK的 Web 聯合身分](https://aws.amazon.com/blogs/developer/web-identity-federation-using-the-aws-sdk-for-net)文章，會介紹如何使用 Facebook 的 Web 聯合身分。它包含 C\$1 中的程式碼片段，示範如何擔任具有 Web 身分的 IAM 角色，以及如何使用臨時安全登入資料來存取 AWS 資源。
+ [AWS Mobile SDK for iOS](https://aws.amazon.com/sdkforios/) 和 [適用於 Android 的 AWS Mobile SDK](https://aws.amazon.com/sdkforandroid/) 包含範例應用程式。這些應用程式所包含的程式碼示範如何調用身分提供者，接著示範如何使用這些供應商中的資訊來取得和使用暫時安全憑證。
+ 與[行動應用程式的 Web 聯合身分](https://aws.amazon.com/articles/4617974389850313)一文討論 Web 聯合身分，並顯示如何使用 Web 聯合身分存取 AWS 資源的範例。

## Web 聯合身分的範例政策
<a name="WIF.Example"></a>

若要顯示如何使用 DynamoDB 的 Web 聯合身分，請重新造訪 [使用 IAM 政策條件進行精細定義存取控制](specifying-conditions.md) 中介紹的 *GameScores* 資料表。以下是 *GameScores* 的主索引鍵。


****  

| 資料表名稱 | 主索引鍵類型 | 分割區索引鍵名稱和類型 | 排序索引鍵名稱和類型 | 
| --- | --- | --- | --- | 
| GameScores (UserId、GameTitle ...) | 複合 | 屬性名稱：UserId 類型：字串 | 屬性名稱：GameTitle 類型：字串 | 

現在假設手機遊戲應用程式使用此資料表，而且應用程式需要支援數千或甚至數百萬使用者。就此規模而言，會變得很難管理個別應用程式使用者，且很難保證每位使用者只能存取 *GameScores* 資料表中的個別資料。好消息是，許多使用者都擁有第三方身分提供者 (例如 Facebook、Google 或 Login with Amazon) 的帳戶。因此可以合理地運用其中一個提供者來進行身分驗證任務。

若要使用 Web 聯合身分來執行這個操作，則應用程式開發人員必須向身分提供者 (例如 Login with Amazon) 註冊應用程式，並取得唯一應用程式 ID。接下來，開發人員需要建立 IAM 角色。(在此範例中，此角色的名稱為 *GameRole*。) 此角色必須已連接 IAM 政策文件、指定應用程式可存取 *GameScores* 資料表的條件。

使用者想要玩遊戲時，會從遊戲應用程式登入其 Login with Amazon 帳戶。應用程式接著會呼叫 AWS Security Token Service (AWS STS)，提供 Login with Amazon 應用程式 ID 並在 *GameRole* 中請求成員資格。 AWS STS 會傳回臨時 AWS 登入資料給應用程式，並允許其存取 *GameScores* 資料表，但需遵循 *GameRole* 政策文件。

下圖顯示這些部分如何一起使用。

![\[遊戲應用程式的工作流程。應用程式使用 Amazon ID 和 AWS STS 來取得存取 DynamoDB 資料表的臨時登入資料。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/wif-overview.png)


**Web 聯合身分概觀**

1. 應用程式會呼叫第三方身分提供者，以對使用者和應用程式進行身分驗證。身分提供者會將 Web 身分字符傳回給應用程式。

1. 應用程式會呼叫 AWS STS 並將 Web 身分字符做為輸入傳遞。 會 AWS STS 授權應用程式並提供其暫時 AWS 存取憑證。應用程式可以擔任 IAM 角色 (*GameRole*)，並根據角色的安全政策存取 AWS 資源。

1. 應用程式呼叫 DynamoDB 來存取 *GameScores* 資料表。因為應用程式已擔任 *GameRole*，所以受限於與該角色建立關聯的安全政策。政策文件會防止應用程式存取不屬於使用者的資料。

再說明一次，以下是顯示在 [使用 IAM 政策條件進行精細定義存取控制](specifying-conditions.md) 中的 *GameRole* 安全性政策：

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"AllowAccessToOnlyItemsMatchingUserID",
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query",
            "dynamodb:PutItem",
            "dynamodb:UpdateItem",
            "dynamodb:DeleteItem",
            "dynamodb:BatchWriteItem"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${www.amazon.com:user_id}"
               ],
               "dynamodb:Attributes":[
                  "UserId",
                  "GameTitle",
                  "Wins",
                  "Losses",
                  "TopScore",
                  "TopScoreDateTime"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

`Condition` 子句決定 *GameScores* 在應用程式中可看到的項目。作法是比較 Login with Amazon ID 與 `UserId` 中的 `GameScores` 分割區索引鍵值。只有使用此政策中所列的其中一個 DynamoDB 動作才能處理屬於目前使用者的項目。但無法存取資料表中的其他項目。甚至，只能存取政策中所列的特定屬性。

# 準備使用 Web 聯合身分
<a name="WIF.PreparingForUse"></a>

如果您是應用程式開發人員，並想要針對應用程式使用 Web 聯合身分，請遵循下列步驟進行：

1. **向第三方身分提供者註冊為開發人員。**下列外部連結提供向所支援之身分提供者註冊的資訊：
   + [Login with Amazon 開發人員中心](http://login.amazon.com/)
   + Facebook 網站上的[註冊](https://business.facebook.com/business/loginpage)
   + 在 Google 網站上[使用 OAuth 2.0 存取 Google API](https://developers.google.com/accounts/docs/OAuth2)

1. **向身分提供者註冊應用程式。**當您這麼做時，提供者會將您應用程式的唯一 ID 提供給您。如果您想要應用程式使用多個身分提供者，則需要向每個供應商取得應用程式 ID。

1. **建立一或多個 IAM 角色。**每個應用程式的各個身分供應商都需要一個角色。例如，您可能會建立使用者使用 Login with Amazon 登入之應用程式可擔任的角色、使用者使用 Facebook 登入之相同應用程式可擔任的次要角色，以及使用者使用 Google 登入之應用程式可擔任的第三個角色。

   在建立角色程序期間，您需要將 IAM 政策連接至此角色。您的政策文件應該定義應用程式所需的 DynamoDB 資源，以及存取這些資源的許可。

如需詳細資訊，請參閱《*IAM 使用者指南*》中的[關於 Web 聯合身分](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html)。

**注意**  
或者 AWS Security Token Service，您可以使用 Amazon Cognito。Amazon Cognito 是管理行動應用程式臨時憑證的偏好服務。如需詳細資訊，請參閱《*Amazon Cognito 開發人員指南*》中的[取得憑證](https://docs.aws.amazon.com/cognito/latest/developerguide/getting-credentials.html)。

## 使用 DynamoDB 主控台產生 IAM 政策
<a name="WIF.PreparingForUse.DDBConsole"></a>

DynamoDB 主控台可協助您建立 IAM 政策，以與 Web 聯合身分搭配使用。若要執行此操作，您可以選擇 DynamoDB 資料表，並指定要包含在政策中的身分提供者、動作和屬性。DynamoDB 主控台接著會產生可連接至 IAM 角色的政策。

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/) 開啟 DynamoDB 主控台。

1.  在導覽窗格中，選擇 **Tables** (資料表)。

1.  在資料表清單中，選擇想要用於建立 IAM 政策的資料表。

1.  選取**動作**按鈕，然後選擇**建立存取控制政策**。

1.  選擇政策的身分提供者、動作和屬性。

    完成您要的設定後，選擇**產生政策**。即會出現產生的政策。

1.  選擇**請參閱文件**，然後遵循所需的步驟將產生的政策附加到 IAM 角色。

# 撰寫應用程式使用 Web 聯合身分
<a name="WIF.RunningYourApp"></a>

若要使用 Web 聯合身分，您的應用程式必須假設您建立的 IAM 角色。完成後，應用程式會遵守您連接到角色的存取政策。

在執行時期，如果您的應用程式使用 Web 聯合身分，則必須遵循下列步驟進行：

1. **使用第三方身分提供者進行身分驗證。**您的應用程式必須使用身分提供者所提供的介面來呼叫身分提供者。對使用者進行身分驗證的確切方式取決於供應商以及執行應用程式的平台。一般而言，如果使用者尚未登入，則身分供應商會負責顯示該供應商的登入頁面。

   身分提供者對使用者進行身分驗證之後，供應商會將 Web 身分字符傳回給應用程式。此字符的格式取決於供應商，但通常是極長的字元字串。

1. **取得臨時 AWS 安全登入資料。**若要執行此操作，您的應用程式會將 `AssumeRoleWithWebIdentity` 請求傳送至 AWS Security Token Service (AWS STS)。此請求包含以下項目：
   + 先前步驟中的 Web 身分字符
   + 來自身分提供者的應用程式 ID
   + 針對此應用程式的這個身分提供者所建立之 IAM 角色的 Amazon Resource Name (ARN)

   AWS STS 會傳回一組在特定時間後過期 AWS 的安全登入資料 （預設為 3，600 秒）。

   以下是 AWS STS中 `AssumeRoleWithWebIdentity` 動作的範例請求和回應。Web 身分字符取自 Login with Amazon 身分提供者。

   ```
   GET / HTTP/1.1
   Host: sts.amazonaws.com
   Content-Type: application/json; charset=utf-8
   URL: https://sts.amazonaws.com/?ProviderId=www.amazon.com
   &DurationSeconds=900&Action=AssumeRoleWithWebIdentity
   &Version=2011-06-15&RoleSessionName=web-identity-federation
   &RoleArn=arn:aws:iam::123456789012:role/GameRole
   &WebIdentityToken=Atza|IQEBLjAsAhQluyKqyBiYZ8-kclvGTYM81e...(remaining characters omitted)
   ```

   

   ```
   <AssumeRoleWithWebIdentityResponse
     xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
     <AssumeRoleWithWebIdentityResult>
       <SubjectFromWebIdentityToken>amzn1.account.AGJZDKHJKAUUSW6C44CHPEXAMPLE</SubjectFromWebIdentityToken>
       <Credentials>
         <SessionToken>AQoDYXdzEMf//////////wEa8AP6nNDwcSLnf+cHupC...(remaining characters omitted)</SessionToken>
         <SecretAccessKey>8Jhi60+EWUUbbUShTEsjTxqQtM8UKvsM6XAjdA==</SecretAccessKey>
         <Expiration>2013-10-01T22:14:35Z</Expiration>
         <AccessKeyId>06198791C436IEXAMPLE</AccessKeyId>
       </Credentials>
       <AssumedRoleUser>
         <Arn>arn:aws:sts::123456789012:assumed-role/GameRole/web-identity-federation</Arn>
         <AssumedRoleId>AROAJU4SA2VW5SZRF2YMG:web-identity-federation</AssumedRoleId>
       </AssumedRoleUser>
     </AssumeRoleWithWebIdentityResult>
     <ResponseMetadata>
       <RequestId>c265ac8e-2ae4-11e3-8775-6969323a932d</RequestId>
     </ResponseMetadata>
   </AssumeRoleWithWebIdentityResponse>
   ```

1. **存取 AWS 資源。** AWS STS 的回應包含應用程式存取 DynamoDB 資源所需的資訊：
   + `AccessKeyID`、`SecretAccessKey` 和 `SessionToken` 欄位包含只適用於此使用者和此應用程式的安全憑證。
   + `Expiration` 欄位表示這些憑證的時間限制，在此時間之後就不再有效。
   + `AssumedRoleId` 欄位包含應用程式已擔任之工作階段特定 IAM 角色的名稱。應用程式會在此工作階段期間遵守 IAM 政策文件中的存取控制。
   + `SubjectFromWebIdentityToken` 欄位包含出現在此特定身分提供者的 IAM 政策變數中的唯一 ID。以下是所支援供應商的 IAM 政策變數，及其範例值：  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/WIF.RunningYourApp.html)

如需使用這些政策變數的範例 IAM 政策，請參閱 [範例政策：使用條件進行精細定義存取控制](specifying-conditions.md#FGAC_DDB.Examples)。

如需如何 AWS STS 產生臨時存取登入資料的詳細資訊，請參閱《*IAM 使用者指南*》中的[請求臨時安全登入](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html)資料。

# DynamoDB API 許可：動作、資源和條件參考
<a name="api-permissions-reference"></a>

當您設定 [Amazon DynamoDB 的 Identity and Access Management](security-iam.md) 並撰寫可連接至 IAM 身分 (身分類型政策) 的許可政策時，可以參考《*IAM 使用者指南*》中的 [Amazon DynamoDB 的動作、資源和條件金鑰](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html)。此頁面列出每個 DynamoDB API 操作、您可以授予執行動作許可的對應動作，以及您可以授予許可 AWS 的資源。您在政策的 `Action` 欄位中指定動作，然後在政策的 `Resource` 欄位中指定資源值。

您可以在 DynamoDB 政策中使用 AWS整個條件索引鍵來表達條件。如需 AWS全系列金鑰的完整清單，請參閱《[IAM 使用者指南》中的 IAM JSON 政策元素參考](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#AvailableKeys)。 **

除了 AWS全局條件金鑰之外，DynamoDB 也有自己的特定金鑰，您可以在條件中使用。如需詳細資訊，請參閱[使用 IAM 政策條件進行精細定義存取控制](specifying-conditions.md)。

## 相關主題
<a name="w2aac39c21c15c15b9"></a>
+  [Amazon DynamoDB 的 Identity and Access Management](security-iam.md)
+ [使用 IAM 政策條件進行精細定義存取控制](specifying-conditions.md)

# DynamoDB 的業界合規驗證
<a name="Compliance"></a>

若要了解 是否 AWS 服務 在特定合規計劃範圍內，請參閱[AWS 服務 合規計劃範圍內](https://aws.amazon.com/compliance/services-in-scope/)然後選擇您感興趣的合規計劃。如需一般資訊，請參閱[AWS 合規計劃](https://aws.amazon.com/compliance/programs/)。

您可以使用 下載第三方稽核報告 AWS Artifact。如需詳細資訊，請參閱[下載報告下載 AWS Artifact](https://docs.aws.amazon.com/artifact/latest/ug/downloading-documents.html)。

您使用 時的合規責任 AWS 服務 取決於資料的敏感度、您公司的合規目標，以及適用的法律和法規。如需使用 時合規責任的詳細資訊 AWS 服務，請參閱 [AWS 安全文件](https://docs.aws.amazon.com/security/)。

# Amazon DynamoDB 中的資料復原及災難復原功能
<a name="disaster-recovery-resiliency"></a>

 AWS 全球基礎設施是以 AWS 區域和可用區域為基礎建置。 AWS 區域提供多個實體分隔和隔離的可用區域，這些可用區域以低延遲、高輸送量和高備援聯網連接。透過可用區域，您所設計與操作的應用程式和資料庫，就能夠在可用區域之間自動容錯移轉，而不會發生中斷。可用區域的可用性、容錯能力和擴充能力，均較單一或多個資料中心的傳統基礎設施還高。

如果您需要在更大的地理距離內複製資料或應用程式，請使用 AWS 本地區域。 AWS 本機區域是單一資料中心，旨在補充現有的 AWS 區域。如同所有 AWS 區域， AWS 本機區域與其他 AWS 區域完全隔離。

如需 AWS 區域和可用區域的詳細資訊，請參閱 [AWS 全球基礎設施](https://aws.amazon.com/about-aws/global-infrastructure/)。

Amazon DynamoDB 會自動跨區域中的三個可用區域複寫您的資料，提供內建的高耐用性和 99.99% 的可用性 SLA。此外，DynamoDB 提供數種功能，可協助支援您的資料彈性和備份需求。

**隨需備份與還原**  
DynamoDB 提供隨需備份功能。它可讓您建立資料表的完整備份來長期保留與封存。如需詳細資訊，請參閱 [DynamoDB 的隨需備份與還原](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Backup-and-Restore.html)。

**時間點復原**  
時間點復原有助於保護您的 DynamoDB 資料表免遭意外寫入或刪除操作。有了時間點復原，就無需為建立、維護或排程隨需備份而煩惱。如需詳細資訊，請參閱 [DynamoDB 的時間點復原](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Point-in-time-recovery.html)。

**跨 AWS 區域同步的全域資料表**  
DynamoDB 會自動將資料表的資料與傳輸流分散到足夠數量的伺服器上，以處理您的輸送量和儲存需求，同時保持快速且一致的效能。所有資料都存放在固態硬碟 (SSDs) 上，並自動複寫到 AWS 區域中的多個可用區域，提供內建的高可用性和資料耐用性。您可以使用全域資料表來讓 DynamoDB 資料表跨 AWS 區域保持同步。

# Amazon DynamoDB 中的基礎設施安全性
<a name="network-isolation"></a>

Amazon DynamoDB 是受管服務，受到位於 AWS Well-Architected Framework 的[基礎設施保護](https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/infrastructure-protection.html)中所述的 AWS 全球網路安全程序的保護。

您可以使用 AWS 發佈的 API 呼叫，透過網路存取 DynamoDB。用戶端可使用 TLS (Transport Layer Security) 1.2 或 1.3 版本。用戶端還必須支援具備完全正向加密 (PFS) 功能的密碼套件，例如臨時 Diffie-Hellman (DHE) 或橢圓曲線臨時 Diffie-Hellman (ECDHE)。現代系統 (如 Java 7 和更新版本) 大多會支援這些模式。此外，請求必須使用存取金鑰 ID 和與 IAM 主體相關聯的私密存取金鑰來簽署。或者，您可以使用 [AWS Security Token Service](https://docs.aws.amazon.com/STS/latest/APIReference/Welcome.html) (AWS STS) 來產生暫時安全憑證來簽署請求。

 您也可以使用 DynamoDB 的虛擬私有雲端 (VPC) 端點，讓 VPC 中的 Amazon EC2 執行個體能夠使用其私有 IP 位址來存取 DynamoDB，卻不會暴露於公有網際網路。如需詳細資訊，請參閱[使用 Amazon VPC 端點來存取 DynamoDB](#vpc-endpoints-dynamodb)。

## 使用 Amazon VPC 端點來存取 DynamoDB
<a name="vpc-endpoints-dynamodb"></a>

基於安全考量，許多 AWS 客戶會在 Amazon Virtual Private Cloud 環境 (Amazon VPC) 中執行其應用程式。運用 Amazon VPC，您可以將 Amazon EC2 執行個體啟動到 Virtual Private Cloud 上，此 Virtual Private Cloud 與其他網路 (包括公有網際網路) 在邏輯上隔離。使用 Amazon VPC，您可以控制其 IP 位址範圍、子網路、路由表、網路閘道及安全設定。

**注意**  
如果您在 2013 年 12 月 4 日 AWS 帳戶 之後建立 ，則您已在每個 中擁有預設 VPC AWS 區域。預設的 VPC 已可供使用：您可以立即開始使用，不需執行任何其他設定步驟。  
如需詳細資訊，請參閱《*Amazon VPC 使用者指南*》中的[預設 VPC 和預設子網路](https://docs.aws.amazon.com/vpc/latest/userguide/default-vpc.html)。

若要存取公有網際網路，您的 VPC 必須擁有網際網路閘道，也即將 VPC 連線到網際網路的虛擬路由器。這可讓在 VPC 中的應用程式在 Amazon EC2 上執行，以便存取 Amazon DynamoDB 等網際網路資源。

根據預設，與 DynamoDB 之間的通訊會使用 HTTPS 協定，其使用 SSL/TLS 加密保護網路流量。下列圖示說明 VPC 中的 EC2 執行個體如何透過網際網路閘道而非 VPC 端點來存取 DynamoDB。

![\[工作流程圖顯示 EC2 執行個體透過路由器、網際網路閘道及網際網路來存取 DynamoDB。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/ddb-no-vpc-endpoint.png)


許多客戶對於透過公有的網際網路來傳送和接收資料，都會有合法的隱私與安全性疑慮。您可以使用虛擬私有網路 (VPN)，來轉傳通過您自己企業網路基礎設施的所有 DynamoDB 網路傳輸資料，以解決前述的問題。但是這個方法可能會帶來頻寬和可用性的挑戰。

DynamoDB 的 VPC 端點可以減輕這些挑戰的阻礙。DynamoDB 的 *VPC 端點*可讓 VPC 中的 Amazon EC2 執行個體使用私有 IP 位址來存取 DynamoDB，卻不需暴露於公有網際網路。您的 EC2 執行個體不需公有 IP 位址，您也不需要網際網路閘道、NAT 裝置或 VPC 中的虛擬私有閘道。您可以使用端點政策來控制對 DynamoDB 的存取。您的 VPC 與 AWS 服務之間的流量不會離開 Amazon 網路。

**注意**  
 即使您使用公有 IP 地址，在 中託管的執行個體和服務之間的所有 VPC 通訊 AWS 都會在 AWS 網路中保持私有。來自 AWS 網路上具有目的地 AWS 的網路的封包會保留在全球 AWS 網路上，但往返 AWS 中國區域的流量除外。

當您建立 DynamoDB 使用的 VPC 端點時，區域 (例如 *dynamodb.us-west-2.amazonaws.com*) 內傳送到 DynamoDB 端點的所有要求，都會轉傳到 Amazon 網路中的私有 DynamoDB 端點。您不需要修改 VPC 中在 EC2 執行個體上執行的應用程式。端點的名稱會保持不變，但 DynamoDB 的路由會完全在 Amazon 網路中，不會存取公有網際網路。

下圖顯示 VPC 中的 EC2 執行個體如何使用 VPC 端點來存取 DynamoDB。

![\[該工作流程圖僅顯示 EC2 執行個體透過路由器和 VPC 端點存取 DynamoDB。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/ddb-yes-vpc-endpoint.png)


如需詳細資訊，請參閱[教學課程：針對 DynamoDB 使用 VPC 端點](#vpc-endpoints-dynamodb-tutorial)。

### 共用 Amazon VPC 端點和 DynamoDB
<a name="vpc-endpoints-dynamodb-sharing"></a>

若要允許透過 VPC 子網路的閘道端點存取 DynamoDB 服務，您必須擁有該 VPC 子網路的擁有者帳戶許可。

 一旦 VPC 子網路的閘道端點取得 DynamoDB 存取權，任何具有該子網路存取權的 AWS 帳戶都可以使用 DynamoDB。這表示 VPC 子網路中的所有帳戶使用者，都可以使用他們擁有存取權的任何 DynamoDB 資料表。這包括與 VPC 子網路以外不同帳戶關聯的 DynamoDB 資料表。VPC 子網路擁有者仍可自行決定限制子網路中任何特定使用者透過閘道端點使用 DynamoDB 服務。

### 教學課程：針對 DynamoDB 使用 VPC 端點
<a name="vpc-endpoints-dynamodb-tutorial"></a>

此節會逐步說明如何設定並使用 DynamoDB 的 VPC 端點。

**Topics**
+ [步驟 1：啟動 Amazon EC2 執行個體](#vpc-endpoints-dynamodb-tutorial.launch-ec2-instance)
+ [步驟 2：設定您的 Amazon EC2 執行個體](#vpc-endpoints-dynamodb-tutorial.configure-ec2-instance)
+ [步驟 3：建立 DynamoDB 的 VPC 端點](#vpc-endpoints-dynamodb-tutorial.create-endpoint)
+ [步驟 4：(選用) 清除](#vpc-endpoints-dynamodb-tutorial.clean-up)

#### 步驟 1：啟動 Amazon EC2 執行個體
<a name="vpc-endpoints-dynamodb-tutorial.launch-ec2-instance"></a>

在此步驟中，您會在預設的 Amazon VPC 中啟動 Amazon EC2 執行個體。您可以接著為 DynamoDB 建立並使用 VPC 端點。

1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 選擇 **Launch Instance** (啟動執行個體) 並執行下列作業：

   步驟 1：選擇 Amazon Machine Image (AMI)
   + 在 AMI 清單的第一項上，前往 **Amazon Linux AMI** 並選擇 **Select (選取)**。

   步驟 2：選擇執行個體類型
   + 在執行個體類型清單的第一項上，選擇 **t2.micro**。
   + 選擇 **Next: Configure Instance Details (下一步：設定執行個體詳細資訊)**。

   步驟 3：設定執行個體詳細資訊
   + 前往 **Network (網路)**，然後選擇您的預設 VPC。

     選擇 **Next: Add Storage (下一步：新增儲存體)**。

   步驟 4：新增儲存體
   + 選擇 **Next: Tag Instance** (下一步：為執行個體新增標籤) 以跳過此步驟。

   步驟 5：將執行個體加上標籤
   + 選擇 **Next: Configure Security Group (下一步：設定安全群組)** 以跳過此步驟。

   步驟 6：設定安全群組
   + 選擇 **Select an existing security group** (選取現有的安全群組)。
   + 在安全群組清單中，選擇 **default** (預設)。這是您 VPC 的預設安全群組。
   + 選擇 **Next: Review and Launch** (下一步：檢閱和啟動)。

   步驟 7：檢閱執行個體啟動
   + 選擇**啟動**。

1. 在 **Select an existing key pair or create a new key pair** (選取現有的金鑰對或建立新的金鑰對) 視窗中，執行下列其中一項作業：
   + 如果您沒有 Amazon EC2 金鑰對，請選擇 **Create a new key pair** (建立新的金鑰對) 並依照指示進行。系統會要求您下載私有金鑰檔案 (*.pem* 檔案)，您之後登入 Amazon EC2 執行個體時會需要此檔案。
   + 若您已擁有 Amazon EC2 金鑰對，請前往 **Select a key pair** (選取金鑰對)，然後從清單中選擇您的金鑰對。您必須已具備可用的私有金鑰檔案 (*.pem* 檔案) 才能登入您的 Amazon EC2 執行個體。

1. 當您設定好金鑰對後，請選擇 **Launch Instances** (啟動執行個體)。

1. 返回 Amazon EC2 主控台首頁，然後選擇您啟動的執行個體。在下方窗格的 **Description** (描述) 標籤上，找到您執行個體的 **Public DNS** (公有 DNS)。例如：`ec2-00-00-00-00.us-east-1.compute.amazonaws.com`。

   請記下此公有 DNS 名稱，因為在此教學課程 ([步驟 2：設定您的 Amazon EC2 執行個體](#vpc-endpoints-dynamodb-tutorial.configure-ec2-instance)) 的下一個步驟中您會需要此名稱。

**注意**  
Amazon EC2 執行個體會需要幾分鐘的時間才會變成可用。在您繼續進行下一個步驟之前，請先確定 **Instance State** (執行個體狀態) 為 `running`，並已通過其所有 **Status Checks** (狀態檢查)。

#### 步驟 2：設定您的 Amazon EC2 執行個體
<a name="vpc-endpoints-dynamodb-tutorial.configure-ec2-instance"></a>

在 Amazon EC2 執行個體可用時，您將能夠登入該執行個體並準備第一次使用。

**注意**  
下列步驟假設您從執行 Linux 的電腦連線至 Amazon EC2 執行個體。如需其他連線方式，請參閱《Amazon EC2 使用者指南》中的[連線至 Linux 執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstances.html)。

1. 您需要允許 SSH 流量傳入 Amazon EC2 執行個體。若要執行此動作，您需要建立新的 EC2 安全群組，然後將安全群組指派給 EC2 執行個體。

   1. 在導覽窗格中，選擇 **Security Groups** (安全群組)。

   1. 選擇 **Create Security Group** (建立安全群組)。在 **Create Security Group** (建立安全群組) 視窗中，執行下列動作：
      + **Security group name** (安全群組名稱)：為您的安全群組輸入名稱。例如：`my-ssh-access`
      + **Description** (描述)：為安全群組輸入簡短描述。
      + **VPC**：請選擇預設 VPC。
      + 在 **Security group rules** (安全群組規則) 區段中，選擇 **Add Rule** (新增規則)，並執行下列動作：
        + **Type** (類型)：選擇 SSH。
        + **Source** (來源)：選擇 My IP (我的 IP)。

      當您滿意設定後，請選擇 **Create (建立)**。

   1. 在導覽窗格中，選擇**執行個體**。

   1. 選擇您在 [步驟 1：啟動 Amazon EC2 執行個體](#vpc-endpoints-dynamodb-tutorial.launch-ec2-instance) 中啟動的 Amazon EC2 執行個體。

   1. 選擇 **Actions** (動作) --> **Networking (聯網)** --> **Change Security Groups** (變更安全群組)。

   1. 在 **Change Security Groups** (變更安全群組) 下，選取您在前述步驟中建立的安全群組 (例如：`my-ssh-access`)。此外，還應選擇現有的 `default` 安全群組。完成設定後，請選擇 **Assign Security Groups** (指派安全群組)。

1. 使用 `ssh` 命令登入您的 Amazon EC2 執行個體，如下列範例所示。

   ```
   ssh -i my-keypair.pem ec2-user@public-dns-name
   ```

   您會需要指定您的私有金鑰檔案 (*.pem* 檔案) 和您執行個體的公有 DNS 名稱。(請參閱 [步驟 1：啟動 Amazon EC2 執行個體](#vpc-endpoints-dynamodb-tutorial.launch-ec2-instance))。

   登入 ID 為 `ec2-user`。不需要任何密碼。

1. 設定您的 AWS 登入資料，如下列範例所示。根據提示輸入您的 AWS 存取金鑰 ID、秘密金鑰和預設區域名稱。

   ```
   aws configure
   ```

   ```
   AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
   AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
   Default region name [None]: us-east-1
   Default output format [None]:
   ```

您現在可以開始建立 DynamoDB 的 VPC 端點。

#### 步驟 3：建立 DynamoDB 的 VPC 端點
<a name="vpc-endpoints-dynamodb-tutorial.create-endpoint"></a>

在此步驟中，您要建立 DynamoDB 的 VPC 端點並對其進行測試，確保其可以正常運作。

1. 在開始之前，請確認您可以使用 DynamoDB 的公有端點來與 DynamoDB 通訊。

   ```
   aws dynamodb list-tables
   ```

   輸出會顯示您目前擁有的 DynamoDB 資料表清單。(如果沒有任何資料表，清單將是空白。)

1. 確認 DynamoDB 是在目前 AWS 區域中建立 VPC 端點的可用服務。(命令會以粗體文字顯示，後面接著輸出範例。)

   ```
   aws ec2 describe-vpc-endpoint-services
   ```

   ```
   {
       "ServiceNames": [
           "com.amazonaws.us-east-1.s3",
           "com.amazonaws.us-east-1.dynamodb"
       ]
   }
   ```

   在範例輸出中，DynamoDB 是其中一個可用的服務，因此您可以繼續為其建立 VPC 端點。

1. 確定您的 VPC 識別碼。

   ```
   aws ec2 describe-vpcs
   ```

   ```
   {
       "Vpcs": [
           {
               "VpcId": "vpc-0bbc736e", 
               "InstanceTenancy": "default", 
               "State": "available", 
               "DhcpOptionsId": "dopt-8454b7e1", 
               "CidrBlock": "172.31.0.0/16", 
               "IsDefault": true
           }
       ]
   }
   ```

   在範例輸出中，VPC ID 為 `vpc-0bbc736e`。

1. 建立 VPC 端點。對於 `--vpc-id` 參數，請指定上一個步驟的 VPC ID。使用 `--route-table-ids` 參數，將端點與路由表相關聯。

   ```
   aws ec2 create-vpc-endpoint --vpc-id vpc-0bbc736e --service-name com.amazonaws.us-east-1.dynamodb --route-table-ids rtb-11aa22bb
   ```

   ```
   {
       "VpcEndpoint": {
           "PolicyDocument": "{\"Version\":\"2008-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"*\",\"Resource\":\"*\"}]}", 
           "VpcId": "vpc-0bbc736e", 
           "State": "available", 
           "ServiceName": "com.amazonaws.us-east-1.dynamodb", 
           "RouteTableIds": [
               "rtb-11aa22bb"
           ],
           "VpcEndpointId": "vpce-9b15e2f2", 
           "CreationTimestamp": "2017-07-26T22:00:14Z"
       }
   }
   ```

1. 確認您可以透過 VPC 端點存取 DynamoDB。

   ```
   aws dynamodb list-tables
   ```

   如果需要，您可以為 DynamoDB 嘗試其他一些 AWS CLI 命令。如需詳細資訊，請參閱《[AWS CLI 命令參考](https://docs.aws.amazon.com/cli/latest/reference/)》。

#### 步驟 4：(選用) 清除
<a name="vpc-endpoints-dynamodb-tutorial.clean-up"></a>

如果您要刪除自己在此教學課程中建立的資源，請按下列步驟執行：

**若要移除 DynamoDB 的 VPC 端點**

1. 登入 Amazon EC2 執行個體。

1. 決定 VPC 端點 ID。

   ```
   aws ec2 describe-vpc-endpoints
   ```

   ```
   {
       "VpcEndpoint": {
           "PolicyDocument": "{\"Version\":\"2008-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"*\",\"Resource\":\"*\"}]}", 
           "VpcId": "vpc-0bbc736e", 
           "State": "available", 
           "ServiceName": "com.amazonaws.us-east-1.dynamodb", 
           "RouteTableIds": [], 
           "VpcEndpointId": "vpce-9b15e2f2", 
           "CreationTimestamp": "2017-07-26T22:00:14Z"
       }
   }
   ```

   在範例輸出中，VPC 端點 ID 為 `vpce-9b15e2f2`。

1. 刪除 VPC 端點。

   ```
   aws ec2 delete-vpc-endpoints --vpc-endpoint-ids vpce-9b15e2f2
   ```

   ```
   {
       "Unsuccessful": []
   }
   ```

   空白陣列 `[]` 表示成功 (沒有未成功的請求)。

**若要終止 Amazon EC2 執行個體**

1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 在導覽窗格中，選擇**執行個體**。

1. 選擇 Amazon EC2 執行個體。

1. 依序選擇 **Actions** (動作)、**Instance State** (執行個體狀態) 和 **Terminate** (終止)。

1. 在確認視窗中，請選擇 **Yes, Terminate** (是，終止)。

# AWS PrivateLink 適用於 DynamoDB
<a name="privatelink-interface-endpoints"></a>

使用 AWS PrivateLink for DynamoDB，您可以在虛擬私有雲端 *(Amazon VPC*) 中佈建介面 Amazon VPC 端點 （介面端點）。這些端點可直接透過 VPN 和內部部署的應用程式存取 Direct Connect，或 AWS 區域 是透過 [Amazon VPC 對等](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html)互連的不同應用程式存取。使用 AWS PrivateLink 與介面端點，您可以簡化應用程式至 DynamoDB 的私有網路連線。

位於 VPC 中的應用程式無需公有 IP 位址，即可透過 VPC 介面端點與 DynamoDB 進行操作通訊。介面端點由一或多個彈性網路介面 (ENI) 所組成，這些介面會從 Amazon VPC 的子網路中指派私有 IP 位址。透過介面端點傳送至 DynamoDB 的請求會保留在 Amazon 網路內。您也可以透過 AWS Direct Connect 或 AWS Virtual Private Network ()，從內部部署應用程式存取 Amazon VPC 中的介面端點Site-to-Site VPN。如需如何將 Amazon VPC 與內部部署網路連線的詳細資訊，請參閱《[Direct Connect 使用者指南](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html)》與《[AWS Site-to-Site VPN 使用者指南](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)》。

如需介面端點的一般資訊，請參閱[《 指南》中的介面 Amazon VPC 端點 (AWS PrivateLink)](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html)。Amazon DynamoDB Streams 端點 AWS PrivateLink 也支援 。 *AWS PrivateLink *如需詳細資訊，請參閱[AWS PrivateLink 適用於 DynamoDB Streams](privatelink-streams.md)。

**Topics**
+ [適用於 Amazon DynamoDB 的 Amazon VPC 端點類型](#types-of-vpc-endpoints-for-ddb)
+ [使用 AWS PrivateLink for Amazon DynamoDB 時的考量事項](#privatelink-considerations)
+ [建立 Amazon VPC 端點](#ddb-creating-vpc)
+ [存取 Amazon DynamoDB 介面端點](#accessing-ddb-interface-endpoints)
+ [從 DynamoDB 介面端點存取 DynamoDB 資料表及控制 API 操作](#accessing-tables-apis-from-interface-endpoints)
+ [更新內部部署 DNS 組態](#updating-on-premises-dns-config)
+ [為 DynamoDB 建立 Amazon VPC 端點政策](#creating-vpc-endpoint-policy)
+ [搭配 AWS 管理主控台 私有存取使用 DynamoDB 端點](#ddb-endpoints-private-access)
+ [AWS PrivateLink 適用於 DynamoDB Streams](privatelink-streams.md)
+ [使用 AWS PrivateLink for DynamoDB Accelerator (DAX)](dax-private-link.md)

## 適用於 Amazon DynamoDB 的 Amazon VPC 端點類型
<a name="types-of-vpc-endpoints-for-ddb"></a>

您可以使用兩種類型的 Amazon VPC 端點來存取 Amazon DynamoDB：*閘道端點*和*介面端點* （使用 AWS PrivateLink)。*閘道端點*是您在路由表中指定的閘道，可透過 AWS 網路從 Amazon VPC 存取 DynamoDB。*介面端點*使用私有 IP 地址，透過使用 Amazon VPC 對等互連或 ，將請求從 Amazon VPC 內部、內部部署或另一個 Amazon VPC 路由至 DynamoDB， AWS 區域 藉此擴充閘道端點的功能 AWS Transit Gateway。如需詳細資訊，請參閱[什麼是 Amazon VPC 對等互連？](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html)和 [ Transit Gateway 與 Amazon VPC 對等互連](https://docs.aws.amazon.com/whitepapers/latest/building-scalable-secure-multi-vpc-network-infrastructure/transit-gateway-vs-vpc-peering.html)。

介面端點與閘道端點相容。若您的 Amazon VPC 中已有現有的閘道端點，則可在同一個 Amazon VPC 中同時使用這兩種類型的端點。


|  DynamoDB 的閘道端點  |  DynamoDB 的介面端點  | 
| --- | --- | 
|  在這兩種情況下，您的網路流量都會保留在 AWS 網路上。  | 
|  使用 Amazon DynamoDB 公有 IP 位址  |  使用 Amazon VPC 中的私有 IP 位址以存取 Amazon DynamoDB  | 
|  不允許從內部部署存取  |  允許從內部部署存取  | 
|  不允許從另一個 存取 AWS 區域  |   AWS 區域 使用 Amazon VPC 對等互連或 允許從另一個 中的 Amazon VPC 端點存取 AWS Transit Gateway  | 
|  不計費  |  計費  | 

如需有關閘道端點的詳細資訊，請參閱《*AWS PrivateLink 指南*》中的[閘道 Amazon VPC 端點](https://docs.aws.amazon.com//vpc/latest/privatelink/vpce-gateway.html)。

## 使用 AWS PrivateLink for Amazon DynamoDB 時的考量事項
<a name="privatelink-considerations"></a>

Amazon VPC 考量適用於 AWS PrivateLink Amazon DynamoDB。如需詳細資訊，請參閱《AWS PrivateLink 指南》**中的[介面端點考量事項](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html#vpce-interface-limitations)和 [AWS PrivateLink 配額](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-limits-endpoints.html)。此外，適用下列限制。

AWS PrivateLink for Amazon DynamoDB 不支援下列項目：
+ Transport Layer Security (TLS) 1.1
+ 私有與混合網域名稱系統 (DNS) 服務

**重要**  
請勿建立私有託管區域來覆寫 DynamoDB 端點 DNS 名稱 （例如 `dynamodb.region.amazonaws.com`或 `*.region.amazonaws.com`)，以將流量路由到您的介面端點。DynamoDB DNS 組態可能會隨著時間而變更。  
 自訂 DNS 覆寫與這些變更不相容，可能會導致請求意外透過公有 IP 地址路由，而不是您的介面端點。  
 若要透過 存取 DynamoDB AWS PrivateLink，請將您的用戶端設定為直接使用 Amazon VPC 端點 URL （例如 `https://vpce-1a2b3c4d-5e6f.dynamodb.region.vpce.amazonaws.com`)。

您啟用的每個 AWS PrivateLink 端點每秒最多可以提交 50，000 個請求。

**注意**  
 AWS PrivateLink 端點的網路連線逾時不在 DynamoDB 錯誤回應範圍內，需要由連線至 PrivateLink 端點的應用程式妥善處理。

## 建立 Amazon VPC 端點
<a name="ddb-creating-vpc"></a>

若要建立 Amazon VPC 介面端點，請參閱《AWS PrivateLink 指南》**中的[建立 Amazon VPC 端點](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint-aws)。

## 存取 Amazon DynamoDB 介面端點
<a name="accessing-ddb-interface-endpoints"></a>

建立介面端點時，DynamoDB 會產生兩種類型的專用 DynamoDB DNS 名稱：*區域*和*可用區*。
+ *區域* DNS 名稱在其名稱`vpce.amazonaws.com`中包含唯一的 Amazon VPC 端點 ID、服務識別符 AWS 區域、 和 。例如，對於 Amazon VPC 端點 ID `vpce-1a2b3c4d`，產生的 DNS 名稱可能類似於 `vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com`。
+ *地區* DNS 名稱包含可用區域，例如 `vpce-1a2b3c4d-5e6f-us-east-1a.dynamodb.us-east-1.vpce.amazonaws.com`。如果您的架構可隔離可用區域，則可以使用此選項。例如，您可以將其用於故障遏止或降低區域資料傳輸成本。

**注意**  
為了獲得最佳可靠性，建議您將服務部署到至少三個可用區域。

## 從 DynamoDB 介面端點存取 DynamoDB 資料表及控制 API 操作
<a name="accessing-tables-apis-from-interface-endpoints"></a>

您可以使用 AWS CLI AWS SDKs來存取 DynamoDB 資料表，並透過 DynamoDB 介面端點控制 API 操作。

### AWS CLI 範例
<a name="privatelink-ddb-aws-cli-examples"></a>

若要透過 AWS CLI 命令中的 DynamoDB 介面端點存取 DynamoDB 資料表或 DynamoDB 控制 API 操作，請使用 `--region`和 `--endpoint-url` 參數。 DynamoDB 

**範例：建立 VPC 端點**

```
aws ec2 create-vpc-endpoint \
--region us-east-1 \
--service-name com.amazonaws.us-east-1.dynamodb \
--vpc-id client-vpc-id \
--subnet-ids client-subnet-id \
--vpc-endpoint-type Interface \
--security-group-ids client-sg-id
```

**範例：修改 VPC 端點**

```
aws ec2 modify-vpc-endpoint \
--region us-east-1 \
--vpc-endpoint-id client-vpc-endpoint-id \
--policy-document policy-document \ #example optional parameter
--add-security-group-ids security-group-ids \ #example optional parameter 
# any additional parameters needed, see Privatelink documentation for more details
```

**範例：使用端點 URL 列出資料表**

在下列範例中，請以您自己的資訊取代區域 `us-east-1` 和 VPC 端點 ID `vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com` 的 DNS 名稱。

```
aws dynamodb --region us-east-1 --endpoint https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com list-tables
```

### AWS 開發套件範例
<a name="privatelink-ddb-aws-sdk-examples"></a>

若要在使用 AWS SDKs 時透過 DynamoDB 介面端點存取 DynamoDB 資料表或 DynamoDB 控制 API 操作，請將 SDK SDKs 更新至最新版本。 DynamoDB 接著，設定您的用戶端使用端點 URL，透過 DynamoDB 介面端點來存取資料表或 DynamoDB 控制 API 操作。

------
#### [ SDK for Python (Boto3) ]

**範例：使用端點 URL 存取 DynamoDB 資料表**  
在下列範例中，將區域 `us-east-1` 和 VPC 端點 ID `https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com` 取代為您的資訊。

```
ddb_client = session.client(
service_name='dynamodb',
region_name='us-east-1',
endpoint_url='https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com'
)
```

------
#### [ SDK for Java 1.x ]

**範例：使用端點 URL 存取 DynamoDB 資料表**  
在下列範例中，將區域 `us-east-1` 和 VPC 端點 ID `https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com` 取代為您的資訊。

```
//client build with endpoint config  
final AmazonDynamoDB dynamodb = AmazonDynamoDBClientBuilder.standard().withEndpointConfiguration(
        new AwsClientBuilder.EndpointConfiguration(
                "https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com",
                Regions.DEFAULT_REGION.getName()
        )
).build();
```

------
#### [ SDK for Java 2.x ]

**範例：使用端點 URL 存取 DynamoDB 資料表**  
在下列範例中，將區域 us-east-1 和 VPC 端點 ID https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com 取代為您的資訊。

```
Region region = Region.US_EAST_1;
dynamoDbClient = DynamoDbClient.builder().region(region)
.endpointOverride(URI.create("https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com"))
.build()
```

------

## 更新內部部署 DNS 組態
<a name="updating-on-premises-dns-config"></a>

 當使用端點特定的 DNS 名稱來存取 DynamoDB 介面端點時，無需更新內部部署 DNS 解析器。您可以從公有 DynamoDB DNS 網域中，使用介面端點的私有 IP 位址解析端點特定的 DNS 名稱。

### 在 Amazon VPC 中，使用介面端點即可存取 DynamoDB，無需閘道端點或網際網路閘道。
<a name="using-interface-endpoints"></a>

您的 Amazon VPC 中的介面端點可透過 Amazon 網路，將 VPC 內及內部部署應用程式路由至 DynamoDB，如下圖所示。

![\[資料流程圖顯示了內部部署與 VPC 內應用程式如何使用介面端點和 AWS PrivateLink存取 DynamoDB。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/PrivateLink-interfaceEndpoints.png)


此圖展示了以下要點：
+ 您的內部部署網路會使用 Direct Connect 或 Site-to-Site VPN 連線到 Amazon VPC A。
+ 您的內部部署及 VPC A 中的應用程式使用端點特定的 DNS 名稱，透過 DynamoDB 介面端點存取 DynamoDB。
+ 內部部署應用程式會透過 Direct Connect （或 Site-to-Site VPN) 將資料傳送至 Amazon VPC 中的介面端點。 會透過 AWS 網路將資料從介面端點 AWS PrivateLink 移至 DynamoDB。
+ Amazon VPC 應用程式也會將流量傳送至介面端點。 AWS PrivateLink 會透過 AWS 網路將資料從介面端點移至 DynamoDB。

### 在同一個 Amazon VPC 中，同時使用閘道端點與介面端點來存取 DynamoDB。
<a name="using-gateway-and-interface-endpoints"></a>

您可以在同一個 Amazon VPC 中建立介面端點，並保留現有的閘道端點，如下圖所示。採用此方式後，VPC 內應用程式可繼續透過閘道端點存取 DynamoDB，且無需付費。之後，僅內部部署應用程式會使用介面端點存取 DynamoDB。若要這樣存取，必須更新內部部署應用程式以使用 DynamoDB 的端點特定 DNS 名稱。

![\[資料流程圖顯示如何同時使用閘道端點與介面端點存取 DynamoDB。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/PL-Image2-InterfaceAndGatewayEP.png)


此圖展示了以下要點：
+ 內部部署應用程式會使用端點特定的 DNS 名稱，透過 Direct Connect （或 Site-to-Site VPN) 將資料傳送至 Amazon VPC 內的介面端點。 會透過 AWS 網路將資料從介面端點 AWS PrivateLink 移至 DynamoDB。
+ 使用預設的區域 DynamoDB 名稱，Amazon VPC 內應用程式會將資料傳送至透過 AWS 網路連線至 DynamoDB 的閘道端點。

如需閘道端點的詳細資訊，請參閱《*Amazon VPC 使用者指南*》中的[閘道 VPC 端點](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-gateway.html)。

## 為 DynamoDB 建立 Amazon VPC 端點政策
<a name="creating-vpc-endpoint-policy"></a>

您可以將端點政策附加至 Amazon VPC 端點，以控制對 DynamoDB 的存取。此政策會指定下列資訊：
+ 可執行動作的 AWS Identity and Access Management (IAM) 委託人 
+ 可執行的動作 
+ 可在其中執行動作的資源 

**Topics**
+ [範例：限制從 Amazon VPC 端點對特定資料表的存取](#privatelink-example-restrict-access-to-bucket)

### 範例：限制從 Amazon VPC 端點對特定資料表的存取
<a name="privatelink-example-restrict-access-to-bucket"></a>

您可以建立端點政策，以限制僅能存取特定的 DynamoDB 資料表。如果您在 Amazon VPC AWS 服務 中有使用資料表的其他 ，這種類型的政策很有用。下列資料表政策僅允許存取 `DOC-EXAMPLE-TABLE`。若要使用此端點政策，請將 `DOC-EXAMPLE-TABLE` 取代為您的資料表名稱。

------
#### [ JSON ]

****  

```
{
"Version":"2012-10-17",		 	 	 
  "Id": "Policy1216114807515",
  "Statement": [
    { "Sid": "Access-to-specific-table-only",
      "Principal": "*",
      "Action": [
        "dynamodb:GetItem",
        "dynamodb:PutItem"
      ],
      "Effect": "Allow",
      "Resource": ["arn:aws:dynamodb:us-east-1:111122223333:table/DOC-EXAMPLE-TABLE",
                   "arn:aws:dynamodb:us-east-1:111122223333:table/DOC-EXAMPLE-TABLE/*"]
    }
  ]
}
```

------

## 搭配 AWS 管理主控台 私有存取使用 DynamoDB 端點
<a name="ddb-endpoints-private-access"></a>

在 [AWS 管理主控台 私有存取](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/console-private-access.html)中使用 VPC 端點搭配 [DynamoDB 主控台](https://console.aws.amazon.com/dynamodb)時，您必須設定 DynamoDB 與 DynamoDB Streams 的 DNS 組態。

若要將 DynamoDB 設定為可在 AWS 管理主控台 私有存取中存取，您必須建立下列兩個 VPC 端點：
+ `com.amazonaws.<region>.dynamodb`
+ `com.amazonaws.<region>.dynamodb-streams`

建立 VPC 端點時，請前往 Route 53 主控台，使用區域端點 `dynamodb.us-east-1.amazonaws.com` 為 DynamoDB 建立私有託管區域。

在私有託管區域中建立以下兩筆別名記錄：
+ `dynamodb.<region>.amazonaws.com`：將流量導向至 VPC 端點 `com.amazonaws.<region>.dynamodb`。
+ `streams.dynamodb.<region>.amazonaws.com`：將流量導向至 VPC 端點 `com.amazonaws.<region>.dynamodb-streams`。

# AWS PrivateLink 適用於 DynamoDB Streams
<a name="privatelink-streams"></a>

使用 AWS PrivateLink for Amazon DynamoDB Streams，您可以在虛擬私有雲端 (Amazon VPC) 中佈建介面 Amazon VPC 端點 （介面端點）。這些端點可直接透過 VPN 和內部部署的應用程式存取 Direct Connect，或 AWS 區域 是透過 Amazon VPC 對等互連的不同應用程式存取。使用 AWS PrivateLink 和 介面端點，您可以簡化從應用程式到 DynamoDB Streams 的私有網路連線。

位於 Amazon VPC 中的應用程式無需公有 IP 位址，即可透過 Amazon VPC 介面端點執行 DynamoDB Streams 操作。介面端點由一或多個彈性網路介面 (ENI) 所組成，這些介面會從 Amazon VPC 的子網路中指派私有 IP 位址。透過介面端點傳送至 DynamoDB Streams 的請求，會保留在 Amazon 網路中。您也可以透過 Direct Connect 或 AWS Virtual Private Network (AWS VPN)，從內部部署應用程式存取 Amazon VPC 中的介面端點。如需如何將 AWS Virtual Private Network 連線至內部部署網路的詳細資訊，請參閱 [https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html)和 [https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)。

如需介面端點的一般資訊，請參閱 [Amazon VPC 介面端點](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html) (AWS PrivateLink)。

**注意**  
DynamoDB Streams 僅支援介面端點。不支援閘道端點。

**Topics**
+ [使用 AWS PrivateLink for Amazon DynamoDB Streams 時的考量事項](#privatelink-streams-considerations)
+ [建立 Amazon VPC 端點](#privatelink-streams-vpc-endpoint)
+ [存取 Amazon DynamoDB Streams 介面端點](#privatelink-streams-accessing-ddb-interface-endpoints)
+ [從 DynamoDB Streams 介面端點存取 DynamoDB Streams API 操作](#privatelink-streams-accessing-api-operations-from-interface-endpoints)
+ [AWS 開發套件範例](#privatelink-streams-aws-sdk-examples)
+ [為 DynamoDB Streams 建立 Amazon VPC 端點政策](#privatelink-streams-creating-vpc-endpoint-policy)
+ [搭配 AWS 管理主控台 私有存取使用 DynamoDB 端點](#ddb-streams-endpoints-private-access)

## 使用 AWS PrivateLink for Amazon DynamoDB Streams 時的考量事項
<a name="privatelink-streams-considerations"></a>

Amazon VPC 考量適用於 AWS PrivateLink Amazon DynamoDB Streams。如需詳細資訊，請參閱[介面端點考量事項](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html)與 [AWS PrivateLink 配額](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-limits-endpoints.html)。適用以下限制。

AWS PrivateLink for Amazon DynamoDB Streams 不支援下列項目：
+ Transport Layer Security (TLS) 1.1
+ 私有與混合網域名稱系統 (DNS) 服務

**重要**  
請勿建立私有託管區域來覆寫 DynamoDB Streams 端點 DNS 名稱，以將流量路由到您的介面端點。DynamoDB DNS 組態可能會隨著時間而變更，而自訂 DNS 覆寫可能會導致請求意外透過公有 IP 地址路由，而不是您的介面端點。  
 若要透過 存取 DynamoDB Streams AWS PrivateLink，請將您的用戶端設定為直接使用 Amazon VPC 端點 URL （例如 `https://vpce-1a2b3c4d-5e6f.streams.dynamodb.region.vpce.amazonaws.com`)。

**注意**  
 AWS PrivateLink 端點的網路連線逾時不在 DynamoDB Streams 錯誤回應範圍內，需要由連線至 AWS PrivateLink 端點的應用程式妥善處理。

## 建立 Amazon VPC 端點
<a name="privatelink-streams-vpc-endpoint"></a>

若要建立 Amazon VPC 介面端點，請參閱 *AWS PrivateLink 指南*中的[建立 Amazon VPC 端點](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint-aws)。

## 存取 Amazon DynamoDB Streams 介面端點
<a name="privatelink-streams-accessing-ddb-interface-endpoints"></a>

建立介面端點時，DynamoDB 會產生兩種類型的專用 DynamoDB Streams DNS 名稱：*區域*和*可用區*。
+ *區域* DNS 名稱在其名稱`vpce.amazonaws.com`中包含唯一的 Amazon VPC 端點 ID、服務識別符 AWS 區域、 和 。例如，對於 Amazon VPC 端點 ID `vpce-1a2b3c4d`，產生的 DNS 名稱可能類似於 `vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com`。
+ *地區* DNS 名稱包含可用區域，例如 `vpce-1a2b3c4d-5e6f-us-east-1a.streams.dynamodb.us-east-1.vpce.amazonaws.com`。如果您的架構可隔離可用區域，則可以使用此選項。例如，您可以將其用於故障遏止或降低區域資料傳輸成本。

## 從 DynamoDB Streams 介面端點存取 DynamoDB Streams API 操作
<a name="privatelink-streams-accessing-api-operations-from-interface-endpoints"></a>

您可以使用 AWS CLI AWS SDKs 透過 DynamoDB Streams 介面端點存取 DynamoDB Streams API 操作。

### AWS CLI 範例
<a name="privatelink-streams-aws-cli-examples"></a>

若要透過 AWS CLI 命令中的 DynamoDB Streams 介面端點存取 DynamoDB Streams 或 API 操作，請使用 `--region`和 `--endpoint-url` 參數。

**範例：建立 VPC 端點**

```
aws ec2 create-vpc-endpoint \
--region us-east-1 \
--service-name com.amazonaws.us-east-1.dynamodb-streams \
--vpc-id client-vpc-id \
--subnet-ids client-subnet-id \
--vpc-endpoint-type Interface \
--security-group-ids client-sg-id
```

**範例：修改 VPC 端點**

```
aws ec2 modify-vpc-endpoint \
--region us-east-1 \
--vpc-endpoint-id client-vpc-endpoint-id \
--policy-document policy-document \ #example optional parameter
--add-security-group-ids security-group-ids \ #example optional parameter 
# any additional parameters needed, see Privatelink documentation for more details
```

**範例：使用端點 URL 列出串流**

在下列範例中，請以您自己的資訊取代區域 `us-east-1` 和 VPC 端點 ID `vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com` 的 DNS 名稱。

```
aws dynamodbstreams --region us-east-1 —endpoint https://vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com list-streams
```

## AWS 開發套件範例
<a name="privatelink-streams-aws-sdk-examples"></a>

若要在使用 AWS SDK 時，透過 DynamoDB Streams 介面端點存取 Amazon DynamoDB Streams API 操作，請將 SDK 更新至最新版本。然後，將用戶端設定為透過 DynamoDB Streams 介面端點，使用 DynamoDB Streams API 操作的端點 URL。

------
#### [ SDK for Python (Boto3) ]

**範例：使用端點 URL 存取 DynamoDB 串流**  
在下列範例中，將區域 `us-east-1` 和 VPC 端點 ID `https://vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com` 取代為您的資訊。

```
ddb_streams_client = session.client(
service_name='dynamodbstreams',
region_name='us-east-1',
endpoint_url='https://vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com'
)
```

------
#### [ SDK for Java 1.x ]

**範例：使用端點 URL 存取 DynamoDB 串流**  
在下列範例中，將區域 `us-east-1` 和 VPC 端點 ID `https://vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com` 取代為您的資訊。

```
//client build with endpoint config  
final AmazonDynamoDBStreams dynamodbstreams = AmazonDynamoDBStreamsClientBuilder.standard().withEndpointConfiguration(
        new AwsClientBuilder.EndpointConfiguration(
                "https://vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com",
                Regions.DEFAULT_REGION.getName()
        )
).build();
```

------
#### [ SDK for Java 2.x ]

**範例：使用端點 URL 存取 DynamoDB 串流**  
在下列範例中，將區域 `us-east-1` 和 VPC 端點 ID `https://vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com` 取代為您的資訊。

```
Region region = Region.US_EAST_1;
dynamoDbStreamsClient = DynamoDbStreamsClient.builder().region(region)
.endpointOverride(URI.create("https://vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com"))
.build()
```

------

## 為 DynamoDB Streams 建立 Amazon VPC 端點政策
<a name="privatelink-streams-creating-vpc-endpoint-policy"></a>

您可以將端點政策附加至 Amazon VPC 端點，以控制對 DynamoDB Streams 的存取。此政策會指定下列資訊：
+ 可執行動作的 AWS Identity and Access Management (IAM) 委託人 
+ 可執行的動作 
+ 可在其中執行動作的資源 

**Topics**
+ [範例：限制從 Amazon VPC 端點存取特定串流](#privatelink-streams-example-restrict-access-to-bucket)

### 範例：限制從 Amazon VPC 端點存取特定串流
<a name="privatelink-streams-example-restrict-access-to-bucket"></a>

您可以建立端點政策，以限制僅存取特定的 DynamoDB Streams。如果您的 Amazon VPC AWS 服務 中有使用 DynamoDB Streams 的其他 ，這種類型的政策很有用。下列串流政策限制僅能存取附加至 `DOC-EXAMPLE-TABLE` 的串流 `2025-02-20T11:22:33.444`。若要使用此端點政策，請將 `DOC-EXAMPLE-TABLE` 取代為資料表名稱，並將 `2025-02-20T11:22:33.444` 取代為串流標籤。

------
#### [ JSON ]

****  

```
{
"Version":"2012-10-17",		 	 	 
  "Id": "Policy1216114807515",
  "Statement": [
    { "Sid": "Access-to-specific-stream-only",
      "Principal": "*",
      "Action": [
        "dynamodb:DescribeStream",
        "dynamodb:GetRecords"
      ],
      "Effect": "Allow",
      "Resource": ["arn:aws:dynamodb:us-east-1:111122223333:table/table-name/stream/2025-02-20T11:22:33.444"]
    }
  ]
}
```

------

**注意**  
DynamoDB Streams 不支援閘道端點。

## 搭配 AWS 管理主控台 私有存取使用 DynamoDB 端點
<a name="ddb-streams-endpoints-private-access"></a>

在 [AWS 管理主控台 私有存取](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/console-private-access.html)中使用 VPC 端點搭配 [DynamoDB 主控台](https://console.aws.amazon.com/dynamodb)時，您必須設定 DynamoDB 與 DynamoDB Streams 的 DNS 組態。

若要將 DynamoDB 設定為可在 AWS 管理主控台 私有存取中存取，您必須建立下列兩個 VPC 端點：
+ `com.amazonaws.<region>.dynamodb`
+ `com.amazonaws.<region>.dynamodb-streams`

建立 VPC 端點時，請前往 Route 53 主控台，使用區域端點 `dynamodb.us-east-1.amazonaws.com` 為 DynamoDB 建立私有託管區域。

在私有託管區域中建立以下兩筆別名記錄：
+ `dynamodb.<region>.amazonaws.com`：將流量導向至 VPC 端點 `com.amazonaws.<region>.dynamodb`。
+ `streams.dynamodb.<region>.amazonaws.com`：將流量導向至 VPC 端點 `com.amazonaws.<region>.dynamodb-streams`。

# 使用 AWS PrivateLink for DynamoDB Accelerator (DAX)
<a name="dax-private-link"></a>

AWS PrivateLink for DynamoDB Accelerator (DAX) 可讓您`DeleteCluster`透過虛擬私有雲端 (VPC) 中的私有 IP 地址，安全地存取 DAX 管理 APIs`CreateCluster`，例如 `DescribeClusters`、 和 。此功能可讓您從應用程式私下存取 DAX 服務，而無需向公有網際網路公開流量。

DAX PrivateLink 支援雙堆疊端點 (`dax.{region}.api.aws`)，同時啟用 IPv4 和 IPv6 連線。使用 AWS PrivateLink for DAX，客戶可以使用私有 DNS 名稱存取服務。雙堆疊端點支援可確保透明連線，同時維護網路隱私權。這可讓您透過公有網際網路和 VPC 端點存取 DAX，而無需對 SDK 組態進行任何變更。

## 使用 AWS PrivateLink for DynamoDB Accelerator (DAX) 時的考量事項
<a name="dax-privatelink-considerations"></a>

實作 AWS PrivateLink DynamoDB Accelerator (DAX) 時，必須考量幾項重要考量。

在您設定 DAX 的介面端點之前，請考慮下列事項：
+ DAX 介面端點僅支援存取相同 內的 DAX APIs AWS 區域。您無法使用介面端點來存取其他 區域中的 DAX APIs。
+ 若要 AWS 管理主控台 私下存取 以進行 DAX 管理，您可能需要為 `com.amazonaws.region.console`和相關服務等服務建立額外的 VPC 端點。
+ 您需要支付建立和使用界面端點至 DAX 的費用。如需定價資訊，請參閱 [AWS PrivateLink 定價](https://aws.amazon.com/vpc/pricing/)。

## AWS PrivateLink 如何使用 DAX
<a name="dax-privatelink-how-it-works"></a>

當您為 DAX 建立介面端點時：

1. AWS 在您為介面端點啟用的每個子網路中建立端點網路介面。

1. 這些是請求者管理的網路介面，可做為目的地為 DAX 之流量的進入點。

1. 然後，您可以透過 VPC 中的私有 IP 地址存取 DAX。

1. 此架構可讓您使用 VPC 安全群組來管理對端點的存取。

1. 應用程式可以透過 VPC 內各自的界面端點存取 DynamoDB 和 DAX，同時允許內部部署應用程式透過 Direct Connect 或 VPN 連接。

1. 這可在這兩個服務之間提供一致的連線模式、簡化架構，並透過將流量保持在 AWS 網路中來改善安全性。

## 建立 DAX 的界面端點
<a name="dax-privatelink-creating-endpoints"></a>

您可以使用 CloudFormation、 AWS 管理主控台 AWS SDK 或 AWS API 建立介面端點以連線至 DAX。

**使用主控台建立 DAX 的介面端點**

1. 導覽至 Amazon VPC 主控台，網址為 https：//[https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)。

1. 在導覽窗格中選擇**端點**。

1. 選擇**建立端點**。

1. 針對**服務類別**，選擇 **AWS 服務** ，針對**服務名稱**選擇 ，搜尋並選擇 `com.amazonaws.region.dax`。

1. 對於 **VPC**，選取您要從中存取 DAX 的 VPC，對於**子網路**，選取 AWS 將在其中建立端點網路介面的子網路。

1. 針對**安全群組**，選取或建立要與端點網路介面建立關聯的安全群組。

1. 對於**政策**，保留預設**的完整存取**或視需要自訂。

1. 選取**啟用 DNS 名稱**以啟用端點的私有 DNS。保持啟用私有 DNS 名稱，以防止 SDK 組態的變更。啟用時，您的應用程式可以繼續使用標準服務 DNS 名稱 （例如：`dax.region.amazonaws.com`)。 會在 VPC 中 AWS 建立私有託管區域，將此名稱解析為端點的私有 IP 地址。
**注意**  
如有需要，請使用區域 DNS 名稱。不建議使用區域 DNS 名稱。此外，從 3 個或多個AZs選取子網路，以確保透過 PrivateLink 獲得最大的可用性。

1. 選擇**建立端點**。

**使用 建立 DAX 的介面端點 AWS CLI**  
使用 `create-vpc-endpoint`命令，並將 `vpc-endpoint-type` 參數設定為 ，`Interface`並將 `service-name` 參數設定為 `com.amazonaws.region.dax`。

```
aws ec2 create-vpc-endpoint \
    --vpc-id vpc-ec43eb89 \
    --vpc-endpoint-type Interface \
    --service-name com.amazonaws.us-east-1.dax \
    --subnet-ids subnet-abcd1234 subnet-1a2b3c4d \
    --security-group-ids sg-1a2b3c4d \
    --private-dns-enabled
```

## 其他資源
<a name="dax-privatelink-resources"></a>

如需 AWS PrivateLink 和 VPC 端點的詳細資訊，請參閱下列資源：
+ [AWS PrivateLink 適用於 DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/privatelink-interface-endpoints.html)
+ [AWS PrivateLink 適用於 DynamoDB 串流](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/privatelink-streams.html)
+ [使用 將您的 VPC 連接到 服務 AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/userguide/endpoint-services-overview.html)
+ [使用 簡化 DynamoDB 的私有連線 AWS PrivateLink](https://aws.amazon.com/blogs//database/simplify-private-connectivity-to-amazon-dynamodb-with-aws-privatelink)
+ [AWS PrivateLink 白皮書](https://docs.aws.amazon.com/whitepapers/latest/aws-vpc-connectivity-options/aws-privatelink.html)

# Amazon DynamoDB 中的組態與漏洞分析
<a name="configuration-vulnerability"></a>

AWS 處理基本安全任務，例如訪客作業系統 (OS) 和資料庫修補、防火牆組態和災難復原。這些程序已由適當的第三方進行檢閱並認證。如需詳細資訊，請參閱以下資源：
+ [Amazon DynamoDB 的合規驗證](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Compliance.html)
+ [共同責任模型](https://aws.amazon.com/compliance/shared-responsibility-model/)
+ [Amazon Web Services：安全程序概觀](https://d0.awsstatic.com/whitepapers/Security/AWS_Security_Whitepaper.pdf) (白皮書)

以下安全最佳實務也可處理 Amazon DynamoDB 中的組態和漏洞分析：
+ [使用 監控 DynamoDB 合規 AWS Config 規則](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/best-practices-security-detective.html#rules)
+ [使用 監控 DynamoDB 組態 AWS Config](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/best-practices-security-detective.html#config)

# Amazon DynamoDB 的安全最佳實務
<a name="best-practices-security"></a>

在您開發和實作自己的安全政策時，可考慮使用 Amazon DynamoDB 提供的多種安全功能。以下最佳實務為一般準則，並不代表完整的安全解決方案。這些最佳實務可能不適用或無法滿足您的環境需求，因此請將其視為實用建議就好，而不要當作是指示。

**Topics**
+ [DynamoDB 預防性安全最佳實務](best-practices-security-preventative.md)
+ [DynamoDB 偵測性安全最佳實務](best-practices-security-detective.md)

# DynamoDB 預防性安全最佳實務
<a name="best-practices-security-preventative"></a>

下列最佳實務有助於預測並預防 Amazon DynamoDB 中的安全性事件。

**靜態加密**  
DynamoDB 使用儲存在 [AWS Key Management Service (AWS KMS)](https://aws.amazon.com/kms/) 中的加密金鑰，為資料表、索引、串流和備份中的所有使用者資料進行靜態加密。如此可透過保護您的資料免於發生未經授權的基礎儲存體存取，為資料提供另一層保護。  
您可以指定 DynamoDB 是否應使用 AWS 擁有的金鑰 （預設加密類型） AWS 受管金鑰、 或客戶受管金鑰來加密使用者資料。如需詳細資訊，請參閱 [Amazon DynamoDB 靜態加密](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/EncryptionAtRest.html)。

**使用 IAM 角色驗證對 DynamoDB 的存取權**  
對於存取 DynamoDB 的使用者、應用程式和其他 AWS 服務，他們必須在其 AWS API 請求中包含有效的 AWS 登入資料。您不應將 AWS 登入資料直接存放在應用程式或 EC2 執行個體中。這些是不會自動輪換的長期憑證，因此如果遭到盜用，可能會對業務造成嚴重的影響。IAM 角色可讓您取得可用來存取 AWS 服務和資源的臨時存取金鑰。  
如需詳細資訊，請參閱[Amazon DynamoDB 的 Identity and Access Management](security-iam.md)。

**使用 IAM 政策進行 DynamoDB 基礎授權**  
授予許可時，會決定誰可以取得這些許可、可以取得哪些 DynamoDB API 的許可，以及可以對這些資源進行的特定動作。對降低錯誤或惡意意圖所引起的安全風險和影響而言，實作最低權限是其中關鍵。  
將許可政策連接至 IAM 身分 (即使用者、群組和角色)，藉此授予可在 DynamoDB 資源上執行操作的許可。  
您可以使用下列內容執行這項作業：  
+ [AWS 受管 （預先定義） 政策](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/using-identity-based-policies.html#access-policy-examples-aws-managed)
+ [客戶管理政策](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/using-identity-based-policies.html#access-policy-examples-for-sdk-cli)

**使用 IAM 政策條件進行精細定義存取控制**  
您在 DynamoDB 中授予許可時，可以指定條件，以決定許可政策的生效方式。對降低錯誤或惡意意圖所引起的安全風險和影響而言，實作最低權限是其中關鍵。  
您可以指定使用 IAM 政策授予許可時的條件。例如，您可以執行下列動作：  
+ 授予許可，允許使用者唯讀存取資料表或次要索引中的特定項目和屬性。
+ 授予許可，允許使用者根據該使用者的身分唯寫存取資料表中的特定屬性。
 如需詳細資訊，請參閱[使用 IAM 政策條件精細定義存取控制](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/specifying-conditions.html)。

**使用 VPC 端點和政策來存取 DynamoDB**  
如果只需要從虛擬私有雲端 (VPC) 內存取 DynamoDB，則應使用 VPC 端點來限制僅來自所需 VPC 的存取。這樣做可防止流量周遊開放式網際網路，也可防止流量受到該環境的限制。  
使用 DynamoDB 的 VPC 端點可讓您使用下列內容來控制和限制存取：  
+ VPC 端點政策：這些政策會套用在 DynamoDB VPC 端點上。它們可讓您控制和限制 API 對 DynamoDB 資料表的存取權限。
+ IAM 政策：利用使用連接至使用者、群組或角色的 `aws:sourceVpce` 條件，您可以強制要求對 DynamoDB 資料表進行的所有存取都要透過指定的 VPC 端點。
 如需詳細資訊，請參閱 [Amazon DynamoDB 端點](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-ddb.html)。

**考慮用戶端加密**  
我們建議您先規劃加密策略，再於 DynamoDB 中使用資料表。如果您將敏感或機密資料儲存在 DynamoDB，請考慮在計劃中加入用戶端加密。如此一來，您就能盡量靠近資料來源進行加密，並確保資料在整個生命週期受到保護。將您傳輸中和靜態的敏感資料加密，有助於確保您的明文資料不會被任何第三方取得。  
 [AWS Database Encryption SDK for DynamoDB](https://docs.aws.amazon.com/dynamodb-encryption-client/latest/devguide/what-is-ddb-encrypt.html) 是一個軟體程式庫，可協助您保護在將資料表資料傳送至 DynamoDB 之前的安全性。其會加密、簽署、驗證和解密 DynamoDB 資料表項目。您可以控制要加密和簽署的屬性。

**主索引鍵設計考量**  
請勿在資料表與全域次要索引的[主索引鍵](HowItWorks.Partitions.md)中使用敏感名稱或純文字資料。主索引鍵名稱會顯示於資料表定義中。例如，任何擁有呼叫 [DescribeTable](WorkingWithTables.Basics.md#WorkingWithTables.Basics.DescribeTable) 權限的人都能查看主索引鍵名稱。主索引鍵值可能出現在 [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) 及其他日誌中。此外，DynamoDB 會使用金鑰值來分佈資料和路由請求， AWS 管理員可能會觀察這些值來維護服務的運作狀態。  
若需在資料表或 GSI 主索引鍵值中使用敏感資料，建議採用端到端用戶端加密。這可讓您執行鍵值查詢，同時確保資料在任何與 DynamoDB 相關的日誌中都不會以未加密形式出現。一種可行方法是使用 [AWS Database Encryption SDK for DynamoDB](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/client-server-side.html)，但這並非必要。若使用自訂解決方案，應一律採用足夠安全的加密演算法。請勿使用雜湊等非加密選項，因其在多數情境下安全性不足。  
若主索引鍵名稱包含敏感資訊，建議改用 ``pk`` 和 ``sk``。這是通用的最佳實務，可讓您的分割區索引鍵設計保持彈性。  
如果您擔心什麼是正確的選擇，請務必諮詢您的安全專家或 AWS 客戶團隊。

# DynamoDB 偵測性安全最佳實務
<a name="best-practices-security-detective"></a>

下列 Amazon DynamoDB 最佳實務能幫助您偵測潛在安全弱點與事件。

**使用 AWS CloudTrail 監控 AWS 受管 KMS 金鑰用量**  
如果您使用 [AWS 受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk)進行靜態加密，則會登入此金鑰的使用 AWS CloudTrail。CloudTrail 透過記錄對您帳戶所採取的動作，來提供使用者活動的可見性。CloudTrail 會記錄每個動作的重要資訊，包括提出請求的人員、使用的服務、執行的動作、動作的參數，以及 AWS 服務傳回的回應元素。此資訊可協助您追蹤對 AWS 資源所做的變更，並對操作問題進行疑難排解。CloudTrail 可讓您更輕鬆地確保內部政策和法規標準的合規性。  
您可以使用 CloudTrail 來稽核金鑰的使用情況。CloudTrail 會建立日誌檔案，其中包含您帳戶的 AWS API 呼叫和相關事件的歷史記錄。這些日誌檔案包括使用 AWS 管理主控台、 AWS SDKs和命令列工具提出的所有 AWS KMS API 請求，以及透過整合 AWS 服務提出的請求。您可以使用這些日誌檔來取得使用 KMS 金鑰的時間、所請求的操作、請求者的身分、請求的來源 IP 位址等資訊。如需詳細資訊，請參閱《[AWS CloudTrail 使用者指南](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/)》中的[使用 AWS CloudTrail記錄 AWS KMS API 呼叫](https://docs.aws.amazon.com/kms/latest/developerguide/logging-using-cloudtrail.html)。

**使用 CloudTrail 監控 DynamoDB 操作**  
CloudTrail 可以監控控制平面事件和資料平面事件。控制平面操作可讓您建立及管理 DynamoDB 資料表。它們也可讓您使用索引、串流，以及相依於資料表的其他物件。資料平面操作可讓您對資料表中的資料執行建立、讀取、更新與刪除 (也稱為 *CRUD*) 動作。某些資料平面操作也可讓您從次要索引中讀取資料。若要在 CloudTrail 中啟用資料平面事件的記錄功能，您需要在 CloudTrail 中啟用資料平面 API 活動的記錄功能。如需詳細資訊，請參閱[記錄追蹤的資料事件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html)。  
當 DynamoDB 中發生活動時，該活動會與事件歷史記錄中的其他 AWS 服務事件一起記錄在 CloudTrail 事件中。如需詳細資訊，請參閱[使用 AWS CloudTrail來記錄 DynamoDB 操作](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/logging-using-cloudtrail.html)。您可以在 AWS 帳戶中檢視、搜尋和下載最近的事件。如需詳細資訊，請參閱《AWS CloudTrail 使用者指南》**中的[使用 CloudTrail 事件歷史記錄檢視事件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events.html)。  
若要持續記錄您 AWS 帳戶中的事件，包括 DynamoDB 的事件，請建立[追蹤](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-create-and-update-a-trail.html)。線索能讓 CloudTrail 將日誌檔案交付至 Amazon Simple Storage Service (Amazon S3) 儲存貯體。根據預設，當您在主控台上建立線索時，線索會套用至所有 AWS 區域。該追蹤會記錄來自 AWS 分割區中所有區域的事件，並將日誌檔案交付到您指定的 S3 儲存貯體。此外，您可以設定其他 AWS 服務，以進一步分析和處理 CloudTrail 日誌中所收集的事件資料。

**使用 DynamoDB Streams 監控資料平面操作**  
DynamoDB 與 整合 AWS Lambda ，因此您可以建立觸發，也就是自動回應 DynamoDB Streams 中事件的程式碼片段。您可以利用觸發條件建立對 DynamoDB 資料表資料修改做出反應的應用程式。  
如果您在資料表中啟用 DynamoDB Streams，就可以建立串流 Amazon Resource Name (ARN) 與您撰寫之 Lambda 函式的關聯。修改資料表中的項目後，資料表的 stream. AWS Lambda polls 會立即顯示新記錄，並在偵測到新的串流記錄時同步叫用 Lambda 函數。Lambda 函式可以執行您指定的任何動作，例如傳送通知或啟動工作流程。  
如需範例，請參閱[教學課程：搭配 Amazon DynamoDB Streams 使用 AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/with-ddb-example.html)。此範例會接收 DynamoDB 事件輸入、處理其包含的訊息，並將部分傳入事件資料寫入 Amazon CloudWatch Logs。

**使用 監控 DynamoDB 組態 AWS Config**  
您可以使用 [AWS Config](https://docs.aws.amazon.com/config/latest/developerguide/WhatIsConfig.html) 持續監控並記錄 AWS 資源的變更。您也可以使用 AWS Config 清查您的 AWS 資源。當偵測到先前狀態的變更時，Amazon Simple Notification Service (Amazon SNS) 會通知您檢閱並採取行動。遵循[AWS Config 使用主控台設定](https://docs.aws.amazon.com/config/latest/developerguide/gs-console.html)中的指示，確保包含 DynamoDB 資源類型。  
您可以設定 AWS Config 將組態變更和通知串流至 Amazon SNS 主題。例如，更新資源時，您可以收到傳送至您電子郵件的通知，因此您可以檢視變更。當 根據您的資源 AWS Config 評估您的自訂或受管規則時，您也會收到通知。  
如需範例，請參閱《 *AWS Config 開發人員指南*》中的[AWS Config 傳送至 Amazon SNS 主題的通知](https://docs.aws.amazon.com/config/latest/developerguide/notifications-for-AWS-Config.html)。

**監控 DynamoDB 是否符合 AWS Config 規則**  
AWS Config 會持續追蹤 資源中發生的組態變更。其會檢查這些變更是否違反您規則中的任何條件。如果資源違反規則， 會將資源和規則 AWS Config 標記為不合規。  
透過使用 AWS Config 評估您的資源組態，您可以評估資源組態符合內部實務、產業準則和法規的程度。 AWS Config 提供[AWS 受管規則](https://docs.aws.amazon.com/config/latest/developerguide/managed-rules-by-aws-config.html)，這些是預先定義的可自訂規則， AWS Config 可用來評估您的 AWS 資源是否符合常見的最佳實務。

**為您的 DynamoDB 資源加上標籤，以便進行識別和自動化**  
您可以將中繼資料以標籤形式指派給 AWS 資源。每個標記都是由客戶定義金鑰和選用值組成的簡單標籤，能夠更輕鬆地管理、搜尋和篩選資源。  
標記允許實現分組控制。雖然標籤不具固有類型，但能讓您依用途、擁有者、環境或其他條件分類資源。下列是一些範例：  
+ 安全性：用於確定加密等需求。
+ 機密性：資源支援的特定資料機密等級識別符。
+ 環境：用來區分開發、測試和生產基礎設施。
如需詳細資訊，請參閱 [AWS 標記策略](https://aws.amazon.com/answers/account-management/aws-tagging-strategies/)和 [DynamoDB 的標記](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.html)。

**監控 Amazon DynamoDB 的使用量，因為它與使用 的安全最佳實務相關 AWS Security Hub CSPM。**  
Security Hub CSPM 使用安全控制來評估資源組態和安全標準，以協助您符合各種合規架構。  
如需使用 Security Hub CSPM 評估 DynamoDB 資源的詳細資訊，請參閱*AWS Security Hub CSPM 《 使用者指南*》中的 [Amazon DynamoDB 控制項](https://docs.aws.amazon.com/securityhub/latest/userguide/dynamodb-controls.html)。