

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

# Multi-Region 为用户池复制
<a name="user-pool-multi-region"></a>

借助多区域复制 (MRR)，您可以在其他 Amazon Web Services 区域 区域中创建副本用户池，为您的身份验证基础设施提供业务连续性和灾难恢复功能。借助 MRR，即使您与某个地区的资源断开连接，注册用户也可以继续使用您的应用程序进行身份验证，从而确保您的应用程序保持可用。

在配置 MRR 时，Amazon Cognito 会使用共享的用户池 ID 创建单独的用户池。每个副本用户池都托管共享用户目录的身份验证服务。主用户池是管理配置和用户目录写入操作（如密码重置和用户注册）的权威来源。次要用户池无法创建用户，无法从主用户池继承大多数设置，并且在故障转移状态下可以处理身份验证操作，例如用户登录和令牌生成。

**重要**  
Multi-Region 目前，并非所有用户池都可以使用复制。 Multi-Region 复制需要具有增强功能和可扩展性的现代 Amazon Cognito 基础设施。一些用户池仍在以前的基础架构上，并将通过升级 Amazon 到新的基础架构，这将解锁此功能。在 Amazon Cognito 控制台中，符合条件的用户池显示多区域复制配置选项，不符合条件的用户池显示异常消息。有关更多信息，请参阅安全博客中的 [Amazon Cognito 利用下一代基础设施解锁高级功能](https://www.amazonaws.cn/blogs/security/amazon-cognito-unlocks-advanced-capabilities-with-next-generation-infrastructure/)。 Amazon 

## 关于多区域复制的注意事项
<a name="user-pool-multi-region-things-to-know"></a>
+ Multi-Region 复制有单独的附加费用，并且要求您的用户池使用基本版或增强版[功能计划](cognito-sign-in-feature-plans.md)。使用精简版功能计划，您无法在用户池上启用 MRR。
+ 在启用复制 Amazon KMS 之前，您必须使用[多区域客户托管密钥](https://docs.amazonaws.cn/kms/latest/developerguide/multi-region-keys-overview.html)配置用户池。该密钥必须在所有有用户池副本 Amazon Web Services 区域 的用户中都可用。有关更多信息，请参阅 [数据加密](data-protection.md#data-encryption)。
+ 您的用户池必须使用多区域 OIDC 颁发机构，以确保跨区域一致的令牌验证。有关更多信息，请参阅 [Amazon Cognito 用户池作为 OIDC 发行机构](federation-endpoints.md#user-pool-oidc-issuer)。
+ 新的次要用户池以该`INACTIVE`状态启动。在激活用于生产的用户池之前，请查看和配置区域设置。
+ 副本之间的区域配置可能有所不同。您可以在副本中独立配置以下设置。所有其他设置均在主用户池中设置并自动同步到辅助用户池。
  + 电子邮件配置
  + 威胁防护通知的电子邮件配置
  + 短信配置
  + Lambda 触发器
  + 标签
  + 日志导出配置
  + Amazon WAF 网页 ACL
+ 区域之间的数据复制可能会带来短暂的延迟。主用户池将设置和用户目录更新同步到辅助用户池，此过程最终是一致的。

## 多区域复制的局限性
<a name="user-pool-multi-region-limitations"></a>
+ 无论是通过注册还是创建管理员，您都无法在辅助用户池中生成新用户。新的联合用户只有在之前已登录主用户池的情况下，才能登录处于故障转移状态的辅助用户池。
+ 用户无法在辅助用户池中重置密码或修改其个人资料。在故障转移状态下，在用户界面中禁用这些操作，并在运行状况检查恢复对主用户池的访问权限后使其可用。
+ 每个用户目录在其他区域中最多可以有一个辅助副本。任何用户池都可以有一个辅助副本。
+ 辅助副本不支持 TOTP MFA。配置了 TOTP MFA 的用户必须在主区域的用户池为请求提供服务时进行身份验证。
+ 封锁前基于密码的身份验证尝试次数不同步。每个副本都会保留自己的失败身份验证尝试次数。
+ 您只能使用[自定义域](cognito-user-pools-add-custom-domain.md)配置多区域用户池的自动故障转移。

## 配置多区域复制
<a name="user-pool-multi-region-configure"></a>

在启用多区域复制之前，请确保您的用户池满足先决条件：Essentials 或 Plus 功能计划、多区域客户托管 KMS 密钥和多区域 OIDC 颁发者配置。

------
#### [ Amazon Web Services 管理控制台 ]

**为用户池配置多区域复制**

1. 登录 [Amazon Cognito 控制台](https://console.amazonaws.cn/cognito/home)。

1. 选择**用户池**。

1. 从列表中选择一个现有的用户池，或者[创建一个新的用户池](getting-started-user-pools.md)。

1. 选择**设置**选项卡。

1. 在左侧导航菜单中，选择**Multi-Region复制**。

1. 选择**创建副本用户池**。

1. 对于**区域**，选择要在 Amazon Web Services 区域 哪里创建副本用户池。

1. 查看配置摘要并选择**创建副本**。

1. 创建副本后，请查看比较表中的区域配置设置。根据需要为您的副本区域配置任何特定于区域的设置，例如电子邮件配置、SMS 设置或 Lambda 触发器。

1. 要为您的域配置 Route 53 运行状况检查，请导航到**域服务**菜单，编辑或添加自定义域，然后配置 **Route 53 运行状况检查 ID**。

1. 当您准备好将副本用于生产流量时，请将副本状态从 “**非活动**” 更改为 “**活动**”。

------
#### [ API ]

要创建副本用户池，请使用[CreateUserPoolReplica](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolReplica.html)操作。以下示例`us-west-2`在该区域为中的主用户池创建了一个副本`us-east-1`。

```
{
   "UserPoolId": "{{us-east-1_EXAMPLE}}",
   "RegionName": "{{us-west-2}}",
   "UserPoolTags": {
      "Environment": "{{Production}}",
      "Application": "{{MyApp}}"
   }
}
```

响应包含副本信息：

```
{
   "Replica": {
      "RegionName": "{{us-west-2}}",
      "UserPoolArn": "arn:aws:cognito-idp:{{us-west-2}}:{{111122223333}}:userpool/{{us-east-1_EXAMPLE}}",
      "Status": "PENDING_CREATE",
      "Role": "SECONDARY"
   }
}
```

您还必须配置您的域以进行故障转移。在 Route 53 中设置运行状况检查，并在[UpdateUserPoolDomain](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolDomain.html)请求中将其应用于您的域：

```
{
   "CustomDomainConfig": { 
      "CertificateArn": "arn:aws:acm:us-east-1:{{111122223333}}:certificate/{{a1b2c3d4-5678-90ab-cdef-EXAMPLE11111}}"
   },
   "Domain": "{{auth.example.com}}",
   "ManagedLoginVersion": {{2}},
   "Routing": {
      "Failover": {
         "SecondaryRegion": "{{us-west-2}}",
         "PrimaryRoute53HealthCheckId": "{{a1b2c3d4-5678-90ab-cdef-EXAMPLE11111}}"
      }
   },
   "UserPoolId": "ca-central-1_EXAMPLE"
}
```

要激活副本以供生产使用，请使用以下[UpdateUserPoolReplica](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolReplica.html)操作：

```
{
   "UserPoolId": "{{us-east-1_EXAMPLE}}",
   "RegionName": "{{us-west-2}}",
   "Status": "ACTIVE"
}
```

响应确认了更新的副本状态：

```
{
   "Replica": {
      "RegionName": "{{us-west-2}}",
      "UserPoolArn": "arn:aws:cognito-idp:{{us-west-2}}:{{111122223333}}:userpool/{{us-east-1_EXAMPLE}}",
      "Status": "ACTIVE",
      "Role": "SECONDARY"
   }
}
```

------

## 多区域用户池中的故障转移
<a name="user-pool-multi-region-failover"></a>

托管登录、联合登录和用户池的直接 API 使用 Amazon Web Services 区域 可能会在两者之间进行故障转移。托管登录和联合身份验证需要使用您的主用户池配置自定义域。您无法使用副本用户池配置其他自定义域。

### 用于托管登录、联合和计算机间授权的故障转移
<a name="user-pool-multi-region-failover-managed-login"></a>

当您的主用户池具有[自定义域](cognito-user-pools-add-custom-domain.md)时，可以进行故障转移。当两个用户池都有一个[前缀域](cognito-user-pools-assign-domain-prefix.md)时，您可以通过直接访问辅助前缀域来手动测试辅助副本上的操作。自定义域名可以从主域或其他副本和区域提供服务。

需要自定义域，因为它是为 OAuth 2.0 资源（例如[授权](authorization-endpoint.md)和[令牌](token-endpoint.md)终端节点）提供服务的终端节点，并处理来自第三方联合体（包括 OIDC、SAML 和社交提供商）的 IdP 响应。

要配置故障转移，请在 Route 53 中设置[运行状况检查](https://docs.amazonaws.cn/Route53/latest/DeveloperGuide/dns-failover.html)。您应对决定本次运行状况检查状态的因素负责。运行状况检查与您的自定义域名的 DNS CNAME 记录没有直接关联。但是，该指标决定了您的自定义域名的流量是路由到您的主用户池还是副本用户池。

您的自定义域名的 DNS 记录可以使用 Route 53 或任何第三方 DNS 提供商。确保您的 DNS 提供商中有指向您的目标别名（即 CloudFront 分发）的有效 CNAME 记录。您可以在 Amazon Cognito **控制台的域名**页面上找到别名目标。

当运行状况检查处于不健康状态时，Amazon Cognito 会为辅助副本用户池中的自定义域提供托管登录页面和身份验证操作。当运行状况检查进入正常状态时，Amazon Cognito 开始将流量路由回主副本。

每个用户池都有自己的前缀域，就像它们一样 Region-isolated。您仍然可以直接调用这些端点来处理身份验证。但是，如果使用第三方配置了联合 IdPs，则每个前缀端点必须有两个应用程序配置。作为最佳实践，请使用自定义域来确保 Amazon Cognito 根据 Route 53 运行状况检查状态自动处理与托管登录之间的路由。

**在控制台中更新运行状况检查 ID**

1. 在 Amazon Cognito 控制台中导航到您的用户池。

1. 从菜单中选择 “**品牌**” 下的 “**域名**”。

1. 在**自定义域**部分下，选择编辑选项，然后选择**编辑多区域故障转移**。

1. 切换 “**启用多区域故障转移**” 选项。

1. 从可用的运行状况检查中选择您的 Route 53 运行状况检查 ID。

1. 选择**保存更改**。

### Amazon Cognito API 和软件开发工具包的故障转移
<a name="user-pool-multi-region-failover-api"></a>

如果您使用 Amazon Cognito API 或软件开发工具包，则不使用自定义域，您的应用程序负责将流量路由到 Amazon Cognito 服务区域终端节点以处理身份验证和其他 API 调用。

如果您的应用程序前端仅使用公共客户端，例如单页应用程序 (SPA) 或移动应用程序，则您的应用程序必须是动态的，才能相应地路由 API 调用。考虑使用无服务器应用程序后端，以帮助确定应从哪个区域开始使用 Amazon Cognito 进行身份验证。

如果您的应用程序带有后端，则可以在此处确定要针对哪个用户池进行身份验证的逻辑。

如果您同时使用托管登录终端节点和 API，则可以使用相同的 Route 53 运行状况检查作为应用程序的指标，以决定对 Amazon Cognito 的 API 调用应针对哪个区域。