

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 跨区域复制 AWS Secrets Manager 密钥
<a name="replicate-secrets"></a>

您可以将您的密钥分成多个复制 AWS 区域 ，以支持分布在这些地区的应用程序，从而满足区域访问和低延迟要求。如果以后需要，您可以[将副本密钥升级为独立密钥](standalone-secret.md)，然后将其设置为独立复制。Secrets Manager 可以跨指定区域复制加密密钥数据和元数据，例如标签和资源策略。

除区域外，副本密钥的 ARN 与主密钥相同，例如：
+ 主密钥：`arn:aws:secretsmanager:Region1:123456789012:secret:MySecret-a1b2c3`
+ 副本密钥：`arn:aws:secretsmanager:Region2:123456789012:secret:MySecret-a1b2c3`

有关副本密钥的定价信息，请参阅 [AWS Secrets Manager 定价](https://aws.amazon.com/secrets-manager/pricing/)。

当存储复制到其他区域的源数据库的数据库凭证时，密钥将包含源数据库的连接信息。然后复制密钥时，副本将是源密钥的副本，并且包含相同的连接信息。您可以向密钥中添加其他 key/value 配对以获取区域连接信息。

如果您为主密钥启用轮换，Secrets Manager 将在主区域中进行密钥轮换，新的密钥值会传播到所有关联的副本密钥。您无需单独管理所有副本密钥的轮换。

您可以在所有已启用的 AWS 区域中复制密钥。但是，如果您在特殊 AWS 区域（例如 AWS GovCloud (US) 或中国区域）使用 Secrets Manager，则只能在这些 AWS 特殊区域内配置密钥和副本。您不能将已启用 AWS 区域中的密钥复制到专门区域，也不能将机密从专业区域复制到商业区域。

在将密钥复制到另一个区域之前，您必须启用该区域。有关更多信息，请参阅[管理 AWS 区域](https://docs.aws.amazon.com/general/latest/gr/rande-manage.html#rande-manage-enable)。

通过调用存储密钥的区域中的 Secrets Manager 端点，则无需复制密钥即可在多个区域中使用密钥。有关 终端节点的列表，请参阅[AWS Secrets Manager 端点](asm_access.md#endpoints)。要使用复制来提高工作负载的弹性，请参阅[第一部分：云端恢复策略中的灾难恢复 (DR) 架构](https://aws.amazon.com/blogs/architecture/disaster-recovery-dr-architecture-on-aws-part-i-strategies-for-recovery-in-the-cloud/)。 AWS

当您复制密钥时，Secrets Manager 会生成一个 CloudTrail 日志条目。有关更多信息，请参阅 [使用记录 AWS Secrets Manager 事件 AWS CloudTrail](monitoring-cloudtrail.md)。

**要将密钥复制到其他地区（控制台）**

1. 打开 Secrets Manager 控制台，网址为[https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)。

1. 从密钥列表上，选择您的密钥。

1. 在密钥详细信息页面的**复制**选项卡中，执行以下任意一项操作：
   + 如果未复制密钥，请选择 **Replicate secret**（复制密钥）。
   + 如果已复制密钥，请在 **Replicate secret**（复制密钥）部分，选择 **Add Region**（添加区域）。

1. 在 **Add replica regions** 对话框中，执行以下操作：

   1. 针对 **AWS 区域**，请选择要将密钥复制粘贴的区域。

   1. （可选）对于**加密密钥**中，选择用来加密密钥的 KMS 密钥。密钥必须位于副本区域中。

   1. （可选）要添加其他区域，请选择 **Add more regions**（添加更多区域）。

   1. 选择 **Replicate**（复制）。

   此时会返回到密钥详细信息页面。**Replicate secret**（复制密钥）部分会显示每个区域的 **Replication status**（复制状态）。

## AWS CLI
<a name="replicate-secrets_CLI"></a>

**Example 将密钥复制到其他区域**  
以下 [https://docs.aws.amazon.com//cli/latest/reference/secretsmanager/replicate-secret-to-regions.html](https://docs.aws.amazon.com//cli/latest/reference/secretsmanager/replicate-secret-to-regions.html) 示例将密钥复制到 eu-west-3。副本使用 AWS 托管密钥加密**aws/secretsmanager**。  

```
aws secretsmanager replicate-secret-to-regions \
        --secret-id MyTestSecret \
        --add-replica-regions Region=eu-west-3
```

**Example 创建密钥并复制它**  
以下[示例](https://docs.aws.amazon.com//cli/latest/reference/secretsmanager/create-secret.html)创建一个密钥并将其复制到 eu-west-3。副本使用加密 AWS 托管式密钥 **aws/secretsmanager**。  

```
aws secretsmanager create-secret \
    --name MyTestSecret \
    --description "My test secret created with the CLI." \
    --secret-string "{\"user\":\"diegor\",\"password\":\"EXAMPLE-PASSWORD\"}"
    --add-replica-regions Region=eu-west-3
```

## AWS SDK
<a name="replicate-secrets_SDK"></a>

要复制密钥，请使用 [https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_ReplicateSecretToRegions.html](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_ReplicateSecretToRegions.html) 命令。有关更多信息，请参阅 [AWS SDKs](asm_access.md#asm-sdks)。

# 在中将副本密钥提升为独立密钥 AWS Secrets Manager
<a name="standalone-secret"></a>

副本密钥是从主密钥复制到另一个密钥 AWS 区域。它具有与主密钥相同的密钥值和元数据，但对它的加密可以使用不同的 KMS 密钥。不能独立于主密钥更新副本密钥，但其加密密钥除外。副本密钥升级会断开副本密钥与主密钥的连接，并使副本机密成为独立密钥。对主密钥的更改不会复制到独立密钥。

在主密钥不可用的情况下，您可能希望将副本密钥升级为独立密钥，以此作为灾难恢复解决方案。或者，如果要为副本密钥启用轮换，您可能需要将副本密钥升级为独立密钥。

如您升级副本密钥，请务必更新相应的应用程序来使用独立密钥。

当你提升密钥时，Secrets Manager 会生成一个 CloudTrail 日志条目。有关更多信息，请参阅 [使用记录 AWS Secrets Manager 事件 AWS CloudTrail](monitoring-cloudtrail.md)。

**升级副本密钥（控制台）**

1. 登录 Secrets Manager，网址为[https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)。

1. 导航至副本区域。

1. 在 **Secrets**（密钥）列表页上，选择副本密钥。

1. 在副本密钥详细信息页面上，选择 **Promote to standalone secret**（升级为独立密钥）。

1. 在 **Promote replica to standalone secret**（将副本升级为独立密钥）对话框中，输入区域，然后选择 **Promote replica**（提升副本）。

## AWS CLI
<a name="standalone-secret-cli"></a>

**Example 将副本密钥提升为主密钥**  
以下 [https://docs.aws.amazon.com//cli/latest/reference/secretsmanager/stop-replication-to-replica.html](https://docs.aws.amazon.com//cli/latest/reference/secretsmanager/stop-replication-to-replica.html) 示例将删除副本密钥与主密钥之间的链接。副本密钥在副本区域中被提升为主密钥。您必须从副本区域内调用 [https://docs.aws.amazon.com//cli/latest/reference/secretsmanager/stop-replication-to-replica.html](https://docs.aws.amazon.com//cli/latest/reference/secretsmanager/stop-replication-to-replica.html)。  

```
aws secretsmanager stop-replication-to-replica \
    --secret-id MyTestSecret
```

## AWS SDK
<a name="standalone-secret-sdk"></a>

要将副本密钥升级为独立密钥，请使用 [https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_StopReplicationToReplica.html](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_StopReplicationToReplica.html) 命令。您必须从副本密钥区域调用此命令。有关更多信息，请参阅 [AWS SDKs](asm_access.md#asm-sdks)。

# 防止 AWS Secrets Manager 复制
<a name="replicate-secrets-permissions"></a>

由于密钥可以使用 [https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_ReplicateSecretToRegions.html](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_ReplicateSecretToRegions.html) 进行复制或在使用 [https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_CreateSecret.html](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_CreateSecret.html) 创建时进行复制，因此如果您想防止用户复制密钥，我们建议您阻止包含 `AddReplicaRegions` 参数的操作。您可以在权限策略中使用 `Condition` 语句，以仅允许不添加副本区域的操作。有关您可以使用的条件语句，请参阅以下策略示例。

**Example 防止复制权限**  
以下策略示例演示了如何允许所有不添加副本区域的操作。这可以防止用户同时通过 `ReplicateSecretToRegions` 和 `CreateSecret` 复制密钥。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "secretsmanager:*",
      "Resource": "*",
      "Condition": {
        "Null": {
          "secretsmanager:AddReplicaRegions": "true"
        }
      }
    }
  ]
}
```

**Example 仅允许向特定区域提供复制权限**  
以下策略演示了如何允许以下所有操作：  
+ 创建密钥而不复制
+ 创建密钥并复制到仅位于美国和加拿大的区域
+ 仅将密钥复制到位于美国和加拿大的区域   
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:CreateSecret",
        "secretsmanager:ReplicateSecretToRegions"
      ],
      "Resource": "*",
      "Condition": {
        "ForAllValues:StringLike": {
          "secretsmanager:AddReplicaRegions": [
            "us-*",
            "ca-*"
          ]
        }
      }
    }
  ]
}
```

# 排除 AWS Secrets Manager 复制故障
<a name="replicate-secrets_troubleshoot"></a>

AWS Secrets Manager 复制可能由于各种原因而失败。要检查密钥复制失败的原因，您可以执行以下操作之一：
+ 调用 `DescribeSecret` API 操作
+ 查看 AWS CloudTrail 活动

在复制失败时：
+ 如果没有可用的密钥版本，Secrets Manager 会将该密钥从副本区域中移除。
+ 如果成功复制密钥版本，则它们将保留在副本区域中，直到您使用 `RemoveRegionsFromReplication` API 操作将其明确移除。

以下各部分将介绍复制失败的一些常见原因。

## 选定区域中存在名称相同的密钥。
<a name="w2aac17c33c13"></a>

为此解决此问题，可以覆盖副本区域中的重复名称密钥。重试复制，然后在**重试复制**对话框中，选择**覆盖**。

## KMS 密钥上没有可用的权限来完成复制。
<a name="w2aac17c33c15"></a>

Secrets Manager 首先解密密密钥，然后使用副本区域中的新 KMS 密钥重新加密。如果您在主区域中没有加密密钥的 `kms:Decrypt` 权限，则会遇到此错误。要使用 `aws/secretsmanager` 以外的 KMS 密钥对复制的秘密进行加密，您需要对密钥进行 `kms:GenerateDataKey` 和 `kms:Encrypt`。请参阅[KMS 密钥的权限](security-encryption.md#security-encryption-authz)。

## KMS 密钥已禁用或者未找到
<a name="w2aac17c33c17"></a>

如果主区域中的加密密钥被禁用或删除，则 Secrets Manager 将无法复制该秘密。即使您更改了加密密钥，如果秘密具有使用已禁用或删除的加密密钥加密的[自定义标签版本](whats-in-a-secret.md#term_version)，也可能发生此错误。有关 Secrets Manager 如何加密的信息，请参阅 [中的秘密加密和解密 AWS Secrets Manager](security-encryption.md)。要解决此问题，您可以重新创建秘密版本，以便 Secrets Manager 使用当前加密密钥对其进行加密。有关更多信息，请参阅[更改秘密的加密密钥](manage_update-encryption-key.md#manage_update-encryption-key_CLI)。然后重试复制。

```
aws secretsmanager put-secret-value \
  --secret-id testDescriptionUpdate \
  --secret-string "SecretValue" \
  --version-stages "MyCustomLabel"
```

## 您尚未启用要复制的区域。
<a name="w2aac17c33c19"></a>

有关如何启用区域的信息，请参阅 *AWS 账户管理参考指南*中的[管理 AWS 区域](https://docs.aws.amazon.com/general/latest/gr/rande-manage.html#rande-manage-enable)。