

 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에서 AWS CloudFormation과 데이터 공유 시작하기
<a name="data-sharing-within-account-CF"></a>

AWS 리소스를 프로비저닝하는 ㅂAWS CloudFormation스택을 사용하여 데이터 공유 설정을 자동화할 수 있습니다. 다음에 설명하는 CloudFormation 스택은 동일한 AWS 계정에 있는 두 Amazon Redshift 클러스터 간의 데이터 공유를 설정합니다. 따라서 리소스 프로비저닝을 위해 SQL 문을 실행하지 않고도 데이터 공유를 시작할 수 있습니다.

스택은 사용자가 지정하는 클러스터에 datashare를 생성합니다. datashare에는 테이블과 샘플 읽기 전용 데이터가 포함됩니다. 이 데이터는 다른 Amazon Redshift 클러스터에서 읽을 수 있습니다.

CloudFormation을 사용하지 않고 SQL 문을 실행하여 datashare를 설정하고 권한을 부여하여 AWS 계정에서 데이터 공유를 시작하려는 경우 [AWS 계정 내 데이터에 대한 읽기 액세스 공유](within-account.md) 섹션을 참조하세요.

데이터 공유 CloudFormation 스택을 실행하기 전에 IAM 역할과 Lambda 함수를 생성할 권한이 있는 사용자로 로그인해야 합니다. 또한 동일한 계정에 2개의 Amazon Redshift 클러스터가 필요합니다. 하나는 샘플 데이터를 공유하는 데 사용하는 *생산자*이고, 다른 하나는 샘플 데이터를 읽는 데 사용하는 *소비자*입니다. 이러한 클러스터의 기본 요구 사항은 각각 RA3 노드를 사용한다는 것입니다. 추가적인 필수 사항은 [Amazon Redshift의 데이터 공유 고려 사항](datashare-considerations.md) 섹션을 참조하세요.

