

# AWS Glue 데이터 카탈로그에 대한 크로스 계정 액세스 구성
<a name="security-iam-cross-account-glue-catalog-access"></a>

Athena의 계정 간 AWS Glue 카탈로그 기능을 사용해 자신의 계정이 아닌 다른 계정의 AWS Glue 카탈로그를 등록할 수 있습니다. AWS Glue에 요구되는 IAM 권한을 구성하고 카탈로그를 Athena [DataCatalog](https://docs.aws.amazon.com/athena/latest/APIReference/API_DataCatalog.html) 리소스로 등록하면 Athena를 사용해 계정 간 쿼리를 실행할 수 있습니다. Athena 콘솔을 사용하여 다른 계정의 카탈로그를 등록하는 방법에 대한 자세한 내용은 [다른 계정의 데이터 카탈로그 등록](data-sources-glue-cross-account.md) 단원을 참조하세요.

AWS Glue에서 계정 간 액세스에 대한 자세한 내용은 *AWS Glue 개발자 안내서*의 [계정 간 액세스 권한 부여](https://docs.aws.amazon.com/glue/latest/dg/cross-account-access.html)를 참조하세요.

## 시작하기 전에
<a name="security-iam-cross-account-glue-catalog-access-before-you-start"></a>

이 기능은 기존의 Athena `DataCatalog` 리소스 API 및 계정 간 액세스를 활성화하는 기능을 사용하므로 시작하기 전에 다음 리소스를 읽어보는 것이 좋습니다.
+ [데이터 원본에 연결](work-with-data-stores.md) - Athena와 함께 AWS Glue, Hive 또는 Lambda 데이터 카탈로그 소스를 사용하는 주제를 포함하고 있습니다.
+ [데이터 카탈로그 예제 정책](datacatalogs-example-policies.md) - 데이터 카탈로그에 대한 액세스를 제어하는 정책을 작성하는 방법을 보여 줍니다.
+ [Hive 메타스토어와 함께 AWS CLI 사용](datastores-hive-cli.md) - Hive 메타스토어와 함께 AWS CLI를 사용하는 방법을 보여줍니다. 다른 데이터 소스에 적용한 사용 사례도 포함되어 있습니다.

## 고려 사항 및 제한 사항
<a name="security-iam-cross-account-glue-catalog-access-considerations-and-limitations"></a>

현재 Athena 계정 간 AWS Glue 카탈로그에는 다음과 같은 제한 사항이 있습니다.
+ Athena 엔진 버전 2 이상이 지원되는 AWS 리전에서만 기능을 사용할 수 있습니다. Athena 엔진 버전에 대한 자세한 내용은 [Athena 엔진 버전 관리](engine-versions.md) 단원을 참조하세요. 작업 그룹의 엔진 버전을 업그레이드하려면 [Athena 엔진 버전 변경](engine-versions-changing.md) 섹션을 참조하세요.
+ 다른 계정의 AWS Glue Data Catalog를 자신의 계정에 등록할 때 해당 특정 리전에 있는 다른 계정의 데이터에만 연결되는 리전별 `DataCatalog` 리소스를 생성합니다.
+ 현재 계정 간 AWS Glue 카탈로그를 포함한 `CREATE VIEW` 문은 지원되지 않습니다.
+ AWS 관리형 키를 사용하여 암호화된 카탈로그는 여러 계정에서 쿼리할 수 없습니다. 여러 계정에서 쿼리하려는 카탈로그의 경우 고객 관리형 키(`KMS_CMK`)를 대신 사용하세요. 고객 관리형 및 AWS 관리형 키의 차이점에 대한 자세한 내용은 **AWS Key Management Service 개발자 안내서의 [고객 키 및 AWS 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-mgmt                     )를 참조하세요.

## 시작하기
<a name="security-iam-cross-account-glue-catalog-getting-started"></a>

다음 상황에서는 다음 예제처럼 '차용자' 계정(666666666666)이 AWS Glue 카탈로그를 참조하는 `SELECT` 쿼리를 실행하려 합니다. 이 카탈로그는 '소유자' 계정(999999999999)에 속해 있습니다.

```
SELECT * FROM ownerCatalog.tpch1000.customer
```

다음 절차에서 1a 및 1b 단계는 차용자와 소유자의 관점에서 소유자 계정의 AWS Glue 리소스에 대한 액세스 권한을 차용자 계정에 부여하는 방법을 보여줍니다. 이 예제에서는 `tpch1000` 데이터베이스와 `customer` 테이블에 액세스 권한을 부여합니다. 이러한 예제 이름을 요구 사항에 맞게 변경합니다.

### 1a 단계: 소유자의 AWS Glue 리소스에 액세스하는 정책을 가진 차용자 역할 생성
<a name="security-iam-cross-account-glue-catalog-access-step-1a"></a>

소유자 계정의 AWS Glue 리소스에 대한 액세스 권한이 포함된 차용자 계정 역할을 생성하려면 AWS Identity and Access Management(IAM) 콘솔 또는 [IAM API](https://docs.aws.amazon.com/IAM/latest/APIReference/API_Operations.html)를 사용할 수 있습니다. 다음 절차에서는 IAM 콘솔을 사용합니다.

**차용자 역할 및 정책을 생성하여 소유자 계정의 AWS Glue 리소스에 액세스**

1. 차용자 계정에서 IAM 콘솔에 로그인합니다([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)).

1. 서비스 탐색 창에서 **액세스 관리**를 확장하고 **정책**을 선택합니다.

1. **정책 생성**을 선택합니다.

1. **정책 편집기**에서 **JSON**을 선택합니다.

1. 정책 편집기에서 다음 정책을 입력한 다음 필요에 따라 수정합니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "glue:*",
               "Resource": [
                   "arn:aws:glue:us-east-1:999999999999:catalog",
                   "arn:aws:glue:us-east-1:999999999999:database/tpch1000",
                   "arn:aws:glue:us-east-1:999999999999:table/tpch1000/customer"
               ]
           }
       ]
   }
   ```

------

1. **다음**을 선택합니다.

1. **검토 및 생성** 페이지의 **정책 이름**에 정책 이름(예: **CrossGluePolicyForBorrowerRole**)을 입력합니다.

1. **정책 생성**을 선택합니다.

1. 탐색 창에서 **Roles**를 선택합니다.

1. **역할 생성(Create role)**을 선택합니다.

1. **신뢰할 수 있는 엔티티** 페이지에서 **AWS 계정** 선택 후 **다음**을 선택합니다.

1. **권한 추가** 페이지에서 검색 상자에 생성한 정책의 이름을 입력합니다(예: **CrossGluePolicyForBorrowerRole**).

1. 정책 이름 옆에 있는 확인란을 선택하고, **다음**을 선택합니다.

1. **이름, 검토 및 생성** 페이지에서 **역할 이름(Role name)**에서 역할 이름을 입력합니다(예: **CrossGlueBorrowerRole**).

1. **역할 생성**을 선택합니다.

### 1b 단계: 차용자에 대해 AWS Glue 액세스 권한을 부여하는 소유자 정책 생성
<a name="security-iam-cross-account-glue-catalog-access-step-1b"></a>

소유자 계정(999999999999)으로부터 차용자의 역할에 AWS Glue 액세스 권한을 부여하려면 AWS Glue 콘솔 또는 AWS Glue [PutResourcePolicy](https://docs.aws.amazon.com/glue/latest/webapi/API_PutResourcePolicy.html) API 작업을 사용합니다. 다음 절차에서는 AWS Glue 콘솔을 사용합니다.

**소유자로부터 차용자 계정에 AWS Glue 액세스 권한을 부여하려면**

1. 소유자 계정에서 AWS Glue 콘솔에 로그인합니다([https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)).

1. 탐색 창에서 **데이터 카탈로그**를 확장하고 **카탈로그 설정**을 선택합니다.

1. **권한(Permissions)** 상자에 다음과 같은 정책을 입력합니다. *rolename*에 1a 단계에서 차용자 계정이 생성한 역할(예: **CrossGlueBorrowerRole**)을 입력합니다. 권한 범위를 늘리고자 한다면 데이터베이스 및 테이블 리소스 유형에 와일드카드 문자 `*`를 사용할 수 있습니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "AWS": [
                       "arn:aws:iam::666666666666:user/username",
                       "arn:aws:iam::666666666666:role/rolename"
                   ]
               },
               "Action": "glue:*",
               "Resource": [
                   "arn:aws:glue:us-east-1:999999999999:catalog",
                   "arn:aws:glue:us-east-1:999999999999:database/tpch1000",
                   "arn:aws:glue:us-east-1:999999999999:table/tpch1000/customer"
               ]
           }
       ]
   }
   ```

