

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

# 跨账户数据访问 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。 | 