

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

# 跨区域数据访问 OpenSearch 域名
<a name="application-cross-region-data-access-domains"></a>

您可以将您的 OpenSearch UI 应用程序配置 AWS 区域 为一个以访问不同的 AWS 区域 s 中的 OpenSearch 域。这使您能够创建统一的仪表板，用于聚合来自同一分区内多个 OpenSearch AWS 区域域的数据。跨区域数据源支持需要在目标域上启用精细的访问控制。细粒度访问控制提供了域访问策略之外的额外授权层，允许您控制对单个索引、文档和字段的访问。

## 重要概念
<a name="cross-region-key-concepts"></a>

应用区域  
您的 OpenSearch 用户界面应用程序的托管 AWS 区域 位置。

目标区域  
 OpenSearch 域 AWS 区域 所在的位置。这可以是同一分区中的任何区域，无论该区域中是否有 OpenSearch 用户界面。

跨账户角色  
目标账户中的 IAM 角色，仅在数据源关联期间使用。 OpenSearch UI 扮演这个角色来调用`es:DescribeDomain`，它会检索域端点并验证是否启用了精细的访问控制。只有当域名与应用程序使用不同的账户时，才需要此角色。有关更多信息，请参阅 [跨账户数据访问 OpenSearch 域名](application-cross-account-data-access-domains.md)。

IAM 身份中心应用程序角色  
应用程序账户中的 IAM 角色，用于访问 IAM Identity Center 用户数据平面。

支持的区域（适用于 VPC 域）  
对于 VPC 域，在授权 VP AWS 区域 C 终端节点时，您必须将托管 OpenSearch UI 应用程序的用户界面应用程序列入许可名单。此许可名单是必需的，这样 OpenSearch UI 才能调用 VPC 域。

## 先决条件
<a name="cross-region-prerequisites"></a>

在设置跨区域数据访问之前，请确保您具备以下条件：
+ AWS CLI 已安装并配置
+ 同时 AWS 账户 访问应用程序区域和目标区域
+ OpenSearch 启用了细粒度访问控制的域。只有启用了精细访问控制的域名才支持多区域数据源关联。
+ 对于跨账户方案：同时访问源账户和目标 AWS 账户账户
+ 对于 IAM 身份中心流程： AWS IAM Identity Center 组织实例。 OpenSearch UI 应用程序必须与 IAM 身份中心实例位于同一区域。

## 场景
<a name="cross-region-scenarios"></a>

