

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

# 跨区域和跨账户数据访问
<a name="application-cross-region-cross-account"></a>

OpenSearch 用户界面支持访问来自不同 OpenSearch AWS 账户域的数据。 AWS 区域您可以根据自己的要求从两种方法中进行选择。下表对这两种方法进行了比较。

**注意**  
跨账户数据访问和跨集群搜索都仅适用于域。 OpenSearch 这两种方法都不支持 OpenSearch 无服务器集合。


| 方面 | 跨账户数据访问 | 跨集群搜索 | 
| --- | --- | --- | 
| 功能 | 在 OpenSearch UI 中将来自其他账户的域名关联为直接数据源 | 使用跨集群搜索连接跨连接的域查询数据 | 
| 机制 | 直接访问 — OpenSearch 用户界面直接连接到另一个账户中的目标网域 | 间接访问 — 需要与 OpenSearch 用户界面相同的帐户中的本地域才能将请求中继到远程域 | 
| 跨账户支持 | 支持 | 是 | 
| 跨区域支持 | 不是 — 源域和目标域必须位于同一个域中 AWS 区域 | 是 — 源域和目标域可以位于不同的域 AWS 区域中 | 
| 跨域合并数据 | 否 — 每个域都作为单独的数据源独立查询 | 是 — 单个查询可以汇总来自多个连接域的结果 | 
| 身份验证方法 | IAM 和 AWS IAM Identity Center | IAM（具有精细的访问控制） | 
| 设置复杂性 | 更低 — 需要跨账户 IAM 角色进行验证 | 更高 — 需要跨集群连接、两个域上的访问策略以及精细的访问控制 | 
|  OpenSearch 用户界面中的数据源可见性 | 每个跨账户域都显示为单独的数据源 | 远程域可通过本地源域的连接别名进行访问 | 
| 对远程域的写入权限 | 是 — 由目标域的访问策略控制 | 否 — 跨集群搜索提供对远程域的只读访问权限 | 

**Topics**
+ [跨账户数据访问 OpenSearch 域名](application-cross-account-data-access-domains.md)
+ [跨集群搜索](application-cross-cluster-search.md)

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

您可以在一个账户中配置 OpenSearch 用户界面应用程序，以访问不同账户中的 OpenSearch 域名。当您使用跨账户数据源创建 OpenSearch UI 应用程序时，您需要提供`iamRoleForDataSourceArn`指向目标账户中的 IAM 角色的。 OpenSearch 用户界面通过担任此角色并调用验证域可访问性`es:DescribeDomain`来验证请求。跨账户角色仅用于控制平面验证。数据平面访问由目标域的访问策略单独控制。

**代码示例**  
本主题中的代码示例仅用于说明目的。它们演示了基本功能，可能不包括错误处理、安全最佳实践或生产就绪功能。在生产环境中使用示例代码之前，请对其进行审查和修改以满足您的特定要求，并在您的环境中进行全面测试。

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

源账户  
托管您的 OpenSearch UI 应用程序的。 AWS 账户 

目标账户  
 OpenSearch 域 AWS 账户 所在的位置。

跨账户角色  
目标账户中的 IAM 角色，仅用于控制平面验证。此角色只需要`es:DescribeDomain`权限。

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

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

在设置跨账户数据访问权限之前，请确保您具备以下条件：
+ AWS CLI 已安装并配置
+ 同时访问源和目标 AWS 账户
+ 对于 IAM 身份中心流程： AWS IAM Identity Center 组织实例

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

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

## 场景 1：IAM 用户访问公共域
<a name="cross-account-scenario-1"></a>

### 步骤 1：创建跨账户 IAM 角色（目标账户）
<a name="scenario-1-step-1"></a>

在目标账户中创建 IAM 角色，允许源账户代入该角色进行域验证。

**创建跨账户角色**

