

 Amazon Redshift는 패치 198부터 새 Python UDF 생성을 더 이상 지원하지 않습니다. 기존 Python UDF는 2026년 6월 30일까지 계속 작동합니다. 자세한 내용은 [블로그 게시물](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)을 참조하세요.

# Amazon Redshift에서 Amazon S3 Tables 쿼리
<a name="querying-s3Tables"></a>

Amazon Redshift는 Amazon S3 테이블 버킷과 통합되어 Amazon Redshift를 사용하여 S3 테이블 리소스에 액세스할 수 있습니다. 이제 막 시작하는 단계이든 Iceberg 환경에서 수천 개의 테이블을 관리하든, 테이블 버킷은 모든 규모에서 데이터 레이크 관리를 단순화합니다. 자세한 내용은 [테이블 버킷](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets.html)을 참조하세요.

이 주제에서는 Amazon S3 Tables 및 Redshift를 시작하고 Amazon Redshift를 사용하여 S3 Tables 객체에 액세스하는 방법을 설명합니다.

## 사전 조건
<a name="querying-s3Tables-prerequisites"></a>

Amazon Redshift에서 S3 테이블을 쿼리하기 전에 S3 테이블을 AWS Glue Data Catalog와 통합해야 합니다. 지침은 [Amazon S3 Tables와 AWS Glue Data Catalog의 통합](https://docs.aws.amazon.com/glue/latest/dg/glue-federation-s3tables.html)을 참조하세요.

S3 테이블이 AWS Glue Data Catalog와 통합되면 필요한 S3 테이블 및 AWS Glue IAM 권한이 있는 IAM 보안 주체는 AWS Glue Data Catalog를 통해 S3 테이블을 검색할 수 있습니다.

**참고**  
방법 3(자동 탑재 awsdatacatalog)에는 추가 사전 조건이 있습니다. 세부 정보는 [방법 3: 자동 탑재된 awsdatacatalog](#querying-s3Tables-method3) 섹션을 참조하세요.

## Amazon Redshift에서 S3 테이블 쿼리
<a name="querying-s3Tables-steps"></a>

Amazon S3 테이블 쿼리를 시작하려면 다음 단계를 따르세요.
+ 1단계: Amazon Redshift에 대한 IAM 역할 생성
+ 2단계: Amazon Redshift 클러스터에 IAM 역할 연결
+ 3단계: Amazon Redshift에서 S3 테이블 쿼리

### 1단계: Amazon Redshift에 대한 IAM 역할 생성
<a name="querying-s3Tables-step1"></a>

클러스터가 AWS Glue의 외부 S3 Tables 카탈로그에 액세스하려면 권한이 필요합니다. 이러한 권한을 부여하기 위해 Amazon Redshift는 클러스터에 연결되어 있는 IAM 역할을 사용합니다. 다음 정책 권한을 가진 IAM 역할을 만듭니다.

**참고**  
아래 정책 및 예제에서 `us-west-2`를 AWS 리전으로 바꾸고 `111122223333`을 AWS 계정 ID로 바꿉니다.

**정책을 생성하려면:**

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

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

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

1. [**JSON**] 탭을 선택합니다.

1. 다음 JSON 정책 문서를 붙여 넣습니다.

   ```
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "GlueDataCatalogPermissions",
         "Effect": "Allow",
         "Action": [
           "glue:GetCatalog",
           "glue:GetDatabase",
           "glue:GetTable",
           "glue:GetTables",
           "glue:UpdateTable",
           "glue:DeleteTable"
         ],
         "Resource": [
           "arn:aws:glue:us-west-2:111122223333:catalog",
           "arn:aws:glue:us-west-2:111122223333:catalog/s3tablescatalog",
           "arn:aws:glue:us-west-2:111122223333:catalog/s3tablescatalog/*",
           "arn:aws:glue:us-west-2:111122223333:database/s3tablescatalog/*/*",
           "arn:aws:glue:us-west-2:111122223333:table/s3tablescatalog/*/*/*",
           "arn:aws:glue:us-west-2:111122223333:database/*",
           "arn:aws:glue:us-west-2:111122223333:table/*/*"
         ]
       },
       {
         "Sid": "S3TablesDataAccessPermissions",
         "Effect": "Allow",
         "Action": [
           "s3tables:GetTableBucket",
           "s3tables:GetNamespace",
           "s3tables:GetTable",
           "s3tables:GetTableMetadataLocation",
           "s3tables:GetTableData",
           "s3tables:ListTableBuckets",
           "s3tables:CreateTable",
           "s3tables:PutTableData",
           "s3tables:UpdateTableMetadataLocation",
           "s3tables:ListNamespaces",
           "s3tables:ListTables",
           "s3tables:DeleteTable"
         ],
         "Resource": [
           "arn:aws:s3tables:us-west-2:111122223333:bucket/*",
           "arn:aws:s3tables:us-west-2:111122223333:bucket/*/table/*"
         ]
       }
     ]
   }
   ```

1. **정책 검토**를 선택합니다.

1. **정책 검토** 페이지에서 **이름**에 `GlueCatalogS3Tables_Policy`를 입력합니다. 필요한 경우 설명을 입력합니다. 정책 요약을 검토한 다음 **정책 생성**을 선택합니다.

**Amazon Redshift에 대한 IAM 역할을 생성하려면:**

1. [IAM 콘솔(IAM console)](https://console.aws.amazon.com/iam/)을 엽니다.

1. 탐색 창에서 **역할**을 선택합니다.

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

1. **AWS 서비스**를 신뢰할 수 있는 엔터티로 선택한 다음 사용 사례로 **Redshift**를 선택합니다.

1. **다른 AWS 서비스의 사용 사례**에서 **Redshift - 사용자 지정 가능**을 선택한 후 **다음**을 선택합니다.

1. **권한 추가** 페이지에서 앞서 생성한 `GlueCatalogS3Tables_Policy` 정책을 연결합니다. **다음**을 선택합니다.

1. **Role name(역할 이름)**에는 역할 이름을 입력합니다(예: `RedshiftS3TablesRole`).

1. 정보를 검토한 후 **역할 만들기**를 선택합니다.

1. 탐색 창에서 **역할**을 선택합니다. 새 역할 이름을 선택하여 요약을 본 다음 **역할 ARN**을 클립보드에 복사합니다. S3 Tables 네임스페이스에 대한 외부 스키마를 생성할 때 이 ARN을 사용합니다.

**참고**  
와일드카드를 정확한 Amazon 리소스 이름(ARN)으로 바꾸면 특정 리소스로 범위를 좁힐 수 있습니다.

### 2단계: Amazon Redshift 클러스터에 IAM 역할 연결
<a name="querying-s3Tables-step2"></a>

1단계에서 구성한 IAM 역할에 Amazon Redshift 클러스터를 연결합니다.

**AWS 관리 콘솔 사용:**

1. AWS 관리 콘솔에 로그인한 후 [https://console.aws.amazon.com/redshiftv2/](https://console.aws.amazon.com/redshiftv2/)에서 Amazon Redshift 콘솔을 엽니다.

1. 탐색 메뉴에서 **클러스터(Clusters)**를 선택한 후 업그레이드할 클러스터를 선택합니다.

1. **작업**에서 **IAM 역할 관리**를 선택하여 클러스터와 연결된 IAM 역할의 현재 목록을 표시합니다.

1. **IAM 역할 관리** 페이지에서 추가하려는 IAM 역할을 선택한 다음 **IAM 역할 추가**를 선택합니다.

1. **완료(Done)**를 선택하여 변경 사항을 저장합니다.

**AWS CLI 사용:**

다음 명령을 실행하여 IAM 역할을 기존 클러스터 또는 네임스페이스와 연결합니다. `my-redshift-cluster` 또는 `my-redshift-namespace`를 클러스터 식별자 또는 네임스페이스로 바꾸고 `111122223333`을 AWS 계정 ID로 바꿉니다.

```
aws redshift modify-cluster-iam-roles \
    --cluster-identifier my-redshift-cluster \
    --add-iam-roles arn:aws:iam::111122223333:role/RedshiftS3TablesRole

-- for serverless
aws redshift-serverless update-namespace \
    --namespace-name my-redshift-namespace \
    --iam-roles "arn:aws:iam::111122223333:role/RedshiftS3TablesRole"
```

자세한 내용은 *Amazon Redshift 관리 가이드*의 [클러스터와 IAM 역할 연결](https://docs.aws.amazon.com/redshift/latest/mgmt/copy-unload-iam-role.html) 섹션을 참조하세요.

### 3단계: Amazon Redshift에서 S3 테이블 쿼리
<a name="querying-s3Tables-step3"></a>

S3 Tables를 AWS Glue Data Catalog와 통합하면 서비스는 S3 Tables 리소스를 AWS Glue 카탈로그 객체에 매핑하는 페더레이션 카탈로그 구조를 생성합니다.
+ S3 테이블 버킷은 AWS Glue Data Catalog에서 **카탈로그**가 됩니다.
+ S3 네임스페이스는 **AWS Glue 데이터베이스**가 됩니다.
+ S3 테이블은 **AWS Glue 테이블 객체**가 됩니다.

통합은 다음과 같은 계층 구조를 생성합니다.
+ **페더레이션 카탈로그:** `s3tablescatalog`(자동 생성됨)
+ **하위 카탈로그:** 각 S3 테이블 버킷은 `s3tablescatalog` 아래의 하위 카탈로그가 됩니다.
+ **데이터베이스:** 테이블 버킷 내의 각 S3 네임스페이스는 데이터베이스가 됩니다.
+ **테이블:** 네임스페이스 내의 각 S3 테이블이 테이블이 됩니다.

예를 들어 테이블 `transactions`가 포함된 네임스페이스 `sales`가 있는 이름이 `analytics-bucket`인 S3 테이블 버킷이 있는 경우 AWS Glue Data Catalog의 전체 경로는 `s3tablescatalog/analytics-bucket/sales/transactions`입니다.

**리소스 링크 생성**

아래 세 가지 쿼리 방법 중 하나를 사용하기 전에 AWS Glue Data Catalog에서 리소스 링크를 생성해야 합니다. 리소스 링크를 사용하면 Amazon Redshift가 표준 카탈로그를 통해 S3 Tables 데이터베이스를 참조할 수 있습니다.

*AWS Glue 콘솔 사용:*

1. [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

1. 탐색 창에서 **Databases**(데이터베이스)를 선택합니다.

1. **생성**을 선택한 다음 **리소스 링크**를 선택합니다.

1. **리소스 링크 생성** 페이지에서 다음 정보를 입력하세요.
   + **리소스 링크 이름:** 리소스 링크의 이름을 입력합니다(예: `sales_resource_link`).
   + **공유 데이터베이스:** S3 Tables 데이터베이스 경로(예: `s3tablescatalog/analytics-bucket/sales`)를 입력합니다.
   + **공유 데이터베이스 소유자:** AWS 계정 ID를 입력합니다.
   + **공유 데이터베이스의 카탈로그 ID:** 카탈로그 ID를 `<account-id>:s3tablescatalog/<bucket-name>` 형식으로 입력합니다.

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

*AWS CLI 사용:*

```
aws glue create-database \
  --region us-west-2 \
  --cli-input-json '{
        "CatalogId": "111122223333",
        "DatabaseInput": {
            "Name": "sales_resource_link",
            "TargetDatabase": {
                "CatalogId": "111122223333:s3tablescatalog/analytics-bucket",
                "DatabaseName": "sales"
            }
        }
  }'
```

이 명령은 S3 테이블 버킷 `analytics-bucket`의 `sales` 데이터베이스를 가리키는 기본 AWS Glue 데이터 카탈로그에 이름이 `sales_resource_link`인 리소스 링크를 생성합니다.

리소스 링크가 생성되면 Amazon Redshift는 S3 테이블을 쿼리하는 세 가지 방법을 제공합니다. 사용 사례에 가장 잘 맞는 방법을 선택하세요.

**참고**  
데이터베이스 수준에서 리소스 링크를 생성하려면 Redshift 관리자에게 기본 카탈로그 및 생성 중인 데이터베이스에 대한 `AWS Glue:CreateDatabase` 권한이 있어야 합니다.

#### 방법 1: CREATE EXTERNAL SCHEMA
<a name="querying-s3Tables-method1"></a>

`CREATE EXTERNAL SCHEMA`를 사용하여 S3 Tables 데이터베이스를 참조하는 외부 스키마를 생성합니다. 이 메서드는 스키마 이름 지정 및 구성을 명시적으로 제어합니다.

전체 구문 세부 정보는 *Amazon Redshift 데이터베이스 개발자 안내서*의 [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html)를 참조하세요.

**예제**

3단계의 데이터베이스 이름과 카탈로그 ID를 사용합니다. `111122223333`를 AWS 계정 ID로 바꿉니다.

```
CREATE EXTERNAL SCHEMA s3tables_schema
FROM DATA CATALOG DATABASE 'sales_resource_link'
IAM_ROLE 'arn:aws:iam::111122223333:role/RedshiftS3TablesRole'
REGION 'us-west-2'
CATALOG_ID '111122223333';

SELECT * FROM s3tables_schema.transactions;
```

#### 방법 2: ARN에서 데이터베이스 생성
<a name="querying-s3Tables-method2"></a>

`CREATE DATABASE`를 `FROM ARN` 절과 함께 사용하여 AWS Glue 리소스 링크를 직접 참조하는 페더레이션 데이터베이스를 생성합니다. 이 방법은 AWS Glue 데이터베이스를 Redshift 데이터베이스에 자동으로 매핑합니다.

전체 구문 세부 정보는 *Amazon Redshift 데이터베이스 개발자 안내서*의 [CREATE DATABASE](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_DATABASE.html)를 참조하세요.

**예제**

`111122223333`를 AWS 계정 ID로 바꿉니다.

```
CREATE DATABASE s3tables_db
FROM ARN 'arn:aws:glue:us-west-2:111122223333:database/sales_resource_link'
WITH DATA CATALOG SCHEMA analytics_schema
IAM_ROLE 'arn:aws:iam::111122223333:role/RedshiftS3TablesRole';

SELECT * FROM s3tables_db.analytics_schema.transactions;
```

#### 방법 3: 자동 탑재된 awsdatacatalog
<a name="querying-s3Tables-method3"></a>

Amazon Redshift는 `awsdatacatalog` 데이터베이스를 통해 S3 Tables 리소스 링크를 포함한 AWS Glue Data Catalog 데이터베이스를 자동으로 마운트할 수 있습니다. 이 방법을 사용하려면 클러스터에서 Spectrum(FAS)에 대한 페더레이션 액세스를 활성화해야 합니다.

**사전 조건**:

자동 마운트 `awsdatacatalog` 데이터베이스를 사용하려면 Spectrum에 대한 페더레이션 액세스를 활성화해야 합니다. 이를 통해 Amazon Redshift는 페더레이션 ID 자격 증명을 사용하여 AWS Glue Data Catalog 및 외부 데이터 소스에 액세스할 수 있습니다.

Spectrum에 대한 페더레이션 액세스를 활성화하려면 다음을 수행합니다.

1. 다음 권한이 있는 IAM 자격 증명을 사용하여 Redshift 클러스터에 연결합니다.
   + `redshift:GetClusterCredentialsWithIAM`(프로비저닝된 클러스터의 경우) 또는 `redshift-serverless:GetCredentials`(서버리스의 경우)
   + `AmazonS3ReadOnlyAccess`
   + `AWSGlueConsoleFullAccess`
   + S3 Tables 권한(1단계에서 정의)

1. IAM 자격 증명에 연결하면 Amazon Redshift는 `IAM:`(사용자의 경우) 또는 `IAMR:`(역할의 경우) 접두사가 붙은 데이터베이스 사용자를 자동으로 생성합니다.

1. 클러스터 관리자로서 페더레이션 사용자에게 외부 스키마 액세스 권한을 부여합니다. `my_user`를 IAM 역할 또는 사용자 이름으로 바꿉니다.

   ```
   GRANT ALL ON SCHEMA awsdatacatalog TO "IAMR:my_user";
   ```

페더레이션 액세스 설정에 대한 자세한 지침은 [Amazon Redshift 관리 안내서](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html)의 *페더레이션 ID를 사용하여 로컬 리소스 및 Amazon Redshift Spectrum 외부 테이블에 대한 Amazon Redshift 액세스 관리*를 참조하세요.

**S3 Tables 쿼리**

페더레이션 액세스가 구성되면 마운트된 스키마를 확인하고 S3 테이블을 쿼리합니다.

마운트된 스키마를 확인합니다.

```
SHOW SCHEMAS FROM DATABASE awsdatacatalog;
```

3단계의 리소스 링크 이름을 사용하여 S3 테이블을 쿼리합니다.

```
SELECT * FROM awsdatacatalog.sales_resource_link.transactions;
```