选择与您的身份验证方法和域配置相匹配的方案：
+ [场景 1：IAM 用户访问不同区域的公共域](#cross-region-scenario-1)
+ [场景 2：IAM 身份中心用户访问不同区域的公共域](#cross-region-scenario-2)
+ [场景 3：IAM 用户访问不同区域的 VPC 域](#cross-region-scenario-3)
+ [场景 4：IAM 身份中心用户访问不同区域的 VPC 域](#cross-region-scenario-4)

每种场景都涵盖同一个账户的跨区域访问。要进行跨账户跨区域访问，请将这些场景中的步骤与中所述的跨账户角色设置结合起来。[跨账户数据访问 OpenSearch 域名](application-cross-account-data-access-domains.md)

## 场景 1：IAM 用户访问不同区域的公共域
<a name="cross-region-scenario-1"></a>

在此场景中，您在一个区域中创建一个 OpenSearch UI 应用程序，然后使用同一个账户将其连接到不同区域中的公共 OpenSearch 域。

### 步骤 1：创建 OpenSearch 域名（目标区域）
<a name="cross-region-scenario-1-step-1"></a>

在目标区域创建 OpenSearch 启用精细访问控制的域。将访问策略的范围限定为账户根或特定的 IAM 委托人。

```
aws opensearch create-domain \
  --domain-name {{domain-name}} \
  --engine-version OpenSearch_2.19 \
  --cluster-config InstanceType=m5.large.search,InstanceCount=1 \
  --ebs-options "EBSEnabled=true,VolumeType=gp3,VolumeSize=100" \
  --advanced-security-options '{"Enabled":true,"InternalUserDatabaseEnabled":true,"MasterUserOptions":{"MasterUserName":"{{admin}}","MasterUserPassword":"{{master-password}}"}}' \
  --node-to-node-encryption-options '{"Enabled":true}' \
  --encryption-at-rest-options '{"Enabled":true}' \
  --domain-endpoint-options '{"EnforceHTTPS":true,"TLSSecurityPolicy":"Policy-Min-TLS-1-2-2019-07"}' \
  --access-policies '{"Version":"2012-10-17",		 	 	 "Statement":[{"Effect":"Allow","Principal":{"AWS":"arn:aws:iam::{{account-id}}:root"},"Action":"es:ESHttp*","Resource":"arn:aws:es:{{target-region}}:{{account-id}}:domain/{{domain-name}}/*"}]}' \
  --region {{target-region}}
```

等待域名状态变为`Active`后再继续。

### 步骤 2：创建 OpenSearch UI 应用程序（应用程序区域）
<a name="cross-region-scenario-1-step-2"></a>

使用跨区域数据源在应用程序区域中创建应用程序。区域是自动从数据源 ARN 中提取的。

```
aws opensearch create-application \
  --region {{application-region}} \
  --name "{{cross-region-iam-app}}" \
  --data-sources '[{
    "dataSourceArn":"arn:aws:es:{{target-region}}:{{account-id}}:domain/{{domain-name}}",
    "dataSourceDescription":"{{Cross-region domain}}"
  }]' \
  --app-configs '[{"key":"opensearchDashboards.dashboardAdmin.users","value":"[\"{{test-user}}\"]"}]'
```

### 第 3 步：验证和访问
<a name="cross-region-scenario-1-step-3"></a>

检索应用程序详细信息以获取端点 URL：

```
aws opensearch get-application \
  --region {{application-region}} \
  --id {{application-id}}
```
+ 从响应中导航到应用程序终端节点 URL。
+ 使用 IAM 证书登录。
+ IAM 用户使用自己的证书签署数据平面请求。
+ 目标域的访问策略和后端角色映射控制着用户可以访问的数据。

## 场景 2：IAM 身份中心用户访问不同区域的公共域
<a name="cross-region-scenario-2"></a>

在此场景中，您可以在一个区域中创建采用 IAM Identity Center 身份验证的 OpenSearch UI 应用程序，然后使用同一账户将其连接到不同区域中的公共 OpenSearch 域。

### 步骤 1：在启用 IAM 身份中心的情况下创建 OpenSearch 域（目标区域）
<a name="cross-region-scenario-2-step-1"></a>

在目标区域创建具有精细访问控制并启用 IAM Identity Center 集成的 OpenSearch 域。使用带`IdentityCenterInstanceRegion`的`--identity-center-options`参数指定您的 IAM 身份中心实例所在的区域。此区域应与 OpenSearch UI 应用程序的托管区域相同。

```
aws opensearch create-domain \
  --domain-name {{domain-name}} \
  --engine-version OpenSearch_2.19 \
  --cluster-config InstanceType=m5.large.search,InstanceCount=1 \
  --ebs-options "EBSEnabled=true,VolumeType=gp3,VolumeSize=100" \
  --advanced-security-options '{"Enabled":true,"InternalUserDatabaseEnabled":true,"MasterUserOptions":{"MasterUserName":"{{admin}}","MasterUserPassword":"{{master-password}}"}}' \
  --node-to-node-encryption-options '{"Enabled":true}' \
  --encryption-at-rest-options '{"Enabled":true}' \
  --domain-endpoint-options '{"EnforceHTTPS":true,"TLSSecurityPolicy":"Policy-Min-TLS-1-2-2019-07"}' \
  --identity-center-options '{"EnabledAPIAccess":true,"IdentityCenterInstanceARN":"arn:aws:sso:::instance/ssoins-{{instance-id}}","IdentityCenterInstanceRegion":"{{idc-region}}","RolesKey":"GroupId","SubjectKey":"UserId"}' \
  --access-policies '{"Version":"2012-10-17",		 	 	 "Statement":[{"Effect":"Allow","Principal":{"AWS":"arn:aws:iam::{{account-id}}:role/{{NeoIdCAppRole}}"},"Action":"es:ESHttp*","Resource":"arn:aws:es:{{target-region}}:{{account-id}}:domain/{{domain-name}}/*"}]}' \
  --region {{target-region}}
```

等待域名状态变为`Active`后再继续。

### 步骤 2：为 IAM 身份中心应用程序创建 IAM 角色
<a name="cross-region-scenario-2-step-2"></a>

创建 OpenSearch UI 用于 IAM 身份中心用户数据平面访问的 IAM 角色。

**创建 IAM 身份中心应用程序角色**

1. 创建仅包含`sts:AssumeRole`声明的信任策略。在下一步中创建应用程序后，您将更新此策略以添加该`sts:SetContext`声明。

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

1. 创建权限策略：

   ```
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [{
       "Sid": "OpenSearchDomain",
       "Effect": "Allow",
       "Action": ["es:ESHttp*"],
       "Resource": "arn:aws:es:{{target-region}}:{{account-id}}:domain/{{domain-name}}/*"
     }]
   }
   ```

1. 创建角色并附加策略：

   ```
   aws iam create-role \
     --role-name {{NeoIdCAppRole}} \
     --assume-role-policy-document file://{{neoidc-trust-policy.json}}
   
   aws iam put-role-policy \
     --role-name {{NeoIdCAppRole}} \
     --policy-name {{NeoIdCAppPermissions}} \
     --policy-document file://{{neoidc-permissions-policy.json}}
   ```

### 步骤 3：使用 IAM 身份中心（应用程序区域）创建 OpenSearch UI 应用程序
<a name="cross-region-scenario-2-step-3"></a>

**注意**  
确保 IAM Identity Center 实例与 OpenSearch UI 应用程序区域位于同一区域。

```
aws opensearch create-application \
  --region {{application-region}} \
  --name "{{cross-region-idc-app}}" \
  --iam-identity-center-options '{
    "enabled":true,
    "iamIdentityCenterInstanceArn":"arn:aws:sso:::instance/ssoins-{{instance-id}}",
    "iamRoleForIdentityCenterApplicationArn":"arn:aws:iam::{{account-id}}:role/{{NeoIdCAppRole}}"
  }' \
  --data-sources '[{
    "dataSourceArn":"arn:aws:es:{{target-region}}:{{account-id}}:domain/{{domain-name}}",
    "dataSourceDescription":"{{Cross-region domain}}"
  }]' \
  --app-configs '[{"key":"opensearchDashboards.dashboardAdmin.users","value":"[\"{{test-user}}\"]"}]'
```

创建应用程序后，记下响应中的 SSO 应用程序 ID。然后更新 IAM Identity Center 应用程序角色的信任策略以添加以下`sts:SetContext`声明：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "application.opensearchservice.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "application.opensearchservice.amazonaws.com"
      },
      "Action": "sts:SetContext",
      "Condition": {
        "ForAllValues:ArnEquals": {
          "sts:RequestContextProviders": "arn:aws:iam::{{account-id}}:oidc-provider/portal.sso.{{idc-region}}.amazonaws.com/apl/{{application-id}}"
        }
      }
    }
  ]
}
```

```
aws iam update-assume-role-policy \
  --role-name {{NeoIdCAppRole}} \
  --policy-document file://{{updated-trust-policy.json}}
