

# 与 CMK 跨账户集成考虑的注意事项
<a name="cross-account-integration-considerations"></a>

当尝试从 DynamoDB 集成到 Amazon Redshift 时，初始操作将从 Amazon Redshift 启动。如果没有适当的权限，此操作可能会导致静默失败。以下各节详细介绍此跨账户集成所需的权限。

## 所需的 AWS KMS 角色和权限
<a name="required-kms-policies-permissions"></a>

替换示例中的以下占位符：
+ `111122223333`：托管 Amazon Redshift 的 AWS 账户 ID
+ `444455556666`：托管 DynamoDB 的 AWS 账户 ID
+ `REDSHIFT_ROLE_NAME`：Amazon Redshift 使用的 IAM 角色名称
+ `REGION`：您的资源所在的 AWS 区域
+ `TABLE_NAME`：DynamoDB 表的名称
+ `KMS_KEY_ID`：KMS 密钥的 ID

### DynamoDB 账户中的 KMS 密钥策略
<a name="kms-key-policy-dynamodb-account"></a>

以下 AWS KMS 密钥策略使得您可以在 DynamoDB 服务和 Amazon Redshift 服务之间启用跨账户访问。在此示例中，账户 444455556666 包含 DynamoDB 表和 AWS KMS 密钥，而账户 111122223333 包含需要访问权限来解密数据的 Amazon Redshift 集群。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::444455556666:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "Allow Redshift to use the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/REDSHIFT_ROLE_NAME"
            },
            "Action": [
                "kms:Decrypt",
                "kms:DescribeKey",
                "kms:GenerateDataKey",
                "kms:GenerateDataKeyWithoutPlaintext"
            ],
            "Resource": "*"
        }
    ]
}
```

------

### Amazon Redshift 角色的 IAM 策略（在 Amazon Redshift 账户中）
<a name="iam-policy-redshift-role"></a>

以下 IAM 策略使得 Amazon Redshift 服务能够在跨账户场景中访问 DynamoDB 表及其关联的 AWS KMS 加密密钥。在此示例中，账户 444455556666 包含 Amazon Redshift 服务需要访问的 DynamoDB 资源和 AWS KMS 密钥。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowDynamoDBAccess",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeTable",
                "dynamodb:BatchGetItem",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:BatchGetItem",
                "dynamodb:GetItem",
                "dynamodb:GetRecords",
                "dynamodb:GetShardIterator",
                "dynamodb:DescribeStream",
                "dynamodb:ListStreams"
            ],
            "Resource": [
                "arn:aws:dynamodb:*:444455556666:table/TABLE_NAME",
                "arn:aws:dynamodb:*:444455556666:table/TABLE_NAME/stream/*"
            ]
        },
        {
            "Sid": "AllowKMSAccess",
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:DescribeKey",
                "kms:GenerateDataKey",
                "kms:GenerateDataKeyWithoutPlaintext"
            ],
            "Resource": "arn:aws:kms:us-east-1:444455556666:key/KMS_KEY_ID"
        }
    ]
}
```

------

### Amazon Redshift 角色的信任关系
<a name="trust-relationship-redshift-role"></a>

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "redshift.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

------

### DynamoDB 表策略（如果使用基于资源的策略）
<a name="dynamodb-table-policy"></a>

以下基于资源的策略使得账户 111122223333 中的 Amazon Redshift 服务可以访问账户 444455556666 中的 DynamoDB 表和 DynamoDB Streams。将此策略附加到您的 DynamoDB 表以启用跨账户访问。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowRedshiftAccess",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/REDSHIFT_ROLE_NAME"
            },
            "Action": [
                "dynamodb:DescribeTable",
                "dynamodb:BatchGetItem",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:BatchGetItem",
                "dynamodb:GetItem",
                "dynamodb:GetRecords",
                "dynamodb:GetShardIterator",
                "dynamodb:DescribeStream",
                "dynamodb:ListStreams"
            ],
            "Resource": [
                "arn:aws:dynamodb:*:444455556666:table/TABLE_NAME",
                "arn:aws:dynamodb:*:444455556666:table/TABLE_NAME/stream/*"
            ]
        }
    ]
}
```

------

## 重要注意事项
<a name="important-considerations"></a>

1. 确保 KMS 密钥与 DynamoDB 表位于同一区域。

1. KMS 密钥必须是客户自主管理型密钥（CMK），而不是 AWS 托管式密钥。

1. 如果使用的是 DynamoDB 全局表，请为所有相关区域配置权限。

1. 考虑添加条件语句以根据 VPC 端点或 IP 范围限制访问权限。

1. 为了增强安全性，请考虑使用 `aws:PrincipalOrgID` 条件来限制组织的访问权限。

1. 通过 CloudTrail 和 CloudWatch 指标监控 KMS 密钥使用情况。