

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# OpenSearch ドメインへのクロスアカウントデータアクセス
<a name="application-cross-account-data-access-domains"></a>

1 つのアカウントで OpenSearch UI アプリケーションを設定して、異なるアカウントの OpenSearch ドメインにアクセスできます。クロスアカウントデータソースを使用して OpenSearch UI アプリケーションを作成するときは、ターゲットアカウントの IAM ロール`iamRoleForDataSourceArn`を指す を指定します。OpenSearch UI は、このロールを引き受け、 `es:DescribeDomain`を呼び出してドメインアクセシビリティを検証することで、リクエストを検証します。クロスアカウントロールは、データソースの関連付け中のみ使用されます。データプレーンへのアクセスは、ターゲットドメインのアクセスポリシーによって個別に制御されます。

クロスアカウントデータソースのサポートでは、ターゲットドメインできめ細かなアクセスコントロールを有効にする必要があります。きめ細かなアクセスコントロールは、ドメインアクセスポリシー以外にも追加の認可レイヤーを提供するため、個々のインデックス、ドキュメント、フィールドへのアクセスを制御できます。

## 主要なコンセプト
<a name="cross-account-key-concepts"></a>

ソースアカウント  
OpenSearch UI アプリケーションをホスト AWS アカウント する 。

ターゲットアカウント  
 AWS アカウント OpenSearch ドメインが存在する 。

クロスアカウントロール  
データソースの関連付け中のみ使用されるターゲットアカウントの IAM ロール。OpenSearch UI はこのロールを引き受けて を呼び出します。これにより`es:DescribeDomain`、ドメインエンドポイントを取得し、きめ細かなアクセスコントロールが有効になっていることを確認します。これは検出と検証のステップであり、セキュリティの境界ではありません。クロスアカウントロールがデータプレーンアクセスに使用されることはありません。関連付け後、すべてのデータプレーンリクエストは、クロスアカウントロールとは無関係に、ドメインのアクセスポリシーとバックエンドロールマッピングによって承認されます。

IAM Identity Center アプリケーションロール  
IAM Identity Center ユーザーデータプレーンアクセスに使用されるソースアカウントの IAM ロール。

## クロスアカウントロールの引き受けの仕組み
<a name="cross-account-role-assumption"></a>

クロスアカウントデータソースを使用して OpenSearch UI アプリケーションを作成または更新すると、OpenSearch UI は、転送アクセスセッション ([FAS](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_forward_access_sessions.html)) を使用してターゲットアカウントのクロスアカウントロールを引き受けます。FAS は、呼び出し元のプリンシパル自身の IAM ID を`sts:AssumeRole`呼び出しに伝達します。つまり、次のようになります。
+ ターゲットアカウントの信頼ポリシーは、どのソースアカウントプリンシパルがクロスアカウントロールを引き受けることができるかを制御します。
+ 引き受けたロールセッションは、 `CreateApplication`または `UpdateApplication`リクエストを開始した発信者の ID を保持します。
+ クロスアカウントロールは、 を呼び出す関連付け中にのみ引き受けられます`es:DescribeDomain`。以降のデータプレーンオペレーションには使用されません。

データプレーンアクセスの場合:
+ IAM ユーザーは、独自の IAM 認証情報を使用してリクエストに署名します。ターゲットドメインのアクセスポリシーは、これらのリクエストを直接承認します。
+ IAM Identity Center ユーザーは、ソースアカウントの IAM Identity Center アプリケーションロール (`iamRoleForIdentityCenterApplicationArn`) で署名されたリクエストを受け取ります。ターゲットドメインのアクセスポリシーとバックエンドロールマッピングは、これらのリクエストを承認します。

## 前提条件
<a name="cross-account-prerequisites"></a>

クロスアカウントデータアクセスを設定する前に、以下があることを確認してください。
+ AWS CLI のインストールと設定
+ ソースとターゲットの両方へのアクセス AWS アカウント
+ [きめ細かなアクセスコントロールが有効になっている](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/fgac.html) OpenSearch ドメイン。クロスアカウントデータソースの関連付けは、きめ細かなアクセスコントロールのないドメインではサポートされていません。
+ IAM Identity Center フローの場合: AWS IAM アイデンティティセンター 組織インスタンス

## シナリオ
<a name="cross-account-scenarios"></a>