```

### 步骤 4：创建和分配 IAM 身份中心用户和群组
<a name="cross-region-scenario-2-step-4"></a>

**创建 IAM 身份中心用户**  
运行如下命令。将 {{placeholder values}} 替换为您自己的信息。

```
aws identitystore create-user \
  --identity-store-id {{d-directory-id}} \
  --user-name {{user-email}} \
  --display-name "{{display-name}}" \
  --name Formatted=string,FamilyName={{last-name}},GivenName={{first-name}} \
  --emails Value={{user-email}},Type=work,Primary=true
```

**创建 IAM 身份中心群组并添加用户**  
运行以下 命令：

```
aws identitystore create-group \
  --identity-store-id {{d-directory-id}} \
  --display-name "{{OpenSearchUsers}}" \
  --description "{{Users with OpenSearch access}}"

aws identitystore create-group-membership \
  --identity-store-id {{d-directory-id}} \
  --group-id {{group-id}} \
  --member-id UserId={{user-id}}
```

**将用户或组分配给应用程序**  
运行如下命令：

```
aws sso-admin create-application-assignment \
  --application-arn "arn:aws:sso::{{account-id}}:application/ssoins-{{instance-id}}/apl-{{application-id}}" \
  --principal-id {{user-id-or-group-id}} \
  --principal-type {{USER}}