1. 创建允许源账户担任该角色的信任策略：

   ```
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [{
       "Effect": "Allow",
       "Principal": {
         "AWS": "arn:aws:iam::source-account-id:root"
       },
       "Action": "sts:AssumeRole"
     }]
   }
   ```

1. 创建该角色：

   ```
   aws iam create-role \
     --role-name OpenSearchUIAccessRole \
     --assume-role-policy-document file://trust-policy.json
   ```

1. 创建仅包含以下`es:DescribeDomain`操作的权限策略：

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

1. 将权限策略附加到角色：

   ```
   aws iam put-role-policy \
     --role-name OpenSearchUIAccessRole \
     --policy-name ValidationOnly \
     --policy-document file://permissions-policy.json
   ```

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

在目标账户中创建一个启用精细访问控制和加密的 OpenSearch 域：

```
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":"*"},"Action":"es:ESHttp*","Resource":"arn:aws:es:region:target-account-id:domain/domain-name/*"}]}' \
  --region region
```

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

### 步骤 3：创建 OpenSearch UI 应用程序（源账户）
<a name="scenario-1-step-3"></a>

使用跨账户数据源在源账户中创建应用程序：

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

### 步骤 4：验证和访问
<a name="scenario-1-step-4"></a>

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

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

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

### 步骤 1：创建跨账户 IAM 角色（目标账户）
<a name="scenario-2-step-1"></a>

在目标账户中创建 IAM 角色，允许源账户代入该角色进行域验证。

**创建跨账户角色**

1. 创建允许源账户担任该角色的信任策略：

   ```
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [{
       "Effect": "Allow",
       "Principal": {
         "AWS": "arn:aws:iam::source-account-id:root"
       },
       "Action": "sts:AssumeRole"
     }]
   }
   ```

1. 创建该角色：

   ```
   aws iam create-role \
     --role-name OpenSearchUIAccessRole \
     --assume-role-policy-document file://trust-policy.json
   ```

1. 创建仅包含以下`es:DescribeDomain`操作的权限策略：

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

1. 将权限策略附加到角色：

   ```
   aws iam put-role-policy \
     --role-name OpenSearchUIAccessRole \
     --policy-name ValidationOnly \
     --policy-document file://permissions-policy.json
   ```

### 步骤 2：创建 OpenSearch 域名（目标账户）
<a name="scenario-2-step-2"></a>

在目标账户中创建 OpenSearch 域名。使用与相同的命令[步骤 2：创建 OpenSearch 域名（目标账户）](#scenario-1-step-2)，但要更新访问策略以允许来自源账户的 IAM Identity Center 应用程序角色：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [{
    "Effect": "Allow",
    "Principal": {
      "AWS": "arn:aws:iam::source-account-id:role/NeoIdCAppRole"
    },
    "Action": "es:ESHttp*",
    "Resource": "arn:aws:es:region:target-account-id:domain/domain-name/*"
  }]
}
```

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

### 步骤 3：为 IAM 身份中心应用程序（源账户）创建 IAM 角色
<a name="scenario-2-step-3"></a>

在源账户中创建 IAM 角色，用户 OpenSearch 界面使用该角色访问 IAM Identity Center 用户数据平面。

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

1. 创建信任策略：

   ```
   {
     "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::source-account-id:oidc-provider/portal.sso.region.amazonaws.com/apl/application-id"
           }
         }
       }
     ]
   }
   ```

1. 创建权限策略：

   ```
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [{
       "Sid": "OpenSearchDomain",
       "Effect": "Allow",
       "Action": ["es:ESHttp*"],
       "Resource": "*"
     }]
   }
   ```

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
   ```

### 步骤 4：使用 IAM 身份中心（源账户）创建 OpenSearch UI 应用程序
<a name="scenario-2-step-4"></a>

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

### 步骤 5：创建和分配 IAM 身份中心用户和群组
<a name="scenario-2-step-5"></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:::source-account-id:application/ssoins-instance-id/apl-application-id" \
  --principal-id user-id-or-group-id \
  --principal-type USER