認証方法とドメイン設定に一致するシナリオを選択します。
+ [シナリオ 1: パブリックドメインにアクセスする IAM ユーザー](#cross-account-scenario-1)
+ [シナリオ 2: パブリックドメインにアクセスする IAM Identity Center ユーザー](#cross-account-scenario-2)
+ [シナリオ 3: VPC ドメインにアクセスする IAM ユーザー](#cross-account-scenario-3)
+ [シナリオ 4: VPC ドメインにアクセスする IAM Identity Center ユーザー](#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":"arn:aws:iam::{{source-account-id}}:root"},"Action":"es:ESHttp*","Resource":"arn:aws:es:{{region}}:{{target-account-id}}:domain/{{domain-name}}/*"}]}' \
  --region {{region}}
```

**注記**  
このアクセスポリシーは、ソースアカウントから IAM プリンシパルへのデータプレーンアクセスをスコープします。アクセスをより制限するには、アカウントのルートプリンシパルを特定の IAM ユーザーまたはロール ARNs。きめ細かなアクセスコントロールは、インデックスとドキュメントへのアクセスを制御するための追加の認可レイヤーを提供します。

続行する`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 Identity Center ユーザー
<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 Identity Center アプリケーションの IAM ロールを作成する (ソースアカウント)
<a name="scenario-2-step-3"></a>

OpenSearch UI が IAM Identity Center ユーザーデータプレーンアクセスに使用するソースアカウントに IAM ロールを作成します。

**IAM Identity Center アプリケーションロールを作成するには**

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 Identity Center を使用して 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 Identity Center ユーザーとグループを作成して割り当てる
<a name="scenario-2-step-5"></a>

**IAM Identity Center ユーザーを作成する**  
以下のコマンドを実行してください。{{プレースホルダー値}}を、ユーザー自身の情報に置き換えます。

```
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 Identity Center グループを作成し、ユーザーを追加する**  
以下の コマンドを実行します。

```
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 Identity Center グループをターゲットドメインの 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 Identity Center ユーザー認証情報を使用してサインインします。
+ IAM Identity Center ユーザーのデータリクエストは、クロスアカウントロールではなく、IAM Identity Center アプリケーションロールで署名されます。
+ ドメインコントロールデータアクセス許可のバックエンドロールマッピング。

## シナリオ 3: VPC ドメインにアクセスする IAM ユーザー
<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 {{region}}a \
  --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":"arn:aws:iam::{{source-account-id}}:root"},"Action":"es:ESHttp*","Resource":"arn:aws:es:{{region}}:{{target-account-id}}:domain/{{vpc-domain-name}}/*"}]}' \
  --region {{region}}
```

**注記**  
このアクセスポリシーは、ソースアカウントから IAM プリンシパルへのデータプレーンアクセスをスコープします。アクセスをより制限するには、アカウントのルートプリンシパルを特定の IAM ユーザーまたはロール ARNs。きめ細かなアクセスコントロールは、インデックスとドキュメントへのアクセスを制御するための追加の認可レイヤーを提供します。

続行する`Active`前に、ドメインのステータスが になるまで待ちます。

### ステップ 4: OpenSearch UI サービスプリンシパル (ターゲットアカウント) の VPC エンドポイントを承認する
<a name="scenario-3-step-4"></a>

**重要**  
これは VPC ドメインに固有の重要なステップです。OpenSearch UI サービスには、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: VPC ドメインにアクセスする IAM Identity Center ユーザー
<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 {{region}}a \
  --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 UI サービスには、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 Identity Center アプリケーションの IAM ロールを作成する (ソースアカウント)
<a name="scenario-4-step-5"></a>

OpenSearch UI が IAM Identity Center ユーザーデータプレーンアクセスに使用するソースアカウントに IAM ロールを作成します。

**IAM Identity Center アプリケーションロールを作成するには**

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 Identity Center を使用して 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 Identity Center ユーザーとグループを作成して割り当てる
<a name="scenario-4-step-7"></a>

**IAM Identity Center ユーザーを作成する**  
以下のコマンドを実行してください。{{プレースホルダー値}}を、ユーザー自身の情報に置き換えます。

```
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 Identity Center グループを作成し、ユーザーを追加する**  
以下の コマンドを実行します。

```
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 Identity Center グループをターゲットドメインの 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 Identity Center ユーザー認証情報を使用してサインインします。
+ IAM Identity Center ユーザーのデータリクエストは、クロスアカウントロールではなく、IAM Identity Center アプリケーションロールで署名されます。
+ ドメインコントロールデータアクセス許可のバックエンドロールマッピング。

## アプリケーションの管理
<a name="cross-account-managing-applications"></a>

**クロスアカウントデータソースを使用してアプリケーションを更新する**  
以下のコマンドを実行してください。{{プレースホルダー値}}を、ユーザー自身の情報に置き換えます。

```
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 | 
| ネットワーク設定 | なし | HTTPS (443) インバウンドの VPC、サブネット、セキュリティグループ | 
| IAM アクセスポリシー | 必須 | 必須 | 
| クロスアカウントロール | クロスアカウントで必須 | クロスアカウントで必須 | 


**IAM ユーザーと IAM Identity Center ユーザーの比較**  

| 側面 | IAM ユーザー | IAM Identity Center ユーザー | 
| --- | --- | --- | 
| データプレーンの認証情報 | ユーザー独自の IAM 認証情報 | IAM Identity Center アプリケーションロール | 
| アクセスコントロール | ドメインアクセスポリシー | ドメインアクセスポリシーとバックエンドロールマッピング | 
| 追加セットアップ | なし | IAM Identity Center アプリケーションロール、ユーザー/グループの作成、アプリケーションの割り当て、バックエンドロールマッピング | 
| OpenSearch UI アプリケーション設定 | IAM Identity Center オプションなし | --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 Identity Center ユーザーのデータプレーンアクセスが拒否されました | バックエンドロールマッピングに IAM Identity Center グループ ID が含まれ、ドメインポリシーで IAM Identity Center アプリケーションロールが許可されていることを確認します。 | 
| アカウントの不一致エラー | iamRoleForDataSourceArn が のドメインと同じアカウントにあることを確認しますdataSourceArn。 | 