```

**在目标域上配置后端角色映射**  
将 IAM 身份中心组映射到目标域上的 OpenSearch 安全角色：

```
curl -XPATCH "https://{{domain-endpoint}}/_plugins/_security/api/rolesmapping/all_access" \
  -u {{admin}}:{{master-password}} \
  -H 'Content-Type: application/json' \
  -d '[{"op": "add", "path": "/backend_roles", "value": ["{{group-id}}"]}]'
```

### 第 5 步：验证和访问
<a name="cross-region-scenario-2-step-5"></a>

检索应用程序详细信息以获取端点 URL：

```
aws opensearch get-application \
  --region {{application-region}} \
  --id {{application-id}}
```
+ 导航到应用程序终端节点 URL。
+ 使用 IAM 身份中心用户证书登录。
+ IAM 身份中心用户的数据请求是使用 IAM 身份中心应用程序角色签名的。
+ 域上的后端角色映射控制数据访问权限。

## 场景 3：IAM 用户访问不同区域的 VPC 域
<a name="cross-region-scenario-3"></a>

在此场景中，您在一个区域中创建 OpenSearch UI 应用程序，然后使用同一个账户将其连接到不同区域的 VPC OpenSearch 域。VPC 域需要额外的网络配置和具有跨区域支持的明确的 VPC 终端节点授权。

### 步骤 1：设置 VPC（目标区域）
<a name="cross-region-scenario-3-step-1"></a>

如果目标区域中已存在 VPC，请跳过此步骤。

```
# Create VPC
aws ec2 create-vpc \
  --cidr-block 10.0.0.0/16 \
  --region {{target-region}}

# Create subnet
aws ec2 create-subnet \
  --vpc-id {{vpc-id}} \
  --cidr-block 10.0.1.0/24 \
  --availability-zone {{target-region}}a \
  --region {{target-region}}

# Create security group
aws ec2 create-security-group \
  --group-name {{opensearch-vpc-sg}} \
  --description "Security group for OpenSearch VPC domain" \
  --vpc-id {{vpc-id}} \
  --region {{target-region}}

# Allow inbound HTTPS
aws ec2 authorize-security-group-ingress \
  --group-id {{security-group-id}} \
  --protocol tcp \
  --port 443 \
  --cidr 10.0.0.0/16 \
  --region {{target-region}}
```

了解有关[创建 VPC 域](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/vpc.html)的更多信息。

### 步骤 2：创建 VPC 域（目标区域）
<a name="cross-region-scenario-3-step-2"></a>

```
aws opensearch create-domain \
  --domain-name {{vpc-domain-name}} \
  --engine-version OpenSearch_2.19 \
  --cluster-config InstanceType=m5.large.search,InstanceCount=1 \
  --ebs-options "EBSEnabled=true,VolumeType=gp3,VolumeSize=100" \
  --vpc-options "SubnetIds={{subnet-id}},SecurityGroupIds={{security-group-id}}" \
  --advanced-security-options '{"Enabled":true,"InternalUserDatabaseEnabled":true,"MasterUserOptions":{"MasterUserName":"{{admin}}","MasterUserPassword":"{{master-password}}"}}' \
  --node-to-node-encryption-options '{"Enabled":true}' \
  --encryption-at-rest-options '{"Enabled":true}' \
  --domain-endpoint-options '{"EnforceHTTPS":true,"TLSSecurityPolicy":"Policy-Min-TLS-1-2-2019-07"}' \
  --access-policies '{"Version":"2012-10-17",		 	 	 "Statement":[{"Effect":"Allow","Principal":{"AWS":"arn:aws:iam::{{account-id}}:root"},"Action":"es:ESHttp*","Resource":"arn:aws:es:{{target-region}}:{{account-id}}:domain/{{vpc-domain-name}}/*"}]}' \
  --region {{target-region}}