```

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

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

### 步骤 6：验证和访问
<a name="scenario-2-step-6"></a>

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

## 场景 3：IAM 用户访问 VPC 域
<a name="cross-account-scenario-3"></a>

### 步骤 1：创建跨账户 IAM 角色（目标账户）
<a name="scenario-3-step-1"></a>

在目标账户中创建 IAM 角色，允许源账户代入该角色进行域验证。

**创建跨账户角色**

1. 创建允许源账户担任该角色的信任策略：

   ```
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [{
       "Effect": "Allow",
       "Principal": {
         "AWS": "arn:aws:iam::source-account-id:root"
       },
       "Action": "sts:AssumeRole"
     }]
   }
   ```

1. 创建该角色：

   ```
   aws iam create-role \
     --role-name OpenSearchUIAccessRole \
     --assume-role-policy-document file://trust-policy.json
   ```

1. 创建仅包含以下`es:DescribeDomain`操作的权限策略：

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

1. 将权限策略附加到角色：

   ```
   aws iam put-role-policy \
     --role-name OpenSearchUIAccessRole \
     --policy-name ValidationOnly \
     --policy-document file://permissions-policy.json
   ```

### 步骤 2：设置 VPC（目标账户）
<a name="scenario-3-step-2"></a>

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

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

# Create subnet
aws ec2 create-subnet \
  --vpc-id vpc-id \
  --cidr-block 10.0.1.0/24 \
  --availability-zone regiona \
  --region 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 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 region
```

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