------

완료 후 [AWS Glue API](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api.html)를 사용해 계정 간 호출을 몇 차례 테스트하여 권한이 예상대로 구성되었는지 확인하는 것이 좋습니다.

### 2단계: 차용자가 소유자 계정에 속한 AWS Glue Data Catalog 등록
<a name="security-iam-cross-account-glue-catalog-access-step-2"></a>

다음 절차는 Athena 콘솔을 사용하여 소유자 Amazon Web Services 계정의 AWS Glue Data Catalog를 데이터 소스로 구성하는 방법을 보여줍니다. 콘솔 대신 API 작업을 사용하여 카탈로그를 등록하는 방법에 대한 자세한 내용은 [(선택 사항) API를 사용하여 소유자 계정에 속한 Athena 데이터 카탈로그 등록](#security-iam-cross-account-glue-catalog-access-step-2-api) 단원을 참조하세요.

**다른 계정에 속한 AWS Glue Data Catalog 등록**

1. [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home)에서 Athena 콘솔을 엽니다.

1. 콘솔 탐색 창이 표시되지 않으면 왼쪽의 확장 메뉴를 선택합니다.  
![\[확장 메뉴를 선택합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/nav-pane-expansion.png)

1. **관리**를 확장하고 **데이터 소스**를 선택합니다.

1. 오른쪽 위에서 **데이터 소스 생성(Create data source)**을 선택합니다.

1. **데이터 소스 선택** 페이지의 **데이터 소스**에서 **S3 - AWS Glue Data Catalog**를 선택하고 **다음**을 선택합니다.

1. **데이터 원본 세부 정보 입력** 페이지의 **AWS Glue Data Catalog** 섹션에서 **AWS Glue Data Catalog 선택**에 대해 **다른 계정의 AWS Glue Data Catalog**를 선택합니다.

1. **데이터 세트 세부 정보(Dataset details)**에 다음 정보를 입력합니다.
   + **데이터 소스 이름(Data source name)** – 다른 계정의 데이터 카탈로그를 참조할 때 SQL 쿼리에 사용할 이름을 입력합니다.
   + **설명(Description)** - (선택 사항) 다른 계정의 데이터 카탈로그에 대한 설명을 입력합니다.
   + **카탈로그 ID(Catalog ID)** - 데이터 카탈로그가 속한 계정의 Amazon Web Services 계정 ID(12자리)를 입력합니다. Amazon Web Services 계정 ID는 카탈로그 ID입니다.

1. (선택 사항) **태그**를 확장하고 데이터 소스에 연결할 키 값 페어를 입력합니다. 태그에 대한 자세한 내용은 [Athena 리소스 태깅](tags.md) 섹션을 참조하세요.

1. **다음**을 선택합니다.

1. **검토 및 생성(Review and create)** 페이지에서 제공한 정보를 검토한 다음 **데이터 소스 생성(Create data source)**을 선택합니다. **데이터 소스 세부 정보(Data source details)** 페이지는 등록한 데이터 카탈로그에 대한 데이터베이스 및 태그를 나열합니다.

1. **데이터 소스 및 카탈로그**를 선택합니다. 등록한 데이터 카탈로그가 **데이터 소스 이름(Data source name)** 열에 나열됩니다.

1. 새 데이터 카탈로그에 대한 정보를 보거나 편집하려면 카탈로그를 선택한 다음 **작업(Actions)**, **편집(Edit)**을 선택합니다.

1. 새 데이터 카탈로그를 삭제하려면 카탈로그를 선택한 다음 **작업(Actions)**, **삭제(Delete)**를 선택합니다.

### 3단계: 차용자가 쿼리 제출
<a name="security-iam-cross-account-glue-catalog-access-step-4"></a>

다음 예제처럼 차용자가 *catalog*.*database*.*table* 구문을 사용해 카탈로그를 참조하는 쿼리를 제출합니다.

```
SELECT * FROM ownerCatalog.tpch1000.customer
```

정규화된 구문을 사용하는 대신 차용자는 [QueryExecutionContext](https://docs.aws.amazon.com/athena/latest/APIReference/API_QueryExecutionContext.html)를 통해 이를 전달하여 상황에 맞게 카탈로그를 지정할 수도 있습니다.

## (선택 사항) 추가 Amazon S3 권한 구성
<a name="security-iam-cross-account-glue-catalog-access-additional-s3-permissions"></a>
+ 차용자 계정이 Athena 쿼리를 사용하여 소유자 계정의 테이블에 새 데이터를 쓰는 경우 테이블이 소유자 계정에 있더라도 소유자는 Amazon S3의 해당 데이터에 대한 액세스 권한을 자동으로 보유하지 않습니다. 달리 구성하지 않는 한 차용자가 Amazon S3에 있는 정보의 객체 소유자이기 때문입니다. 소유자에게 데이터에 대한 액세스 권한을 부여하려면 추가 단계로 개체에 대한 권한을 적절히 설정합니다.
+ [MSCK REPAIR TABLE](msck-repair-table.md) 같은 특정한 계정 간 DDL 작업은 Amazon S3 권한을 요구합니다. 예를 들어 소유자 계정 S3 버킷에 있는 데이터를 포함한 소유자 계정의 테이블에 대해 차용자 계정이 계정 간 `MSCK REPAIR` 작업을 수행할 경우 쿼리가 성공하려면 해당 버킷이 차용자가 맡은 역할에 권한을 부여해야 합니다.

버킷 권한 부여에 대한 자세한 내용은 *Amazon Simple Storage Service 사용 설명서*의 [ACL 버킷 권한을 설정하는 방법](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/set-bucket-permissions.html)을 참조하세요.

## (선택 사항) 카탈로그를 동적으로 사용
<a name="security-iam-cross-account-glue-catalog-access-dynamic-catalogs"></a>

어떤 경우에는 계정 간 AWS Glue 카탈로그를 등록하는 사전 단계 없이 신속히 테스트를 수행해야 할 수 있습니다. 앞서 이 설명서에서 설명한 필수 IAM 및 Amazon S3 권한을 올바르게 구성했다면 `DataCatalog` 리소스를 생성하지 않고도 계정 간 쿼리를 동적으로 수행할 수 있습니다.

등록 없이 카탈로그를 명시적으로 참조하려면 다음 예제의 구문을 사용합니다.

```
SELECT * FROM "glue:arn:aws:glue:us-east-1:999999999999:catalog".tpch1000.customer
```

"`glue:<arn>`" 형식을 사용합니다. 여기서 `<arn>`은(는) 사용하고자 하는 [AWS Glue Data Catalog ARN](https://docs.aws.amazon.com/glue/latest/dg/glue-specifying-resource-arns.html#data-catalog-resource-arns)입니다. 이 예제에서 Athena는 이 구문을 사용하여 마치 `DataCatalog` 객체를 별도로 생성한 것처럼 999999999999 계정의 AWS Glue 데이터 카탈로그를 동적으로 가리키도록 할 수 있습니다.

### 동적 카탈로그 사용에 대한 참고 사항
<a name="security-iam-cross-account-glue-catalog-access-notes-dynamic-catalogs"></a>

동적 카탈로그를 사용할 때 다음 사항에 유의해야 합니다.
+ 동적 카탈로그를 사용하려면 Athena 데이터 카탈로그 API 작업에 일반적으로 사용하는 IAM 권한이 필요합니다. 주된 차이점은 데이터 카탈로그 리소스 이름이 `glue:*` 이름 지정 규칙을 따른다는 것입니다.
+ 카탈로그 ARN은 쿼리가 실행되는 리전과 동일한 리전에 속해야 합니다.
+ DML 쿼리 또는 뷰에서 동적 카탈로그를 사용할 경우 이스케이프된 큰따옴표(`\"`)로 묶어야 합니다. DDL 쿼리에서 동적 카탈로그를 사용할 경우 백틱 문자(```)로 묶어야 합니다.

## (선택 사항) API를 사용하여 소유자 계정에 속한 Athena 데이터 카탈로그 등록
<a name="security-iam-cross-account-glue-catalog-access-step-2-api"></a>

2단계에서 설명한 대로 Athena 콘솔을 사용하는 대신 API 작업을 사용하여 소유자 계정에 속한 데이터 카탈로그를 등록할 수 있습니다.

Athena [DataCatalog](https://docs.aws.amazon.com/athena/latest/APIReference/API_DataCatalog.html) 리소스의 생성자는 Athena [CreateDataCatalog](https://docs.aws.amazon.com/athena/latest/APIReference/API_CreateDataCatalog.html) API 작업을 실행하는 데 필요한 권한이 있어야 합니다. 요구 사항에 따라 추가 API 작업에 액세스해야 할 수도 있습니다. 자세한 내용은 [데이터 카탈로그 예제 정책](datacatalogs-example-policies.md) 단원을 참조하세요.

다음 `CreateDataCatalog` 요청 본문은 계정 간 액세스를 위한 AWS Glue 카탈로그를 등록합니다.

```
# Example CreateDataCatalog request to register a cross-account Glue catalog:
{
    "Description": "Cross-account Glue catalog",
    "Name": "ownerCatalog",
    "Parameters": {"catalog-id" : "999999999999"  # Owner's account ID
    },
    "Type": "GLUE"
}
```

다음 샘플 코드는 Java 클라이언트를 사용하여 `DataCatalog` 객체를 생성합니다.

```
# Sample code to create the DataCatalog through Java client
CreateDataCatalogRequest request = new CreateDataCatalogRequest()
    .withName("ownerCatalog")
    .withType(DataCatalogType.GLUE)
    .withParameters(ImmutableMap.of("catalog-id", "999999999999"));

athenaClient.createDataCatalog(request);
```

이 단계가 끝나면 [ListDataCatalogs](https://docs.aws.amazon.com/athena/latest/APIReference/API_ListDataCatalogs.html) API 작업을 호출할 때 차용자에게 `ownerCatalog`가 표시되어야 합니다.

## 추가 리소스
<a name="security-iam-cross-account-glue-catalog-access-additional-resources"></a>
+ [다른 계정의 데이터 카탈로그 등록](data-sources-glue-cross-account.md)
+ *AWS Prescriptive Guidance Patterns* 안내서의 [Configure cross-account access to a shared AWS Glue Data Catalog using Amazon Athena](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-a-shared-aws-glue-data-catalog-using-amazon-athena.html).
+ *AWS 빅 데이터 블로그*의 [Query cross-account AWS Glue Data Catalogs using Amazon Athena](https://aws.amazon.com/blogs/big-data/query-cross-account-aws-glue-data-catalogs-using-amazon-athena/)
+ *AWS Glue 개발자 안내서*의 [Granting cross-account access](https://docs.aws.amazon.com/glue/latest/dg/cross-account-access.html) 