```

等待域名状态变为`Active`后再继续。

### 步骤 3：为具有跨区域支持（目标区域）的 OpenSearch UI 服务主体授权 VPC 终端节点
<a name="cross-region-scenario-3-step-3"></a>

```
# Authorize the service principal with cross-region support
aws opensearch authorize-vpc-endpoint-access \
  --domain-name {{vpc-domain-name}} \
  --service "application.opensearchservice.amazonaws.com" \
  --service-options '{"SupportedRegions":["{{target-region}}","{{application-region}}"]}' \
  --region {{target-region}}

# Verify authorization
aws opensearch list-vpc-endpoint-access \
  --domain-name {{vpc-domain-name}} \
  --region {{target-region}}
```

预期的回应：

```
{
  "AuthorizedPrincipalList": [
    {
      "PrincipalType": "AWS_SERVICE",
      "Principal": "application.opensearchservice.amazonaws.com",
      "ServiceOptions": {
        "SupportedRegions": ["{{target-region}}", "{{application-region}}"]
      }
    }
  ]
}
```

### 步骤 4：创建 OpenSearch UI 应用程序（应用程序区域）
<a name="cross-region-scenario-3-step-4"></a>

```
aws opensearch create-application \
  --region {{application-region}} \
  --name "{{cross-region-vpc-iam-app}}" \
  --data-sources '[{
    "dataSourceArn":"arn:aws:es:{{target-region}}:{{account-id}}:domain/{{vpc-domain-name}}",
    "dataSourceDescription":"{{Cross-region VPC domain}}"
  }]' \
  --app-configs '[{"key":"opensearchDashboards.dashboardAdmin.users","value":"[\"{{test-user}}\"]"}]'
```

### 第 5 步：验证和访问
<a name="cross-region-scenario-3-step-5"></a>

检索应用程序详细信息以获取端点 URL：

```
aws opensearch get-application \
  --region {{application-region}} \
  --id {{application-id}}
```
+ 从响应中导航到应用程序终端节点 URL。
+ 使用 IAM 证书登录。
+ IAM 用户使用自己的证书签署数据平面请求。
+ 目标域的访问策略和后端角色映射控制着用户可以访问的数据。

## 场景 4：IAM 身份中心用户访问不同区域的 VPC 域
<a name="cross-region-scenario-4"></a>

在此场景中，您将在一个区域中创建采用 IAM Identity Center 身份验证的 OpenSearch UI 应用程序，然后使用同一账户将其连接到不同区域的 VPC OpenSearch 域。

### 步骤 1：设置 VPC（目标区域）
<a name="cross-region-scenario-4-step-1"></a>

如果目标区域中已存在 VPC，请跳过此步骤。

```
# Create VPC
aws ec2 create-vpc \
  --cidr-block 10.0.0.0/16 \
  --region {{target-region}}

# Create subnet
aws ec2 create-subnet \
  --vpc-id {{vpc-id}} \
  --cidr-block 10.0.1.0/24 \
  --availability-zone {{target-region}}a \
  --region {{target-region}}

# Create security group
aws ec2 create-security-group \
  --group-name {{opensearch-vpc-sg}} \
  --description "Security group for OpenSearch VPC domain" \
  --vpc-id {{vpc-id}} \
  --region {{target-region}}

# Allow inbound HTTPS
aws ec2 authorize-security-group-ingress \
  --group-id {{security-group-id}} \
  --protocol tcp \
  --port 443 \
  --cidr 10.0.0.0/16 \
  --region {{target-region}}
