

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

# 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 역할입니다. 이 역할에는 `es:DescribeDomain` 권한만 필요합니다.

IAM Identity Center 애플리케이션 역할  
IAM Identity Center 사용자 데이터 영역 액세스에 사용되는 소스 계정의 IAM 역할입니다.

## 사전 조건
<a name="cross-account-prerequisites"></a>

교차 계정 데이터 액세스를 설정하기 전에 다음이 있는지 확인합니다.
+ AWS CLI 설치 및 구성됨
+ 소스 및 대상 모두에 대한 액세스 AWS 계정
+ 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":"*"},"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 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 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 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 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 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. | 