Amazon Redshift 클러스터 설정 시작하기에 대한 자세한 내용은 [Amazon Redshift 프로비저닝된 데이터 웨어하우스 시작하기](https://docs.aws.amazon.com/redshift/latest/gsg/new-user.html)를 참조하세요. CloudFormation으로 설정 자동화에 대한 자세한 내용은 [AWS CloudFormation이란 무엇인가요?](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)를 참조하세요.

**중요**  
CloudFormation 스택을 시작하기 전에 동일한 계정에 두 개의 Amazon Redshift 클러스터가 있고 클러스터가 RA3 노드를 사용하는지 확인합니다. 각 클러스터에 데이터베이스와 슈퍼유저가 있는지 확인합니다. 자세한 내용은 [데이터베이스 생성](r_CREATE_DATABASE.md) 및 [슈퍼 사용자](r_superusers.md) 섹션을 참조하세요.

**Amazon Redshift 데이터 공유를 위한 CloudFormation 스택을 시작하려면**

1. [https://console.aws.amazon.com/cloudformation/home?#/stacks/new?stackName=DataShare&templateURL=https://s3.amazonaws.com/redshift-downloads/docs-downloads/DataShare.yml](https://console.aws.amazon.com/cloudformation/home?#/stacks/new?stackName=DataShare&templateURL=https://s3.amazonaws.com/redshift-downloads/docs-downloads/DataShare.yml)을 클릭하여 AWS Management Console에서 CloudFormation 서비스로 이동합니다.

   메시지가 나타나면 로그인합니다.

   Amazon S3에 저장된 CloudFormation 템플릿 파일을 참조하여 스택 생성 프로세스가 시작됩니다. CloudFormation *템플릿*은 스택을 구성하는 AWS 리소스를 선언하는 JSON 형식의 텍스트 파일입니다. CloudFormation 템플릿에 대한 자세한 내용은 [템플릿 기본 사항 알아보기](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/gettingstarted.templatebasics.html)를 참조하세요.

1. **다음(Next)**을 선택하여 스택 세부 정보를 입력합니다.

1. **파라미터(Parameters)**에서 각 클러스터에 대해 다음을 입력합니다.
   + Amazon Redshift 클러스터 이름(예: **ra3-consumer-cluster**)
   + 데이터베이스 이름(예: **dev**)
   + 데이터베이스 사용자의 이름(예: **consumeruser**)

   스택은 여러 데이터베이스 객체를 생성하므로 테스트 클러스터를 사용하는 것이 좋습니다.

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

1. 스택 옵션이 나타납니다.

   **다음(Next)**을 선택하여 기본 설정을 적용합니다.

1. **기능**에서 **AWS CloudFormation에서 IAM 리소스를 생성할 수 있음을 승인합니다**를 선택합니다.

1. **스택 생성**을 선택합니다.

CloudFormation에서 템플릿을 사용하여 Amazon Redshift 스택을 구축하고 `myproducer_share`라는 datashare를 생성하는 데 10분 정도 걸립니다. 스택은 스택 세부 정보에 지정된 데이터베이스에 datashare를 생성합니다. 해당 데이터베이스의 객체만 공유할 수 있습니다.

스택이 생성되는 동안 오류가 발생하면 다음을 수행합니다.
+ 각 Redshift 클러스터에 대해 올바른 클러스터 이름, 데이터베이스 이름 및 데이터베이스 사용자 이름을 입력했는지 확인합니다.
+ 클러스터에 RA3 노드가 있는지 확인합니다.
+ IAM 역할 및 Lambda 함수를 만들 수 있는 권한이 있는 사용자로 로그인했는지 확인하세요. IAM 역할 생성에 대한 자세한 내용은 [IAM 역할 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create.html)을 참조하세요. Λ 함수 생성 정책에 대한 자세한 내용은 [함수 개발](https://docs.aws.amazon.com/lambda/latest/dg/access-control-identity-based.html#permissions-user-function)을 참조하세요.

## 생성한 datashare 쿼리
<a name="data-sharing-within-account-CF-querying"></a>

다음 절차를 사용하려면 설명된 각 클러스터에서 쿼리를 실행하는 데 필요한 권한이 있는지 확인해야 합니다.

**datashare를 쿼리하려면**

1. Amazon Redshift 쿼리 에디터 v2와 같은 클라이언트 도구를 사용하여 CloudFormation 스택이 생성될 때 입력한 데이터베이스의 생산자 클러스터에 연결합니다.

1. datashare를 쿼리합니다.

   ```
   SHOW DATASHARES;
                     
   +------------------+-------------+-----------------+-------------------+------------+------------+---------------------+-----------+------------------+--------------------------------------+
   |    share_name    | share_owner | source_database | consumer_database | share_type | createdate | is_publicaccessible | share_acl | producer_account |          producer_namespace          |
   +------------------+-------------+-----------------+-------------------+------------+------------+---------------------+-----------+------------------+--------------------------------------+
   | myproducer_share | 100         | sample_data_dev | myconsumer_db     | INBOUND    | NULL       | true                | NULL      |  producer-acct   |        your-producer-namespace       |
   +------------------+-------------+-----------------+-------------------+------------+------------+---------------------+-----------+------------------+--------------------------------------+
   ```

   앞의 명령은 스택에 의해 생성된 datashare의 이름인 `myproducer_share`를 반환합니다. 또한 datashare와 연결된 데이터베이스의 이름인 `myconsumer_db`를 반환합니다.

   이후 단계에서 사용할 생산자 네임스페이스 식별자를 복사합니다.

1. datashare의 객체를 설명합니다.

   ```
   DESC DATASHARE myproducer_share;
                     
   +------------------+--------------------------------------+------------+------------------+-------------+-------------------------------------+-------------+
   | producer_account |          producer_namespace          | share_type |    share_name    | object_type |             object_name             | include_new |
   +------------------+--------------------------------------+------------+------------------+-------------+-------------------------------------+-------------+
   |   producer-acct  |        your-producer-namespace       | OUTBOUND   | myproducer_share | schema      | myproducer_schema                   | true        |
   |   producer-acct  |        your-producer-namespace       | OUTBOUND   | myproducer_share | table       | myproducer_schema.tickit_sales      | NULL        |
   |   producer-acct  |        your-producer-namespace       | OUTBOUND   | myproducer_share | view        | myproducer_schema.ticket_sales_view | NULL        |
   +------------------+--------------------------------------+------------+------------------+-------------+-------------------------------------+-------------+
   ```

   datashare를 설명하면 테이블 및 보기에 대한 속성이 반환됩니다. 스택은 샘플 데이터가 있는 테이블과 보기를 생산자 데이터베이스에 추가합니다(예: `tickit_sales` 및 `tickit_sales_view`). TICKIT 샘플 데이터베이스에 대한 자세한 내용은 [샘플 데이터베이스](c_sampledb.md)를 참조하세요.

   쿼리를 실행하기 위해 datashare에 대한 권한을 위임할 필요가 없습니다. 스택은 필요한 권한을 부여합니다.

1. 클라이언트 도구를 사용하여 소비자 클러스터에 연결합니다. 생산자의 네임스페이스를 지정하여 datashare를 설명합니다.

   ```
   DESC DATASHARE myproducer_share OF NAMESPACE '<namespace id>'; --specify the unique identifier for the producer namespace
                     
   +------------------+--------------------------------------+------------+------------------+-------------+-------------------------------------+-------------+
   | producer_account |          producer_namespace          | share_type |    share_name    | object_type |             object_name             | include_new |
   +------------------+--------------------------------------+------------+------------------+-------------+-------------------------------------+-------------+
   |   producer-acct  |        your-producer-namespace       | INBOUND    | myproducer_share | schema      | myproducer_schema                   | NULL        |
   |   producer-acct  |        your-producer-namespace       | INBOUND    | myproducer_share | table       | myproducer_schema.tickit_sales      | NULL        |
   |   producer-acct  |        your-producer-namespace       | INBOUND    | myproducer_share | view        | myproducer_schema.ticket_sales_view | NULL        |
   +------------------+--------------------------------------+------------+------------------+-------------+-------------------------------------+-------------+
   ```

1. datashare의 데이터베이스와 스키마를 지정하여 datashare의 테이블을 쿼리할 수 있습니다. 자세한 내용은 [데이터베이스 간 쿼리 예제](cross-database_example.md) 섹션을 참조하세요. 다음 쿼리는 TICKIT 샘플 데이터베이스의 SALES 테이블에서 판매 및 판매자 데이터를 반환합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

   ```
   SELECT * FROM myconsumer_db.myproducer_schema.tickit_sales_view;
                     
   +---------+--------+----------+---------+---------+--------+---------+-----------+------------+---------------------+
   | salesid | listid | sellerid | buyerid | eventid | dateid | qtysold | pricepaid | commission |      saletime       |
   +---------+--------+----------+---------+---------+--------+---------+-----------+------------+---------------------+
   |       1 |      1 |    36861 |   21191 |    7872 |   1875 |       4 |       728 |      109.2 | 2008-02-18 02:36:48 |
   |       2 |      4 |     8117 |   11498 |    4337 |   1983 |       2 |        76 |       11.4 | 2008-06-06 05:00:16 |
   |       3 |      5 |     1616 |   17433 |    8647 |   1983 |       2 |       350 |       52.5 | 2008-06-06 08:26:17 |
   |       4 |      5 |     1616 |   19715 |    8647 |   1986 |       1 |       175 |      26.25 | 2008-06-09 08:38:52 |
   |       5 |      6 |    47402 |   14115 |    8240 |   2069 |       2 |       154 |       23.1 | 2008-08-31 09:17:02 |
   +---------+--------+----------+---------+---------+--------+---------+-----------+------------+---------------------+
   ```
**참고**  
쿼리는 공유 스키마의 보기에 대해 실행됩니다. datashare에서 생성된 데이터베이스에는 직접 연결할 수 없습니다. 읽기 전용입니다.

1. 집계를 포함하는 쿼리를 실행하려면 다음 예제를 사용합니다.

   ```
   SELECT * FROM myconsumer_db.myproducer_schema.tickit_sales ORDER BY 1,2 LIMIT 5;
                     
   +---------+--------+----------+---------+---------+--------+---------+-----------+------------+---------------------+
   | salesid | listid | sellerid | buyerid | eventid | dateid | qtysold | pricepaid | commission |      saletime       |
   +---------+--------+----------+---------+---------+--------+---------+-----------+------------+---------------------+
   |       1 |      1 |    36861 |   21191 |    7872 |   1875 |       4 |       728 |      109.2 | 2008-02-18 02:36:48 |
   |       2 |      4 |     8117 |   11498 |    4337 |   1983 |       2 |        76 |       11.4 | 2008-06-06 05:00:16 |
   |       3 |      5 |     1616 |   17433 |    8647 |   1983 |       2 |       350 |       52.5 | 2008-06-06 08:26:17 |
   |       4 |      5 |     1616 |   19715 |    8647 |   1986 |       1 |       175 |      26.25 | 2008-06-09 08:38:52 |
   |       5 |      6 |    47402 |   14115 |    8240 |   2069 |       2 |       154 |       23.1 | 2008-08-31 09:17:02 |
   +---------+--------+----------+---------+---------+--------+---------+-----------+------------+---------------------+
   ```

   쿼리는 샘플 TICKIT 데이터에서 매출 및 판매자 데이터를 반환합니다.

   datashare 쿼리의 추가 예는 [AWS 계정 내 데이터에 대한 읽기 액세스 공유](within-account.md) 섹션을 참조하세요.