

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# OpenSearch 도메인에 대한 교차 계정 데이터 액세스
<a name="application-cross-account-data-access-domains"></a>

한 계정에서 OpenSearch UI 애플리케이션을 구성하여 다른 계정의 OpenSearch 도메인에 액세스할 수 있습니다. 교차 계정 데이터 소스를 사용하여 OpenSearch UI 애플리케이션을 생성할 때 대상 계정의 IAM 역할을 `iamRoleForDataSourceArn` 가리키는를 제공합니다. OpenSearch UI는이 역할을 수임하고를 호출하여 도메인 액세스 가능성을 `es:DescribeDomain` 확인하여 요청을 검증합니다. 교차 계정 역할은 데이터 소스 연결 중에만 사용됩니다. 데이터 영역 액세스는 대상 도메인의 액세스 정책에 의해 별도로 제어됩니다.

교차 계정 데이터 소스 지원을 사용하려면 대상 도메인에서 세분화된 액세스 제어를 활성화해야 합니다. 세분화된 액세스 제어는 도메인 액세스 정책 외에도 추가 권한 부여 계층을 제공하므로 개별 인덱스, 문서 및 필드에 대한 액세스를 제어할 수 있습니다.

## 주요 개념
<a name="cross-account-key-concepts"></a>

소스 계정  
OpenSearch UI 애플리케이션을 호스팅 AWS 계정 하는 .

대상 계정  
OpenSearch 도메인 AWS 계정 이 있는 입니다.

교차 계정 역할  
데이터 소스 연결 중에만 사용되는 대상 계정의 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 자격 증명을 `sts:AssumeRole` 호출에 전파합니다. 이는 다음을 의미합니다.
+ 대상 계정의 신뢰 정책은 교차 계정 역할을 수임할 수 있는 소스 계정 보안 주체를 제어합니다.
+ 수임된 역할 세션에는 `CreateApplication` 또는 `UpdateApplication` 요청을 시작한 호출자의 자격 증명이 포함됩니다.
+ 교차 계정 역할은를 호출하기 위한 연결 중에만 수임됩니다`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 Identity Center 조직 인스턴스

## 시나리오
<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. | 