```

了解有关[创建 VPC 域](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/vpc.html)的更多信息。

### 步骤 2：在启用 IAM 身份中心的情况下创建 VPC 域（目标区域）
<a name="cross-region-scenario-4-step-2"></a>

在目标区域创建具有精细访问控制、IAM Identity Center 集成和 VPC 配置的 OpenSearch 域。更新访问策略以允许 IAM Identity Center 应用程序角色并添加`--identity-center-options`参数：

```
aws opensearch create-domain \
  --domain-name {{vpc-domain-name}} \
  --engine-version OpenSearch_2.19 \
  --cluster-config InstanceType=m5.large.search,InstanceCount=1 \
  --ebs-options "EBSEnabled=true,VolumeType=gp3,VolumeSize=100" \
  --vpc-options "SubnetIds={{subnet-id}},SecurityGroupIds={{security-group-id}}" \
  --advanced-security-options '{"Enabled":true,"InternalUserDatabaseEnabled":true,"MasterUserOptions":{"MasterUserName":"{{admin}}","MasterUserPassword":"{{master-password}}"}}' \
  --node-to-node-encryption-options '{"Enabled":true}' \
  --encryption-at-rest-options '{"Enabled":true}' \
  --domain-endpoint-options '{"EnforceHTTPS":true,"TLSSecurityPolicy":"Policy-Min-TLS-1-2-2019-07"}' \
  --identity-center-options '{"EnabledAPIAccess":true,"IdentityCenterInstanceARN":"arn:aws:sso:::instance/ssoins-{{instance-id}}","IdentityCenterInstanceRegion":"{{idc-region}}","RolesKey":"GroupId","SubjectKey":"UserId"}' \
  --access-policies '{"Version":"2012-10-17",		 	 	 "Statement":[{"Effect":"Allow","Principal":{"AWS":"arn:aws:iam::{{account-id}}:role/{{NeoIdCAppRole}}"},"Action":"es:ESHttp*","Resource":"arn:aws:es:{{target-region}}:{{account-id}}:domain/{{vpc-domain-name}}/*"}]}' \
  --region {{target-region}}
```

等待域名状态变为`Active`后再继续。

### 步骤 3：为具有跨区域支持（目标区域）的 OpenSearch UI 服务主体授权 VPC 终端节点
<a name="cross-region-scenario-4-step-3"></a>

**重要**  
这是具有跨区域访问权限的 VPC 域所独有的关键步骤。必须明确授权 OpenSearch UI 服务才能访问 VPC 终端节点，并且您必须在`SupportedRegions`列表中包含应用程序区域。

```
# Authorize the service principal with cross-region support
aws opensearch authorize-vpc-endpoint-access \
  --domain-name {{vpc-domain-name}} \
  --service "application.opensearchservice.amazonaws.com" \
  --service-options '{"SupportedRegions":["{{target-region}}","{{application-region}}"]}' \
  --region {{target-region}}

# Verify authorization
aws opensearch list-vpc-endpoint-access \
  --domain-name {{vpc-domain-name}} \
  --region {{target-region}}
```

预期的回应：

```
{
  "AuthorizedPrincipalList": [
    {
      "PrincipalType": "AWS_SERVICE",
      "Principal": "application.opensearchservice.amazonaws.com",
      "ServiceOptions": {
        "SupportedRegions": ["{{target-region}}", "{{application-region}}"]
      }
    }
  ]
}
```

### 步骤 4：为 IAM 身份中心应用程序创建 IAM 角色
<a name="cross-region-scenario-4-step-4"></a>

创建 OpenSearch UI 用于 IAM 身份中心用户数据平面访问的 IAM 角色。

**创建 IAM 身份中心应用程序角色**

1. 创建仅包含`sts:AssumeRole`声明的信任策略。在下一步中创建应用程序后，您将更新此策略以添加该`sts:SetContext`声明。

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

1. 创建权限策略：

   ```
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [{
       "Sid": "OpenSearchDomain",
       "Effect": "Allow",
       "Action": ["es:ESHttp*"],
       "Resource": "arn:aws:es:{{target-region}}:{{account-id}}:domain/{{vpc-domain-name}}/*"
     }]
   }
   ```

1. 创建角色并附加策略：

   ```
   aws iam create-role \
     --role-name {{NeoIdCAppRole}} \
     --assume-role-policy-document file://{{neoidc-trust-policy.json}}
   
   aws iam put-role-policy \
     --role-name {{NeoIdCAppRole}} \
     --policy-name {{NeoIdCAppPermissions}} \
     --policy-document file://{{neoidc-permissions-policy.json}}
   ```

### 步骤 5：使用 IAM 身份中心创建 OpenSearch UI 应用程序（应用程序区域）
<a name="cross-region-scenario-4-step-5"></a>

```
aws opensearch create-application \
  --region {{application-region}} \
  --name "{{cross-region-vpc-idc-app}}" \
  --iam-identity-center-options '{
    "enabled":true,
    "iamIdentityCenterInstanceArn":"arn:aws:sso:::instance/ssoins-{{instance-id}}",
    "iamRoleForIdentityCenterApplicationArn":"arn:aws:iam::{{account-id}}:role/{{NeoIdCAppRole}}"
  }' \
  --data-sources '[{
    "dataSourceArn":"arn:aws:es:{{target-region}}:{{account-id}}:domain/{{vpc-domain-name}}",
    "dataSourceDescription":"{{Cross-region VPC domain}}"
  }]' \
  --app-configs '[{"key":"opensearchDashboards.dashboardAdmin.users","value":"[\"{{test-user}}\"]"}]'