### 步骤 3：创建 VPC 域（目标账户）
<a name="scenario-3-step-3"></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":"*"},"Action":"es:ESHttp*","Resource":"arn:aws:es:region:target-account-id:domain/vpc-domain-name/*"}]}' \
  --region region
```

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

### 步骤 4：为 OpenSearch UI 服务委托人（目标账户）授权 VPC 终端节点
<a name="scenario-3-step-4"></a>

**重要**  
这是 VPC 域所独有的关键步骤。必须明确授权 OpenSearch 用户界面服务才能访问 VPC 终端节点。

```
# Authorize the service principal
aws opensearch authorize-vpc-endpoint-access \
  --domain-name vpc-domain-name \
  --service "application.opensearchservice.amazonaws.com" \
  --region region

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

预期的回应：

```
{
  "AuthorizedPrincipalList": [
    {
      "PrincipalType": "AWS_SERVICE",
      "Principal": "application.opensearchservice.amazonaws.com"
    }
  ]
}
```

### 步骤 5：创建 OpenSearch UI 应用程序（源账户）
<a name="scenario-3-step-5"></a>

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

### 步骤 6：验证和访问
<a name="scenario-3-step-6"></a>

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

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

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

### 步骤 1：创建跨账户 IAM 角色（目标账户）
<a name="scenario-4-step-1"></a>

在目标账户中创建 IAM 角色，允许源账户代入该角色进行域验证。

**创建跨账户角色**

1. 创建允许源账户担任该角色的信任策略：

   ```
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [{
       "Effect": "Allow",
       "Principal": {
         "AWS": "arn:aws:iam::source-account-id:root"
       },
       "Action": "sts:AssumeRole"
     }]
   }
   ```

1. 创建该角色：

   ```
   aws iam create-role \
     --role-name OpenSearchUIAccessRole \
     --assume-role-policy-document file://trust-policy.json
   ```

1. 创建仅包含以下`es:DescribeDomain`操作的权限策略：

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

1. 将权限策略附加到角色：

   ```
   aws iam put-role-policy \
     --role-name OpenSearchUIAccessRole \
     --policy-name ValidationOnly \
     --policy-document file://permissions-policy.json
   ```

### 步骤 2：设置 VPC（目标账户）
<a name="scenario-4-step-2"></a>

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

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

# Create subnet
aws ec2 create-subnet \
  --vpc-id vpc-id \
  --cidr-block 10.0.1.0/24 \
  --availability-zone regiona \
  --region 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 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 region
```

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

### 步骤 3：创建 VPC 域（目标账户）
<a name="scenario-4-step-3"></a>

使用与相同的命令[步骤 3：创建 VPC 域（目标账户）](#scenario-3-step-3)，但要更新访问策略以允许来自源账户的 IAM Identity Center 应用程序角色：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [{
    "Effect": "Allow",
    "Principal": {
      "AWS": "arn:aws:iam::source-account-id:role/NeoIdCAppRole"
    },
    "Action": "es:ESHttp*",
    "Resource": "arn:aws:es:region:target-account-id:domain/vpc-domain-name/*"
  }]
}
```

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

### 步骤 4：为 OpenSearch UI 服务委托人（目标账户）授权 VPC 终端节点
<a name="scenario-4-step-4"></a>

**重要**  
这是 VPC 域所独有的关键步骤。必须明确授权 OpenSearch 用户界面服务才能访问 VPC 终端节点。

```
# Authorize the service principal
aws opensearch authorize-vpc-endpoint-access \
  --domain-name vpc-domain-name \
  --service "application.opensearchservice.amazonaws.com" \
  --region region

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

预期的回应：

```
{
  "AuthorizedPrincipalList": [
    {
      "PrincipalType": "AWS_SERVICE",
      "Principal": "application.opensearchservice.amazonaws.com"
    }
  ]
}
```

### 步骤 5：为 IAM 身份中心应用程序（源账户）创建 IAM 角色
<a name="scenario-4-step-5"></a>

在源账户中创建 IAM 角色，用户 OpenSearch 界面使用该角色访问 IAM Identity Center 用户数据平面。

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

1. 创建信任策略：

   ```
   {
     "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::source-account-id:oidc-provider/portal.sso.region.amazonaws.com/apl/application-id"
           }
         }
       }
     ]
   }
   ```

1. 创建权限策略：

   ```
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [{
       "Sid": "OpenSearchDomain",
       "Effect": "Allow",
       "Action": ["es:ESHttp*"],
       "Resource": "*"
     }]
   }
   ```

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
   ```

### 步骤 6：使用 IAM 身份中心（源账户）创建 OpenSearch UI 应用程序
<a name="scenario-4-step-6"></a>

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

### 步骤 7：创建和分配 IAM 身份中心用户和群组
<a name="scenario-4-step-7"></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:::source-account-id:application/ssoins-instance-id/apl-application-id" \
  --principal-id user-id-or-group-id \
  --principal-type USER
```

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

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

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

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

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

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

```
aws opensearch update-application \
  --region region \
  --id application-id \
  --data-sources '[{
    "dataSourceArn":"arn:aws:es:region:target-account-id:domain/domain-1",
    "dataSourceDescription":"First cross-account domain",
    "iamRoleForDataSourceArn":"arn:aws:iam::target-account-id:role/OpenSearchUIAccessRole"
  },{
    "dataSourceArn":"arn:aws:es:region:target-account-id:domain/domain-2",
    "dataSourceDescription":"Second cross-account domain",
    "iamRoleForDataSourceArn":"arn:aws:iam::target-account-id:role/OpenSearchUIAccessRole"
  }]'
```

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

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

```
aws opensearch list-applications \
  --region region
```

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

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

**撤销 VPC 终端节点访问权限**  
运行如下命令：

```
aws opensearch revoke-vpc-endpoint-access \
  --domain-name vpc-domain-name \
  --service "application.opensearchservice.amazonaws.com" \
  --region region
```

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

下表总结了域类型和身份验证方法之间的主要区别。


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

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


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

| 方面 | IAM 用户 | IAM Identity Center 用户 | 
| --- | --- | --- | 
| 数据平面凭证 | 用户自己的 IAM 证书 | IAM 身份中心应用程序角色 | 
| 访问控制 | 域访问策略 | 域访问策略和后端角色映射 | 
| 其他设置 | 无 | IAM Identity Center 应用程序角色、 user/group 创建、应用程序分配、后端角色映射 | 
| OpenSearch UI 应用程序配置 | 没有 IAM 身份中心选项 | --iam-identity-center-options 必需 | 

## 重要提示
<a name="cross-account-important-notes"></a>
+ `iamRoleForDataSourceArn`必须与在同一个账户中`dataSourceArn`。
+ `iamRoleForDataSourceArn`只有跨账户数据源才需要。对于同账户数据源，请将其省略。
+ 跨账户角色只需要`es:DescribeDomain`权限。它从来没有用于数据平面访问。
+ 对于 VPC 域，必须同时配置 IAM 策略和 VPC 终端节点授权。
+ 支持的引擎版本： OpenSearch 1.3 及以上。

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


| 问题 | 解决方案 | 
| --- | --- | 
| 应用程序创建失败并显示 “无法访问域” | 验证跨账户角色是否具有es:DescribeDomain权限，以及信任策略是否允许源账户。 | 
| VPC 域关联失败 | 确保 VPC 终端节点已获得授权application.opensearchservice.amazonaws.com。 | 
| IAM 用户数据平面访问被拒绝 | 检查目标域访问策略是否允许 IAM 用户或角色委托人。 | 
| IAM 身份中心用户数据平面访问被拒绝 | 确认后端角色映射包含 IAM 身份中心组 ID，以及域策略是否允许 IAM Identity Center 应用程序角色。 | 
| 账户不匹配错误 | 确保iamRoleForDataSourceArn该账户与中的域名位于同一个账户中dataSourceArn。 | 

# 跨集群搜索
<a name="application-cross-cluster-search"></a>

在 Amazon OpenSearch Serverless 中使用[跨集群搜索](cross-cluster-search.md)，您可以跨多个连接的域执行查询和聚合。

Amazon OpenSearch Serverless 中的跨集群搜索使用*源域和*目标*域*的概念。跨集群搜索请求源自源域。目标域可以位于不同的 AWS 区域 （ AWS 账户 或两者兼而有之）中，供源域进行查询。使用跨集群搜索，您可以将源域配置为在同一个账户中与您的 OpenSearch 用户界面关联，然后创建与目标域的连接。因此，即使目标网域位于不同的账户或区域中，您也可以使用 OpenSearch 用户界面处理来自目标域的数据。

您需要为传入和[传出亚马逊 OpenSearch 服务的数据支付标准 AWS 数据传输费用](https://aws.amazon.com/opensearch-service/pricing/)。您无需为 OpenSearch 服务域内的节点之间传输的数据付费。有关数据“传入”和“传出”费用的更多信息，请参阅 *Amazon EC2 按需定价*页面中的[数据传输](https://aws.amazon.com/ec2/pricing/on-demand/#Data_Transfer)。

您可以使用跨集群搜索作为将 OpenSearch 用户界面与不同账户或不同区域中的集群关联的机制。默认情况下，作为加密的一部分，域之间的请求在传输过程中会进行 node-to-node加密。

**注意**  
开源 OpenSearch 工具还记录了[跨集群搜索](https://opensearch.org/docs/latest/search-plugins/cross-cluster-search/)。请注意，与托管 Amazon OpenSearch Serverless 域相比，开源集群的开源工具设置差异很大。  
最值得注意的是，在 Amazon OpenSearch Serverless 中，您可以使用 AWS 管理控制台 而不是请求来配置跨集群连接。`cURL`除精细访问控制外，托管式服务还使用 AWS Identity and Access Management （IAM）进行跨集群身份验证。  
因此，我们建议使用本主题中的内容来配置域名的跨集群搜索，而不是使用开源 OpenSearch文档。

**使用跨集群搜索时的功能差异**  
相较于常规域，使用跨集群搜索创建的目标域具有以下功能差异和要求：
+ 您无法向远程集群写入或运行 `PUT` 命令。您对远程集群的访问权限为*只读*权限。
+ 源域和目标域都必须是 OpenSearch 域。您无法连接 Elasticsearch 域或用于用户界面的自行管理的 OpenSearch /Elasticsearch 集群。 OpenSearch 
+ 一个域最多可与其他域建立 20 个连接。这同时包括传出和传入连接。
+ 源域的版本必须与目标域相同或更高。 OpenSearch 如果要在两个域之间建立双向连接，则这两个域的版本应相同。我们建议在建立连接前，将两个域都升级到最新版本。如果需在建立双向连接后更新域，必须先删除该连接，然后再重新创建。
+ 不能将自定义字典或 SQL 用于远程搜索。
+ 您不能使用 CloudFormation 来连接域名。
+ 不能在 M3 和可突增（T2 和 T3）实例上使用跨集群搜索。
+ 跨集群搜索不适用于 Amazon OpenSearch Serverless 馆藏。

**UI 的跨集群搜索先决条件 OpenSearch**  
在设置包含两个 OpenSearch 域的跨集群搜索之前，请确保您的域满足以下要求：
+ 两个域的精细访问控制均已启用
+ Node-to-node 两个域都启用了加密

**Topics**
+ [通过跨集群搜索设置跨区域和跨账户数据访问的访问权限](#cross-cluster-search-security)
+ [在域之间创建连接](#cross-cluster-search-create-connection)
+ [通过跨集群搜索测试跨区域和跨账户数据访问的安全设置](#cross-cluster-search-security-testing)
+ [删除连接](#cross-cluster-search-deleting-connection)

## 通过跨集群搜索设置跨区域和跨账户数据访问的访问权限
<a name="cross-cluster-search-security"></a>

当向源域发送跨集群搜索请求时，该域将根据其域访问策略评估该请求。跨集群搜索需要精细访问控制。以下是在源域上实施开放访问策略的示例。

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

****  

```
{
"Version":"2012-10-17",		 	 	 
"Statement": [
    {
        "Effect": "Allow",
        "Principal": {
          "AWS": [
            "*"
        ]
      },
      "Action": [
        "es:ESHttp*"
      ],
      "Resource": "arn:aws:es:us-east-1:111222333444:domain/src-domain/*"
    }
  ]
}
```

------

**注意**  
如果路径中包含远程索引，则必须在域 ARN 中对 URI 进行 URL 编码。  
例如，使用以下 ARN 格式：  
`:arn:aws:es:us-east-1:111222333444:domain/my-domain/local_index,dst%3Aremote_index`  
请勿使用以下 ARN 格式：  
`arn:aws:es:us-east-1:111222333444:domain/my-domain/local_index,dst:remote_index.`

如果除了精细访问控制，还选择使用限制性访问策略，则策略必须至少允许访问 `es:ESHttpGet`。以下是示例：

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

****  

```
{
"Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::111222333444:user/john-doe"
        ]
      },
      "Action": "es:ESHttpGet",
      "Resource": "arn:aws:es:us-east-1:111122223333:domain/my-domain/*"
    }
  ]
}
```

------

源域上的[精细访问控制](fgac.md)会评估请求，以确定其是否使用有效的 IAM 或 HTTP 基础凭证进行签名。如果是，精细访问控制接下来会评估用户是否具有执行搜索和访问数据的权限。

以下是有关搜索的权限要求：
+ 如果该请求仅搜索目标域中的数据（例如，`dest-alias:dest-index/_search)`），则只需目标域的权限。
+ 如果该请求在两个域中搜索数据（例如，`source-index,dest-alias:dest-index/_search)`），则需要两个域的权限。
+ 在精细访问控制中，除相关索引的标准读取或搜索权限之外，用户还必须拥有 `indices:admin/shards/search_shards` 权限。

源域将请求传递到目标域。目标域根据其域访问策略评估该请求。要支持 OpenSearch UI 中的所有功能，例如为文档编制索引和执行标准搜索，必须设置完全权限。以下是我们针对目标域的推荐策略示例：

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

****  

```
{
"Version":"2012-10-17",		 	 	 
 "Statement": [
    {
       "Effect": "Allow",
       "Principal": {
         "AWS": [
           "*"
        ]
      },
      "Action": [
        "es:ESHttp*"
      ],
      "Resource": "arn:aws:es:us-east-2:111222333444:domain/my-destination-domain/*"
    },
    {
    "Effect": "Allow",
        "Principal": {
    "AWS": "*"
      },
      "Action": "es:ESCrossClusterGet",
      "Resource": "arn:aws:es:us-east-2:111222333444:domain/"
    }
  ]
}
```

------

如果仅需执行基础搜索，最低策略要求是针对目标域应用 `es:ESCrossClusterGet` 权限，且不支持通配符。例如，在前面的策略中，您可以将域名指定为*/my-destination-domain*，而不是指定*/my-destination-domain/\$1*。