```

创建应用程序后，记下响应中的 SSO 应用程序 ID。然后更新 IAM Identity Center 应用程序角色的信任策略以添加以下`sts:SetContext`声明：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "application.opensearchservice.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "application.opensearchservice.amazonaws.com"
      },
      "Action": "sts:SetContext",
      "Condition": {
        "ForAllValues:ArnEquals": {
          "sts:RequestContextProviders": "arn:aws:iam::{{account-id}}:oidc-provider/portal.sso.{{idc-region}}.amazonaws.com/apl/{{application-id}}"
        }
      }
    }
  ]
}
```

```
aws iam update-assume-role-policy \
  --role-name {{NeoIdCAppRole}} \
  --policy-document file://{{updated-trust-policy.json}}
```

### 步骤 6：创建和分配 IAM 身份中心用户和群组
<a name="cross-region-scenario-4-step-6"></a>

按照与创建用户、群组、将他们分配给应用程序以及在目标域上配置后端角色映射相同的步骤操作。[步骤 4：创建和分配 IAM 身份中心用户和群组](#cross-region-scenario-2-step-4)

### 第 7 步：验证和访问
<a name="cross-region-scenario-4-step-7"></a>

检索应用程序详细信息以获取端点 URL：

```
aws opensearch get-application \
  --region {{application-region}} \
  --id {{application-id}}
```
+ 导航到应用程序终端节点 URL。
+ 使用 IAM 身份中心用户证书登录。
+ IAM 身份中心用户的数据请求是使用 IAM 身份中心应用程序角色签名的。
+ 域上的后端角色映射控制数据访问权限。

## 管理 应用程序
<a name="cross-region-managing-applications"></a>

**使用跨区域数据源更新应用程序**  
运行如下命令。将 {{placeholder values}} 替换为您自己的信息。

```
aws opensearch update-application \
  --region {{application-region}} \
  --id {{application-id}} \
  --data-sources '[{
    "dataSourceArn":"arn:aws:es:{{target-region-1}}:{{account-id}}:domain/{{domain-1}}",
    "dataSourceDescription":"{{Domain in target Region 1}}"
  },{
    "dataSourceArn":"arn:aws:es:{{target-region-2}}:{{account-id}}:domain/{{domain-2}}",
    "dataSourceDescription":"{{Domain in target Region 2}}"
  }]'
```

**重要**  
更新操作将替换整个数据源数组。包括您要保留的所有数据源。

**列出应用程序**  
运行如下命令：

```
aws opensearch list-applications \
  --region {{application-region}}
```

**删除应用程序**  
运行如下命令：

```
aws opensearch delete-application \
  --region {{application-region}} \
  --id {{application-id}}
```

**撤消特定区域的 VPC 终端节点访问权限**  
要撤消特定 AWS 区域 s 的跨区域访问权限，同时保留其他区域，请使用带有 Regions 的`--service-options`参数来撤消：

```
aws opensearch revoke-vpc-endpoint-access \
  --domain-name {{vpc-domain-name}} \
  --service "application.opensearchservice.amazonaws.com" \
  --service-options '{"SupportedRegions":["{{region-to-revoke}}"]}' \
  --region {{target-region}}
```

## 快速参考
<a name="cross-region-quick-reference"></a>

下表总结了域名类型、身份验证方法以及同区域访问与跨区域访问之间的主要区别。


**公共域与 VPC 域的比较**  

| 方面 | 公共领域 | VPC 域 | 
| --- | --- | --- | 
| VPC 终端节点授权 | 非必需 | 必填项 — 必须application.opensearchservice.amazonaws.com通过授权 SupportedRegions | 
| 网络设置 | 无 | VPC、子网、入站 HTTPS (443) 的安全组 | 
| IAM 访问策略 | 必需 | 必需 | 


**IAM 用户与 IAM 身份中心用户的比较**  

| 方面 | IAM 用户 | IAM Identity Center 用户 | 
| --- | --- | --- | 
| 数据平面凭证 | 用户自己的 IAM 证书 | IAM 身份中心应用程序角色 | 
| 访问控制 | 域访问策略和后端角色映射 | 域访问策略和后端角色映射 | 
| 应用程序区域约束 | 任何区域 | 必须与 IAM 身份中心实例位于同一区域 | 
| 域配置 | 标准 | 需要--identity-center-options使用 IdentityCenterInstanceRegion | 
| 其他设置 | 无 | IAM Identity Center 应用程序角色、 user/group 创建、应用程序分配、后端角色映射 | 


**同区域与跨区域对比**  

| 方面 | 同区域 | 跨区域 | 
| --- | --- | --- | 
| 数据源 ARN | 与应用程序相同的区域 | 与应用程序不同的区域（同一个分区） | 
| VPC 终端节点授权 | 省略 --service-options | 包含--service-options在 SupportedRegions | 
| IAM 身份中心域配置 | IdentityCenterInstanceRegion 可选 | IdentityCenterInstanceRegion 必需 | 
| 跨分区支持 | 不适用 | 不支持-数据源必须位于同一个分区中 | 

## 重要提示
<a name="cross-region-important-notes"></a>
+ 跨区域数据源关联需要在目标域上启用精细的访问控制。
+ 跨区域数据源必须位于同一个分区内。不支持跨分区访问（例如，从`aws`到`aws-cn`）。
+ 数据源区域是自动从数据源 ARN 中提取的。`CreateApplication`或中不需要额外的区域参数`UpdateApplication` APIs。
+ 对于同一个账户的跨区域数据源，`iamRoleForDataSourceArn`不是必需的。只有跨账户数据源才需要它。
+ 对于 VPC 域，您必须在调用时在`SupportedRegions`参数中包含应用区域`AuthorizeVpcEndpointAccess`。省略仅`--service-options`授予同区域访问权限。
+ 对于 IAM 身份中心流程， OpenSearch 用户界面应用程序必须与 IAM 身份中心实例位于同一区域。
+ 对于具有跨区域域名的 IAM Identity Center 流程，目标域必须包含`IdentityCenterInstanceRegion`在中`--identity-center-options`才能启用跨区域令牌自省。
+ 支持的引擎版本： OpenSearch 1.3 及以上。

## 问题排查
<a name="cross-region-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| 应用程序创建失败并显示 “无法访问域” | 验证该域是否存在于目标区域中，并且是否启用了精细的访问控制。对于跨账户场景，请验证跨账户角色是否具有es:DescribeDomain权限以及信任策略允许源账户。 | 
| 跨区域 VPC 域访问失败 | 确保 VPC 终端节点已获得application.opensearchservice.amazonaws.com授权，其中包含应用程序区域SupportedRegions。 | 
| IAM 用户数据平面访问被拒绝 | 检查目标域访问策略是否允许 IAM 用户或角色委托人，以及精细的访问控制后端角色映射是否授予了相应的权限。 | 
| IAM 身份中心用户数据平面访问被拒绝 | 验证后端角色映射是否包含 IAM Identity Center 组 ID、域策略允许 IAM Identity Center 应用程序角色以及IdentityCenterInstanceRegion是否正确设置为与域上的 OpenSearch UI 应用程序相同的区域。 | 
| 跨分区数据源被拒绝 | 不支持跨分区访问。确保数据源 ARN 与应用程序位于同一个分区中。 | 
| 跨区域域的 IAM 身份中心身份验证失败 | 验证IdentityCenterInstanceRegion是否已设置为启用您的 IAM 身份中心实例的正确区域。 OpenSearch 用户界面应用程序也必须位于同一区域。 | 