在此情况下，目标域执行搜索，并将结果返回到源域。源域将自己的结果（如果有）与目标域的结果相结合，并将它们返回给您。

## 在域之间创建连接
<a name="cross-cluster-search-create-connection"></a>

跨集群搜索连接是从源域到目标域的单向连接。这意味着目标域名（在不同的账户或区域中）无法查询 OpenSearch 用户界面的本地源域名。源域创建到目标域的*出站*连接。目标域接收来自源域的*入站*连接请求。

![\[此图说明跨集群搜索连接是从源域到目标域的单向连接。\]](http://docs.aws.amazon.com/zh_cn/opensearch-service/latest/developerguide/images/ui-oubound-inbound-connections.png)


**在域之间创建连接**

1. 在[https://console.aws.amazon.com/aos/家](https://console.aws.amazon.com/aos/home)中登录亚马逊 OpenSearch 服务控制台。

1. 在左侧导航栏中，选择**域**。

1. 选择要用作源域的域名，然后选择**连接**选项卡。

1. 在**出站连接**区域，选择**请求**。

1. 对于**Connection alias（连接别名）**，输入您的连接的名称。 OpenSearch 用户界面中使用连接别名来选择目标域。

1. 对于**连接模式**，请选择**直接**模式以进行跨集群搜索或复制。

1. 要指定连接在搜索过程中应跳过不可用的集群，请选中**跳过不可用的集群**复选框。选择此选项可确保即使一个或多个远程集群发生故障，跨集群查询仍能返回部分结果。

1. 对于**目标集群**，请在**连接到此 AWS 账户中的集群**和**连接到其他 AWS 账户中的集群**之间进行选择。

1. 对于**远程域 ARN**，输入集群的 Amazon 资源名称（ARN）。域 ARN 可在域详情页面的**一般信息**区域中找到。

   域必须满足以下要求：
   + ARN 的格式必须为 `arn:partition:es:regionaccount-id:type/domain-id`。例如：

     `arn:aws:es:us-east-2:111222333444:domain/my-domain`
   + 必须将该域配置为使用 OpenSearch 版本 1.0（或更高版本）或 Elasticsearch 版本 6.7（或更高版本）。
   + 必须在域上启用精细访问控制。
   + 域名必须正在运行 OpenSearch。

1. 选择**请求**。

跨集群搜索首先验证连接请求，以确保满足先决条件。如果域不兼容，则连接请求将进入 `Validation failed` 状态。

如果连接请求验证成功，则将其发送到目标域，该请求必须在目标域进行审批。在此审批进行之前，连接将保持 `Pending acceptance` 状态。当连接请求被目标域接受后，状态将更改为 `Active`，且目标域变为可供查询。

域页面显示了目标域的整体域运行状况和实例运行状况的详细信息。只有域拥有者具备创建、查看、删除和监控域之间的连接的灵活性。

连接建立之后，在所连接域节点之间流动的任何流量都将进行加密。如果将 VPC 域连接到非 VPC 域，且非 VPC 域是可接收 Internet 流量的公有端点，则域之间的跨集群流量仍是加密且安全的。

## 通过跨集群搜索测试跨区域和跨账户数据访问的安全设置
<a name="cross-cluster-search-security-testing"></a>

通过跨集群搜索为跨区域和跨账户数据访问设置访问权限后，我们建议使用 [https://www.postman.com/](https://www.postman.com/)（即用于协作 API 开发的第三方平台）测试设置。

**使用 Postman 设置您的安全设置**

1. 在目标域上，为文档编制索引。示例请求如下：

   ```
   POST https://dst-domain.us-east-1.es.amazonaws.com/books/_doc/1
   {
   "Dracula": "Bram Stoker"
   }
   ```

1. 要从源域查询此索引，请在查询内包含目标域的连接别名。您可以在域控制面板的连接选项卡上找到连接别名。以下是请求示例及截断响应：

   ```
   GET https://src-domain.us-east-1.es.amazonaws.com/connection_alias:books/_search
   {
   ...
     "hits": [
   {
   "_index": "source-destination:books",
     "_type": "_doc",
     "_id": "1",
     "_score": 1,
     "_source": {
   "Dracula": "Bram Stoker"
     }
   }
     ]
   }
   ```

1. （可选）您可以在单次搜索中创建包含多个域名的配置。例如，假设您设置以下内容：

   `domain-a` 到 `domain-b` 的连接，连接别名为 `cluster_b`

   `domain-a` 到 `domain-c` 的连接，连接别名为 `cluster_c`

   在此情况下，您的搜索包括内容 `domain-a`、`domain-b` 和 `domain-c`。以下是请求示例及响应：

   请求

   ```
   GET https://src-domain.us-east-1.es.amazonaws.com/local_index,cluster_b:b_index,cluster_c:c_index/_search
   {
     "query": {
   "match": {
     "user": "domino"
   }
     }
   }
   ```

   响应：

   ```
   {
   "took": 150,
     "timed_out": false,
     "_shards": {
   "total": 3,
   "successful": 3,
   "failed": 0,
   "skipped": 0
     },
     "_clusters": {
   "total": 3,
   "successful": 3,
   "skipped": 0
     },
     "hits": {
   "total": 3,
   "max_score": 1,
   "hits": [
     {
   "_index": "local_index",
       "_type": "_doc",
       "_id": "0",
       "_score": 1,
       "_source": {
   "user": "domino",
         "message": "This is message 1",
         "likes": 0
       }
     },
     {
   "_index": "cluster_b:b_index",
       "_type": "_doc",
       "_id": "0",
       "_score": 2,
       "_source": {
   "user": "domino",
         "message": "This is message 2",
         "likes": 0
       }
     },
     {
   "_index": "cluster_c:c_index",
       "_type": "_doc",
       "_id": "0",
       "_score": 3,
       "_source": {
   "user": "domino",
         "message": "This is message 3",
         "likes": 0
       }
     }
   ]
     }
   }
   ```

如果您没有选择在连接设置中跳过不可用集群，搜索的所有目标集群必须可用才能成功运行搜索请求。否则，整个请求将失败——即使只有一个域不可用，也不会返回任何搜索结果。

## 删除连接
<a name="cross-cluster-search-deleting-connection"></a>

删除连接会停止目标域上的任何跨集群搜索操作。

您可以在源域或目标域上执行以下步骤以删除连接。删除连接之后，其状态为 `Deleted`，仍会显示 15 天。

不能删除具有活动跨集群连接的域。要删除域，请首先从该域中删除所有传入和传出连接。这是为了确保在删除域之前考虑到了跨集群域用户。

**删除连接**

1. 在[https://console.aws.amazon.com/aos/家](https://console.aws.amazon.com/aos/home)中登录亚马逊 OpenSearch 服务控制台。

1. 在左侧导航栏中，选择**域**。

1. 选择要删除的域名称，然后选择**连接**选项卡。

1. 选择要删除的连接名称。

1. 选择**删除**，然后确认删除。