

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

# 분석
<a name="analytics-pattern-list"></a>

**Topics**
+ [Microsoft SQL Server Analysis Services에서 Amazon Redshift 데이터를 분석](analyze-amazon-redshift-data-in-microsoft-sql-server-analysis-services.md)
+ [Amazon Athena 및 Amazon Quick Sight를 사용하여 중첩된 JSON 데이터 분석 및 시각화](analyze-and-visualize-nested-json-data-with-amazon-athena-and-amazon-quicksight.md)
+ [에서 Amazon S3 AWS Data Exchange 로 데이터 수집 자동화](automate-data-ingestion-from-aws-data-exchange-into-amazon-s3.md)
+ [AWS CloudFormation 템플릿을 사용하여 AWS Glue에서 암호화 적용 자동화](automate-encryption-enforcement-in-aws-glue-using-an-aws-cloudformation-template.md)
+ [AWS DataOps 개발 키트를 사용하여 Google Analytics 데이터를 수집, 변환 및 분석하는 데이터 파이프라인 구축](build-a-data-pipeline-to-ingest-transform-and-analyze-google-analytics-data-using-the-aws-dataops-development-kit.md)
+ [Amazon Kinesis Video Streams 및 Fargate를 사용하여 비디오 처리 파이프라인 구축하기](build-a-video-processing-pipeline-by-using-amazon-kinesis-video-streams-and-aws-fargate.md)
+ [AWS Glue를 사용하여 Amazon S3에서 Amazon Redshift로 데이터를 점차 늘려 로딩하기 위한 ETL 서비스 파이프라인 빌드](build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue.md)
+ [Amazon DataZone을 사용하여 엔터프라이즈 데이터 메시 구축 AWS CDK AWS CloudFormation](build-enterprise-data-mesh-amazon-data-zone.md)
+ [AWS 서비스를 사용하여 위험 가치(VaR) 계산](calculate-value-at-risk-var-by-using-aws-services.md)
+ [Amazon Athena를 사용하여 공유 AWS Glue 데이터 카탈로그에 대한 크로스 계정 액세스 구성](configure-cross-account-access-to-a-shared-aws-glue-data-catalog-using-amazon-athena.md)
+ [Teradata NORMALIZE 임시 기능을 Amazon Redshift SQL로 변환](convert-the-teradata-normalize-temporal-feature-to-amazon-redshift-sql.md)
+ [Teradata RESET WHEN 기능을 Amazon Redshift SQL로 변환](convert-the-teradata-reset-when-feature-to-amazon-redshift-sql.md)
+ [AWS 클라우드에서 인프라를 코드로 사용하여 서버리스 데이터 레이크 배포와 관리](deploy-and-manage-a-serverless-data-lake-on-the-aws-cloud-by-using-infrastructure-as-code.md)
+ [시작 시 Amazon EMR 클러스터에 태그 지정 적용](enforce-tagging-of-amazon-emr-clusters-at-launch.md)
+ [시작 시 Amazon S3에 Amazon EMR 로깅이 활성화되었는지 확인](ensure-amazon-emr-logging-to-amazon-s3-is-enabled-at-launch.md)
+ [AWS Glue 작업과 Python을 사용하여 테스트 데이터 생성](generate-test-data-using-an-aws-glue-job-and-python.md)
+ [AWS IoT Greengrass를 사용하여 IoT 데이터를 Amazon S3에 직접 비용 효율적으로 수집할 수 있습니다](cost-effectively-ingest-iot-data-directly-into-amazon-s3-using-aws-iot-greengrass.md)
+ [Lambda 함수를 사용하여 임시 EMR 클러스터에서 Spark 작업 시작](launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function.md)
+ [AWS Glue를 사용하여 Apache Cassandra 워크로드를 Amazon Keyspaces으로 마이그레이션](migrate-apache-cassandra-workloads-to-amazon-keyspaces-by-using-aws-glue.md)
+ [온프레미스 서버에서 Oracle Business Intelligence 12c를 AWS 클라우드로 마이그레이션](migrate-oracle-business-intelligence-12c-to-the-aws-cloud-from-on-premises-servers.md)
+ [ELK 스택을 AWS 기반 Elastic 클라우드로 마이그레이션](migrate-an-elk-stack-to-elastic-cloud-on-aws.md)
+ [Starburst를 사용하여 AWS 클라우드 로 데이터 마이그레이션](migrate-data-to-the-aws-cloud-by-using-starburst.md)
+ [AWS에서 입력 파일 크기의 ETL 수집 최적화](optimize-the-etl-ingestion-of-input-file-size-on-aws.md)
+ [를 사용하여 검증, 변환 및 파티셔닝으로 ETL 파이프라인 오케스트레이션 AWS Step Functions](orchestrate-an-etl-pipeline-with-validation-transformation-and-partitioning-using-aws-step-functions.md)
+ [Amazon Redshift 기계 학습을 이용하여 고급 분석 수행](perform-advanced-analytics-using-amazon-redshift-ml.md)
+ [Amazon Athena를 사용하여 SQL로 Amazon DynamoDB 테이블 쿼리](query-amazon-dynamodb-tables-sql-amazon-athena.md)
+ [Athena를 사용한 Amazon DynamoDB 테이블 액세스, 쿼리 및 조인](access-query-and-join-amazon-dynamodb-tables-using-athena.md)
+ [스칼라 Python UDF를 사용하여 Amazon Redshift 쿼리 결과에 대한 언어별 정렬 설정](set-up-language-specific-sorting-for-amazon-redshift-query-results-using-a-scalar-python-udf.md)
+ [Lambda 함수가 서로 다른 AWS 리전의 S3 버킷에서 이벤트 알림을 수신하도록 Lambda 함수 구독](subscribe-a-lambda-function-to-event-notifications-from-s3-buckets-in-different-aws-regions.md)
+ [데이터를 Apache Parquet으로 변환하기 위한 세 가지 AWS Glue ETL 작업 유형](three-aws-glue-etl-job-types-for-converting-data-to-apache-parquet.md)
+ [Amazon Athena 및 Amazon QuickSight를 사용하여 Amazon Redshift 감사 로그를 시각화합니다](visualize-amazon-redshift-audit-logs-using-amazon-athena-and-amazon-quicksight.md)
+ [Amazon Quick Sight를 사용하여 모든 AWS 계정에 대한 IAM 자격 증명 보고서 시각화](visualize-iam-credential-reports-for-all-aws-accounts-using-amazon-quicksight.md)
+ [패턴 더 보기](analytics-more-patterns-pattern-list.md)

# Microsoft SQL Server Analysis Services에서 Amazon Redshift 데이터를 분석
<a name="analyze-amazon-redshift-data-in-microsoft-sql-server-analysis-services"></a>

*Sunil Vora, Amazon Web Services*

## 요약
<a name="analyze-amazon-redshift-data-in-microsoft-sql-server-analysis-services-summary"></a>

이 패턴은 데이터베이스 액세스를 위해 Intellisoft OLE DB Provider 또는 CData ADO.NET Provider를 사용하여 Microsoft SQL Server Analysis Services에 Amazon Redshift 데이터를 연결하고 분석하는 방법을 설명합니다.

Amazon Redshift는 클라우드에서 완전히 관리되는 페타바이트급 데이터 웨어하우스 서비스입니다. SQL Server Analysis Services는 Amazon Redshift와 같은 데이터 마트와 데이터 웨어하우스의 데이터를 분석하는 데 사용할 수 있는 온라인 분석 처리(OLAP) 도구입니다. SQL Server Analysis Services를 사용하면 데이터에서 OLAP 큐브를 생성하여 신속한 고급 데이터 분석을 수행할 수 있습니다. 

## 사전 조건 및 제한 사항
<a name="analyze-amazon-redshift-data-in-microsoft-sql-server-analysis-services-prereqs"></a>

**가정**
+ 이 패턴은 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에서 SQL Server Analysis Services와 Intellisoft OLE DB Provider 또는 CData ADO.NET Provider for Amazon Redshift를 설정하는 방법을 설명합니다. 또는 기업 데이터 센터의 호스트에 둘 다 설치할 수도 있습니다.

**사전 조건 **
+ 활성 상태의 AWS 계정
+ 보안 인증 정보가 있는 Amazon Redshift 클러스터

## 아키텍처
<a name="analyze-amazon-redshift-data-in-microsoft-sql-server-analysis-services-architecture"></a>

**소스 기술 스택**
+ Amazon Redshift 클러스터

**대상 기술 스택**
+ 대상: Microsoft SQL Server Analysis Services

**소스 및 타겟 아키텍처**

![\[Microsoft SQL Server Analysis Services에서 Amazon Redshift 데이터 분석\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/e444fec0-e00f-4cc6-acc6-4ffc61b654a0/images/6f29dab5-1ea7-452f-9b07-d1d23ae469a2.png)


## 도구
<a name="analyze-amazon-redshift-data-in-microsoft-sql-server-analysis-services-tools"></a>
+ [Microsoft Visual Studio 2019(Community Edition)](https://visualstudio.microsoft.com/vs/)
+ [Amazon Redshift용 Intellisoft OLE DB Provider(평가판)](https://www.pgoledb.com/index.php?option=com_filecabinet&view=files&id=1&Itemid=68) 또는 [Amazon Redshift용 CData ADO.NET Provider(평가판)](https://www.cdata.com/kb/tech/redshift-ado-ssas.rst)

## 에픽
<a name="analyze-amazon-redshift-data-in-microsoft-sql-server-analysis-services-epics"></a>

### 테이블 분석
<a name="analyze-tables"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 가져올 테이블과 데이터를 분석하세요. | 가져올 Amazon Redshift 테이블과 그 크기를 파악하세요. | DBA | 

### EC2 인스턴스 설정 및 도구 설치
<a name="set-up-ec2-instance-and-install-tools"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| EC2 인스턴스를 설정합니다. | AWS 계정에서 프라이빗 또는 퍼블릭 서브넷에 EC2 인스턴스를 생성합니다. | 시스템 관리자 | 
| 데이터베이스 액세스를 위한 도구를 설치합니다. | [Amazon Redshift용 Intellisoft OLE DB Provider](https://www.pgoledb.com/index.php?option=com_filecabinet&view=files&id=1&Itemid=68)(또는 [Amazon Redshift용 CData ADO.NET Provider](https://www.cdata.com/kb/tech/redshift-ado-ssas.rst))를 다운로드하고 설치합니다.  | 시스템 관리자 | 
| Visual Studio를 설치합니다. | [Visual Studio 2019(Community Edition)](https://visualstudio.microsoft.com/vs/)를 다운로드하여 설치합니다.  | 시스템 관리자 | 
| 익스텐션을 설치합니다. | Visual Studio에 **Microsoft Analysis Services Projects** 확장 프로그램을 설치합니다. | 시스템 관리자 | 
| 프로젝트를 생성합니다. | Visual Studio에서 새 테이블 형식 모델 프로젝트를 생성하여 Amazon Redshift 데이터를 저장합니다. Visual Studio에서는 프로젝트를 만들 때 **Analysis Services Tabular Project** 옵션을 선택합니다. | DBA | 

### 데이터 소스 생성 및 테이블 가져오기
<a name="create-data-source-and-import-tables"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Amazon Redshift 데이터 소스를 생성합니다. | Intellisoft OLE DB Provider for Amazon Redshift(또는 CData ADO.NET Provider for Amazon Redshift) 및 Amazon Redshift 보안 인증 정보를 사용하여 Amazon Redshift 데이터 소스를 생성합니다. | Amazon Redshift, DBA | 
| 테이블을 가져옵니다. | Amazon Redshift에서 테이블과 뷰를 선택하여 SQL Server Analysis Services Project로 가져옵니다. | Amazon Redshift, DBA | 

### 마이그레이션 후 정리
<a name="clean-up-after-migration"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| EC2 인스턴스를 삭제합니다. | 이전에 시작한 EC2 인스턴스를 삭제합니다. | 시스템 관리자 | 

## 관련 리소스
<a name="analyze-amazon-redshift-data-in-microsoft-sql-server-analysis-services-resources"></a>
+ [Amazon Redshift](https://docs.aws.amazon.com/redshift/)(AWS 설명서)
+ [SQL Server Analysis Services 설치](https://docs.microsoft.com/en-us/analysis-services/instances/install-windows/install-analysis-services?view=asallproducts-allversions)(Microsoft 설명서)
+ [테이블 형식 모델 디자이너](https://docs.microsoft.com/en-us/analysis-services/tabular-models/tabular-model-designer-ssas?view=asallproducts-allversions)(Microsoft 설명서)
+ [고급 분석을 위한 OLAP 큐브 개요](https://docs.microsoft.com/en-us/system-center/scsm/olap-cubes-overview?view=sc-sm-2019)(Microsoft 설명서)
+ [Microsoft Visual Studio 2019(Community Edition)](https://visualstudio.microsoft.com/vs/)
+ [Amazon Redshift용 Intellisoft OLE DB Provider(평가판)](https://www.pgoledb.com/index.php?option=com_filecabinet&view=files&id=1&Itemid=68) 
+ [Amazon Redshift용 CData ADO.NET Provider(평가판)](https://www.cdata.com/kb/tech/redshift-ado-ssas.rst)

# Amazon Athena 및 Amazon Quick Sight를 사용하여 중첩된 JSON 데이터 분석 및 시각화
<a name="analyze-and-visualize-nested-json-data-with-amazon-athena-and-amazon-quicksight"></a>

*Anoop Singh, Amazon Web Services*

## 요약
<a name="analyze-and-visualize-nested-json-data-with-amazon-athena-and-amazon-quicksight-summary"></a>

이 패턴은 Amazon Athena를 사용하여 중첩된 JSON 형식의 데이터 구조를 테이블 형식 보기로 변환한 다음 Amazon Quick Sight에서 데이터를 시각화하는 방법을 설명합니다.

운영 체제의 API 기반 데이터 피드에 JSON 형식 데이터를 사용하여 데이터 제품을 생성할 수 있습니다. 또한 이 데이터는 고객과 고객의 제품 상호 작용을 더 잘 이해하는 데 도움이 되므로 사용자 경험을 조정하고 결과를 예측할 수 있습니다.

## 사전 조건 및 제한 사항
<a name="analyze-and-visualize-nested-json-data-with-amazon-athena-and-amazon-quicksight-prereqs"></a>

**사전 조건 **
+ 활성 AWS 계정
+ 중첩 데이터 구조를 나타내는 JSON 파일(이 패턴은 샘플 파일을 제공함)

**제한 사항:**
+ JSON 기능은 Athena의 기존 SQL 지향 함수와 잘 통합됩니다. 하지만 ANSI SQL과 호환되지 않으며 JSON 파일은 각 레코드를 별도의 줄로 전달할 것으로 예상됩니다. Athena에서 `ignore.malformed.json` 속성을 사용하여 잘못된 형식의 JSON 레코드를 null 문자로 변환해야 하는지 또는 오류를 생성해야 하는지를 나타내야 할 수 있습니다. 자세한 내용은 Athena 설명서의 [JSON 데이터 읽기 모범 사례](https://docs.aws.amazon.com/athena/latest/ug/parsing-JSON.html)를 참조하세요.
+ 이 패턴에서는 소량의 단순한 JSON 형식 데이터만 고려합니다. 이러한 개념을 대규모로 사용하려면 데이터 파티셔닝을 적용하고 데이터를 더 큰 파일로 통합하는 것이 좋습니다.

## 아키텍처
<a name="analyze-and-visualize-nested-json-data-with-amazon-athena-and-amazon-quicksight-architecture"></a>

다음 다이어그램은 이 패턴의 워크플로와 구성 요소를 보여 줍니다. 중첩 데이터 구조는 Amazon Simple Storage Service(Amazon S3)에 JSON 형식으로 저장됩니다. Athena에서 JSON 데이터는 Athena 데이터 구조에 매핑됩니다. 그런 다음 뷰를 생성하여 데이터를 분석하고 Quick Sight에서 데이터 구조를 시각화합니다.

![\[AWS에서 중첩된 JSON 데이터를 분석하고 시각화합니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/e9ad39a1-e0a4-4429-bdc0-594b68707761/images/474e8747-626f-468c-9c27-c007af79bf2d.png)


## 도구
<a name="analyze-and-visualize-nested-json-data-with-amazon-athena-and-amazon-quicksight-tools"></a>

**AWS 서비스**
+ [Amazon Simple Storage Service(S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)는 원하는 양의 데이터를 저장, 보호 및 검색하는 데 도움이 되는 클라우드 기반 객체 스토리지 서비스입니다. 이 패턴은 Amazon S3를 사용하여 JSON 파일을 저장합니다.
+ [Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/what-is.html)는 표준 SQL을 사용하여 Amazon S3에 있는 데이터를 직접 분석할 수 있는 대화형 쿼리 서비스입니다. 이 패턴은 Athena를 사용하여 JSON 데이터를 쿼리하고 변환합니다. 에서 몇 가지 작업을 수행 AWS Management Console하면 Athena가 Amazon S3의 데이터를 가리키고 표준 SQL을 사용하여 일회성 쿼리를 실행할 수 있습니다. Athena는 서버리스 서비스이므로 설정하거나 관리할 인프라가 없으며 실행한 쿼리에 대해서만 비용을 지불하면 됩니다. Athena는 자동으로 규모 조정되고 쿼리를 병렬로 실행하므로, 대규모 데이터 세트과 복잡한 쿼리에서도 빠르게 결과를 얻을 수 있습니다.    
+ [Amazon Quick Sight](https://docs.aws.amazon.com/quicksuite/latest/userguide/quick-bi.html)는 단일 대시보드에서 데이터를 시각화, 분석 및 보고하는 데 도움이 되는 클라우드 규모의 비즈니스 인텔리전스(BI) 서비스입니다. Quick Sight를 사용하면 기계 학습(ML) 인사이트가 포함된 대화형 대시보드를 쉽게 생성하고 게시할 수 있습니다. 어떤 디바이스에서든 이러한 대시보드에 액세스하여 이를 애플리케이션, 포털 및 웹 사이트에 내장할 수 있습니다.

**예제 코드**

다음 JSON 파일은 이 패턴에서 사용할 수 있는 중첩 데이터 구조를 제공합니다.

```
{
  "symbol": "AAPL",
  "financials": [
    {
      "reportDate": "2017-03-31",
      "grossProfit": 20591000000,
      "costOfRevenue": 32305000000,
      "operatingRevenue": 52896000000,
      "totalRevenue": 52896000000,
      "operatingIncome": 14097000000,
      "netIncome": 11029000000,
      "researchAndDevelopment": 2776000000,
      "operatingExpense": 6494000000,
      "currentAssets": 101990000000,
      "totalAssets": 334532000000,
      "totalLiabilities": 200450000000,
      "currentCash": 15157000000,
      "currentDebt": 13991000000,
      "totalCash": 67101000000,
      "totalDebt": 98522000000,
      "shareholderEquity": 134082000000,
      "cashChange": -1214000000,
      "cashFlow": 12523000000,
      "operatingGainsLosses": null
    }
  ]
}
```

## 에픽
<a name="analyze-and-visualize-nested-json-data-with-amazon-athena-and-amazon-quicksight-epics"></a>

### S3 버킷 설정
<a name="set-up-an-s3-bucket"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| S3 버킷을 생성합니다. | JSON 파일을 저장할 버킷을 생성하려면에 로그인하고 [Amazon S3 콘솔](https://console.aws.amazon.com/s3/)을 AWS Management Console연 다음 **버킷 생성을** 선택합니다. 자세한 내용은 Amazon S3 설명서의 [버킷 생성](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)을 참조하십시오.  | 시스템 관리자 | 
| 중첩 JSON 데이터를 추가합니다. | 이 JSON 파일을 S3 버킷에 업로드합니다. 샘플 JSON 파일은 이전 섹션을 참조하세요. 이에 관한 지침은 Amazon S3 설명서의 [객체 업로드](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)를 참조하세요. | 시스템 관리자 | 

### Athena에서 데이터 분석
<a name="analyze-data-in-ate"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| JSON 데이터를 매핑하기 위한 테이블을 생성합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/analyze-and-visualize-nested-json-data-with-amazon-athena-and-amazon-quicksight.html)테이블 생성에 대한 자세한 내용은 [Athena 설명서](https://docs.aws.amazon.com/athena/latest/ug/creating-tables.html)를 참조하세요. | 개발자 | 
| 데이터 분석을 위한 보기를 생성합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/analyze-and-visualize-nested-json-data-with-amazon-athena-and-amazon-quicksight.html)보기 생성에 대한 자세한 내용은 [Athena 설명서](https://docs.aws.amazon.com/athena/latest/ug/create-view.html)를 참조하십시오. | 개발자 | 
| 데이터를 분석하고 검증합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/analyze-and-visualize-nested-json-data-with-amazon-athena-and-amazon-quicksight.html) | 개발자 | 

### Quick Sight에서 데이터 시각화
<a name="visualize-data-in-qsight"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Quick Sight에서 Athena를 데이터 소스로 설정합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/analyze-and-visualize-nested-json-data-with-amazon-athena-and-amazon-quicksight.html) | 시스템 관리자 | 
| Quick Sight에서 데이터를 시각화합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/analyze-and-visualize-nested-json-data-with-amazon-athena-and-amazon-quicksight.html) | 데이터 분석가 | 

## 관련 리소스
<a name="analyze-and-visualize-nested-json-data-with-amazon-athena-and-amazon-quicksight-resources"></a>
+ [Amazon Athena 설명서](https://docs.aws.amazon.com/athena/latest/ug/getting-started.html)
+ [Amazon Quick Sight 자습서](https://docs.aws.amazon.com/quicksuite/latest/userguide/example-analysis.html)
+ [중첩 JSON 작업](https://aws.amazon.com/blogs/big-data/create-tables-in-amazon-athena-from-nested-json-and-mappings-using-jsonserde/)(블로그 게시물)

# 에서 Amazon S3 AWS Data Exchange 로 데이터 수집 자동화
<a name="automate-data-ingestion-from-aws-data-exchange-into-amazon-s3"></a>

*Adnan Alvee와 Manikanta Gona, Amazon Web Services*

## 요약
<a name="automate-data-ingestion-from-aws-data-exchange-into-amazon-s3-summary"></a>

이 패턴은에서 Amazon Simple Storage Service(Amazon S3)의 AWS Data Exchange 데이터 레이크로 데이터를 자동으로 수집할 수 있는 CloudFormation 템플릿을 제공합니다. 

AWS Data Exchange 는 AWS Cloud의 파일 기반 데이터 세트를 안전하게 교환할 수 있는 서비스입니다. AWS Data Exchange 데이터 세트는 구독 기반입니다. 구독자는 공급자가 새 데이터를 게시하면 데이터 세트 수정본에도 액세스할 수 있습니다. 

 CloudFormation 템플릿은 Amazon CloudWatch Events 및 AWS Lambda 함수에 이벤트를 생성합니다. 이벤트는 구독한 데이터 세트의 모든 업데이트를 감시합니다. 업데이트가 있으면 CloudWatch는 지정한 S3 버킷으로 데이터를 복사하는 Lambda 함수를 시작합니다. 데이터가 성공적으로 복사되면, Lambda는 Amazon Simple Notification Service(Amazon SNS) 알림을 전송합니다.

## 사전 조건 및 제한 사항
<a name="automate-data-ingestion-from-aws-data-exchange-into-amazon-s3-prereqs"></a>

**사전 조건 **
+ 활성 AWS 계정
+ 에서 데이터 세트 구독 AWS Data Exchange

**제한 사항 **
+  CloudFormation 템플릿은에서 구독하는 각 데이터 세트에 대해 별도로 배포해야 합니다 AWS Data Exchange.

## 아키텍처
<a name="automate-data-ingestion-from-aws-data-exchange-into-amazon-s3-architecture"></a>

**대상 기술 스택 **
+ AWS Lambda
+ Amazon S3
+ AWS Data Exchange
+ Amazon CloudWatch()
+ Amazon SNS

**대상 아키텍처 **

![\[CloudWatch는 Lambda 함수를 시작하여 데이터를 S3 버킷에 복사하고 Amazon SNS 알림을 보냅니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/059816dc-5a71-4942-9c7f-ac977072eebc/images/ec021620-47c1-4fb5-95a9-3b8985accc56.png)


**자동화 및 규모 조정**

데이터 레이크에 수집하려는 데이터 세트에 CloudFormation 템플릿을 여러 번 사용할 수 있습니다.

## 도구
<a name="automate-data-ingestion-from-aws-data-exchange-into-amazon-s3-tools"></a>
+ [AWS Data Exchange](https://docs.aws.amazon.com/data-exchange/latest/userguide/what-is.html)를 사용하면 AWS 고객이에서 파일 기반 데이터 세트를 안전하게 교환할 수 있습니다 AWS 클라우드. 구독자는 자격을 갖춘 데이터 공급자의 수백 가지 제품을 찾아 구독할 수 있습니다. 그런 다음 데이터 세트를 빠르게 다운로드하거나 Amazon S3에 복사하여 다양한 AWS 분석 및 기계 학습 서비스에서 사용할 수 있습니다. 가 있는 사람은 누구나 AWS Data Exchange 구독자일 AWS 계정 수 있습니다.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)을(를) 사용하면 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행할 수 있습니다. Lambda는 필요 시에만 코드를 실행하며, 일일 몇 개의 요청에서 초당 수천 개의 요청까지 자동으로 규모를 조정합니다. 사용한 컴퓨팅 시간에 대해서만 요금을 지불하며 코드가 실행되지 않을 때는 요금이 부과되지 않습니다. Lambda에서는 사실상 모든 유형의 애플리케이션이나 백엔드 서비스에 대한 코드를 별도의 관리 없이 실행할 수 있습니다. Lambda는 고가용성 컴퓨팅 인프라에서 코드를 실행하고 서버와 운영 체제 유지 관리, 용량 프로비저닝 및 자동 조정, 코드 및 보안 패치 배포, 코드 모니터링 및 로깅 등 모든 컴퓨팅 리소스 관리를 수행합니다.
+ [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/gsg/GetStartedWithS3.html)는 인터넷용 스토리지를 제공합니다. Amazon S3를 사용하면 인터넷을 통해 언제 어디서든 원하는 양의 데이터를 저장하고 검색할 수 있습니다.
+ [Amazon CloudWatch Events](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html)는 AWS 리소스의 변경 사항을 설명하는 시스템 이벤트의 스트림을 거의 실시간으로 제공합니다. 신속하게 설정할 수 있는 단순 규칙을 사용하여 일치하는 이벤트를 검색하고 하나 이상의 대상 함수 또는 스트림으로 이를 라우팅할 수 있습니다. CloudWatch Events는 운영 변경 사항이 발생할 때 이를 인식하게 됩니다. 또한 환경에 응답하기 위한 메시지를 전송하고 함수를 활성화하고 변경을 수행하고 상태 정보를 기록하는 등 이러한 운영 변경 사항에 응답하고 필요에 따라 시정 조치를 취합니다. 또한 CloudWatch Events를 사용하여 **cron** 또는 **rate** 표현식을 통해 특정 시간에 자체 시작되는 자동 작업을 예약할 수 있습니다.
+ [Amazon Simple Notification Service(SNS)](https://docs.aws.amazon.com/sns/latest/dg/welcome.html)는 애플리케이션, 최종 사용자 및 디바이스가 클라우드에서 알림을 전송하고 수신할 수 있게 해줍니다. Amazon SNS는 처리량이 높은 푸시 기반 다대다 메시징을 위한 주제(커뮤니케이션 채널)를 제공합니다. 게시자는 Amazon SNS 주제를 사용하여 Amazon Simple Queue Service (Amazon SQS) 대기열, Lambda 함수, HTTP/S 웹후크 등 병렬 처리를 위해 많은 구독자에게 메시지를 배포할 수 있습니다. Amazon SNS를 사용하여 모바일 푸시, SMS 및 이메일을 사용하여 최종 사용자에게 알림을 전송할 수도 있습니다.

## 에픽
<a name="automate-data-ingestion-from-aws-data-exchange-into-amazon-s3-epics"></a>

### 데이터 세트 구독
<a name="subscribe-to-a-data-set"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 데이터 세트를 구독합니다. |  AWS Data Exchange 콘솔에서 데이터 세트를 구독합니다. 지침은 AWS 설명서의 [에서 데이터 제품 구독 AWS Data Exchange](https://docs.aws.amazon.com/data-exchange/latest/userguide/subscribe-to-data-sets.html)을 참조하세요. | 일반 AWS | 
| 데이터 세트 속성을 기록하세요. | 데이터 세트의 AWS 리전, ID 및 개정 ID를 기록해 둡니다. 다음 단계에서 CloudFormation 템플릿에이 정보가 필요합니다. | 일반 AWS | 

### CloudFormation 템플릿 배포
<a name="deploy-the-cfn-template"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| S3 버킷 및 폴더를 생성합니다. | Amazon S3에 데이터 레이크가 이미 있는 경우 수집할 데이터를 저장할 폴더를 생성합니다 AWS Data Exchange. 테스트 목적으로 템플릿을 배포하는 경우, 새 S3 버킷을 생성하고 다음 단계를 위해 버킷 이름과 폴더 접두사를 기록하세요. | 일반 AWS | 
|  CloudFormation 템플릿을 배포합니다. | 이 패턴에 대한 첨부 파일로 제공된 CloudFormation 템플릿을 배포합니다. 지침은 [CloudFormation 설명서](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html)를 참조하세요.데이터 세트 AWS 계정, 데이터 세트 및 S3 버킷 설정에 맞게 **데이터 세트 AWS 리전**, **데이터 세트 ID**, **개정 ID**, **S3 버킷 이름**(예: `DOC-EXAMPLE-BUCKET`), **폴더 접두사**(예: `myfolder/`), **SNS 알림용 이메일** 등의 파라미터를 구성합니다. **데이터세트 이름** 파라미터를 원하는 이름으로 설정할 수 있습니다. 템플릿을 배포하면 Lambda 함수가 실행되어 데이터 세트에서 사용 가능한 첫 번째 데이터 세트를 자동으로 수집합니다. 그런 다음 새 데이터가 데이터 세트에 도착하면 후속 수집이 자동으로 수행됩니다. | 일반 AWS | 

## 관련 리소스
<a name="automate-data-ingestion-from-aws-data-exchange-into-amazon-s3-resources"></a>
+ [에서 데이터 제품 구독 AWS Data Exchange](https://docs.aws.amazon.com/data-exchange/latest/userguide/subscribe-to-data-sets.html)(AWS Data Exchange 문서)

## 첨부
<a name="attachments-059816dc-5a71-4942-9c7f-ac977072eebc"></a>

이 문서와 관련된 추가 콘텐츠에 액세스하려면 [attachment.zip](samples/p-attach/059816dc-5a71-4942-9c7f-ac977072eebc/attachments/attachment.zip) 파일의 압축을 풉니다.

# AWS CloudFormation 템플릿을 사용하여 AWS Glue에서 암호화 적용 자동화
<a name="automate-encryption-enforcement-in-aws-glue-using-an-aws-cloudformation-template"></a>

*Diogo Guedes, Amazon Web Services*

## 요약
<a name="automate-encryption-enforcement-in-aws-glue-using-an-aws-cloudformation-template-summary"></a>

이 패턴은 AWS CloudFormation 템플릿을 사용하여 AWS Glue에서 암호화 적용을 설정하고 자동화하는 방법을 보여줍니다. 템플릿은 암호화를 적용하는 데 필요한 모든 구성과 리소스를 생성합니다. 이러한 리소스에는 초기 구성, Amazon EventBridge 규칙에 의해 생성된 예방 제어, AWS Lambda 함수가 포함됩니다.

## 사전 조건 및 제한 사항
<a name="automate-encryption-enforcement-in-aws-glue-using-an-aws-cloudformation-template-prereqs"></a>

**사전 조건 **
+ 활성 상태의 AWS 계정
+ CloudFormation 템플릿과 해당 리소스를 배포할 수 있는 권한

**제한 사항 **

이 보안 제어는 리전별로 적용됩니다. AWS Glue에서 암호화 적용을 설정하려는 각 AWS 리전에 보안 제어를 배포해야 합니다.

## 아키텍처
<a name="automate-encryption-enforcement-in-aws-glue-using-an-aws-cloudformation-template-architecture"></a>

**대상 기술 스택  **
+ Amazon CloudWatch Logs(AWS Lambda에서)
+ Amazon EventBridge 규칙
+ AWS CloudFormation 스택
+ AWS CloudTrail
+ AWS Identity and Access Management(IAM) 관리형 역할 및 정책
+ AWS Key Management Service (AWS KMS)
+ AWS KMS 별칭
+ AWS Lambda 함수
+ AWS Systems Manager Parameter Store

**대상 아키텍처**

다음 다이어그램은 AWS Glue에서 암호화 적용을 자동화하는 방법을 보여줍니다.

![\[이 다이어그램은 CloudFormation 템플릿을 사용하여 AWS Glue에서 암호화 적용을 자동화하는 방법을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/d50d0659-5592-44d0-8fcb-7a2983712640/images/272a7fb2-ecbc-41f7-a556-d555e4e39a59.png)


이 다이어그램은 다음 워크플로를 보여줍니다.

1. [CloudFormation 템플릿](https://github.com/aws-samples/aws-custom-guardrail-event-driven/blob/main/CloudFormation/aws-custom-guardrail-event-driven.yaml)은 AWS Glue에서의 암호화 시행을 위한 초기 구성 및 탐지 제어를 비롯한 모든 리소스를 생성합니다.

1. EventBridge 규칙은 암호화 구성의 상태 변경을 감지합니다.

1. Lambda 함수는 CloudWatch Logs를 통한 평가 및 로깅을 위해 호출됩니다. 규정 미준수 탐지의 경우, Parameter Store는 AWS KMS 키의 Amazon 리소스 이름(ARN)으로 복구됩니다. 서비스는 암호화가 활성화된 상태에서 규정 준수 상태로 개선됩니다.

**자동화 및 규모 조정**

[AWS Organizations](https://aws.amazon.com/organizations/)를 사용하는 경우, [AWS CloudFormation StackSets](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/what-is-cfnstacksets.html)를 사용하여 AWS Glue에서 암호화를 적용하려는 여러 계정에 이 템플릿을 배포할 수 있습니다.

## 도구
<a name="automate-encryption-enforcement-in-aws-glue-using-an-aws-cloudformation-template-tools"></a>
+ [Amazon CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html)는 AWS 리소스와 AWS에서 실시간으로 실행되는 애플리케이션의 지표를 모니터링하는 데 도움이 됩니다.
+ [Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html)는 애플리케이션을 다양한 소스의 실시간 데이터와 연결할 수 있는 서버리스 이벤트 버스 서비스입니다. Lambda 함수, API 대상을 사용하는 HTTP 간접 호출 엔드포인트 또는 다른 AWS 계정의 이벤트 버스를 예로 들 수 있습니다.
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)을 사용하면 AWS 리소스를 설정하고, 빠르고 일관되게 프로비저닝하고, 전체 AWS 계정 및 리전에서 수명 주기 전반에 걸쳐 관리할 수 있습니다.
+ [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html)은 운영 및 위험 감사, 거버넌스 및 AWS 계정의 규정 준수를 활성화하는 데 도움이 됩니다.
+ [AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/what-is-glue.html)는 완전 관리형 추출, 전환, 적재(ETL) 서비스입니다. 이를 통해 데이터 스토어와 데이터 스트림 간에 데이터를 안정적으로 분류, 정리, 보강하고 이동할 수 있습니다.
+ [AWS Key Management Service(AWS KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)를 사용하면 암호화 키를 생성하고 제어하여 데이터를 보호할 수 있습니다.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.
+ [AWS Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html)는 AWS 클라우드에서 실행되는 애플리케이션과 인프라를 관리하는 데 도움이 됩니다. 애플리케이션 및 리소스 관리를 간소화하고, 운영 문제의 감지 및 해결 시간을 단축하며, AWS 리소스를 규모에 따라 안전하게 관리하는 데 도움이 됩니다.

**코드 **

이 패턴의 코드는 GitHub [aws-custom-guardrail-event-driven](https://github.com/aws-samples/aws-custom-guardrail-event-driven/blob/main/CloudFormation/aws-custom-guardrail-event-driven.yaml) 리포지토리에서 사용할 수 있습니다.

## 모범 사례
<a name="automate-encryption-enforcement-in-aws-glue-using-an-aws-cloudformation-template-best-practices"></a>

AWS Glue는 [AWS Glue에 작업 작성](https://docs.aws.amazon.com/glue/latest/dg/author-job-glue.html) 및 [개발 엔드포인트를 사용하여 스크립트 개발](https://docs.aws.amazon.com/glue/latest/dg/dev-endpoint.html)에 대한 저장된 데이터 암호화를 지원합니다.

다음 모범 사례를 고려하세요.
+ AWS KMS 키를 사용하여 암호화된 저장 데이터를 기록하도록 ETL 작업 및 개발 엔드포인트를 구성합니다.
+ AWS KMS를 통해 관리하는 키를 사용하여 [AWS Glue 데이터 카탈로그](https://docs.aws.amazon.com/glue/latest/dg/components-overview.html#data-catalog-intro)에 저장된 메타데이터를 암호화합니다.
+ AWS KMS 키를 사용하여 [크롤러](https://docs.aws.amazon.com/glue/latest/dg/add-crawler.html) 및 ETL 작업에서 생성된 작업 북마크와 로그를 암호화합니다.

## 에픽
<a name="automate-encryption-enforcement-in-aws-glue-using-an-aws-cloudformation-template-epics"></a>

### CloudFormation 템플릿 시작
<a name="launch-the-cloudformation-template"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| CloudFormation 템플릿을 배포합니다. | GitHub [리포지토리](https://github.com/aws-samples/aws-custom-guardrail-event-driven/blob/main/CloudFormation/aws-custom-guardrail-event-driven.yaml)에서 `aws-custom-guardrail-event-driven.yaml` 템플릿을 다운로드한 다음 템플릿을 [배포](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/cloudformation/deploy/index.html)합니다. `CREATE_COMPLETE` 상태는 템플릿이 성공적으로 배포되었음을 나타냅니다.템플릿에는 입력 파라미터가 필요하지 않습니다. | 클라우드 아키텍트 | 

### AWS Glue의 암호화 설정 확인
<a name="verify-the-encryption-settings-in-aws-glue"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| AWS KMS 키 구성을 확인합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/automate-encryption-enforcement-in-aws-glue-using-an-aws-cloudformation-template.html) | 클라우드 아키텍트 | 

### 암호화 적용 테스트
<a name="test-the-encryption-enforcement"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| CloudFormation의 암호화 설정을 식별합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/automate-encryption-enforcement-in-aws-glue-using-an-aws-cloudformation-template.html) | 클라우드 아키텍트 | 
| 프로비저닝된 인프라를 미준수 상태로 전환합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/automate-encryption-enforcement-in-aws-glue-using-an-aws-cloudformation-template.html)가드레일은 확인란의 선택을 취소한 후 AWS Glue에서 규정 미준수 상태를 탐지한 다음 잘못된 암호화 구성을 자동으로 수정하여 규정 준수를 적용합니다. 이에 따라, 페이지를 새로 고친 후 암호화 확인란을 다시 선택해야 합니다. | 클라우드 아키텍트 | 

## 관련 리소스
<a name="automate-encryption-enforcement-in-aws-glue-using-an-aws-cloudformation-template-resources"></a>
+ [AWS CloudFormation 콘솔에서 스택 생성](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html)(AWS CloudFormation 설명서)
+ [AWS CloudTrail을 사용하여 AWS API 호출에서 트리거되는 CloudWatch Events 규칙 생성](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/Create-CloudWatch-Events-CloudTrail-Rule.html)(Amazon CloudWatch 설명서)
+ [AWS Glue에서 암호화 설정](https://docs.aws.amazon.com/glue/latest/dg/set-up-encryption.html)(AWS Glue 설명서)

# AWS DataOps 개발 키트를 사용하여 Google Analytics 데이터를 수집, 변환 및 분석하는 데이터 파이프라인 구축
<a name="build-a-data-pipeline-to-ingest-transform-and-analyze-google-analytics-data-using-the-aws-dataops-development-kit"></a>

*Anton Kukushkin과 Rudy Puig, Amazon Web Services*

## 요약
<a name="build-a-data-pipeline-to-ingest-transform-and-analyze-google-analytics-data-using-the-aws-dataops-development-kit-summary"></a>

이 패턴은 AWS DataOps Development Kit(AWS DDK) 및 기타를 사용하여 Google Analytics 데이터를 수집, 변환 및 분석하는 데이터 파이프라인을 구축하는 방법을 설명합니다 AWS 서비스. AWS DDK는 데이터 워크플로와 최신 데이터 아키텍처를 구축하는 데 도움이 되는 오픈 소스 개발 프레임워크입니다 AWS. AWS DDK의 주요 목표 중 하나는 파이프라인 오케스트레이션, 인프라 구축, 해당 인프라 이면의 DevOps 생성과 같이 일반적으로 노동 집약적인 데이터 파이프라인 작업에 할애하는 시간과 노력을 절약하는 것입니다. 이러한 노동 집약적인 작업을 AWS DDK로 오프로드하여 코드 작성 및 기타 고부가가치 활동에 집중할 수 있습니다.

## 사전 조건 및 제한 사항
<a name="build-a-data-pipeline-to-ingest-transform-and-analyze-google-analytics-data-using-the-aws-dataops-development-kit-prereqs"></a>

**사전 조건 **
+ 활성 AWS 계정
+ Google Analytics용 Amazon AppFlow 커넥터, [구성됨](https://docs.aws.amazon.com/appflow/latest/userguide/google-analytics.html)
+ [Python](https://www.python.org/downloads/) 및 [pip](https://pip.pypa.io/en/stable/cli/pip_download/)(Python의 패키지 관리자)
+ Git, 설치 및 [구성됨](https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup)
+ AWS Command Line Interface (AWS CLI), [설치](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) 및 [구성](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)됨
+ AWS Cloud Development Kit (AWS CDK)[설치](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_install)

**제품 버전**
+ Python 3.7 이상
+ pip 9.0.3 이상

## 아키텍처
<a name="build-a-data-pipeline-to-ingest-transform-and-analyze-google-analytics-data-using-the-aws-dataops-development-kit-architecture"></a>

**기술 스택**
+ Amazon AppFlow
+ Amazon Athena
+ Amazon CloudWatch()
+ Amazon EventBridge
+ Amazon Simple Storage Service(Amazon S3)
+ Amazon Simple Queue Service(Amazon SQS)
+ AWS DataOps 개발 키트(AWS DDK)
+ AWS Lambda

**대상 아키텍처 **

다음 다이어그램은 Google Analytics 데이터를 수집, 변환, 분석하는 이벤트 기반 프로세스를 보여줍니다.

![\[AWS 서비스를 사용하여 Google Analytics 데이터를 수집, 변환 및 분석합니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/edf40222-2867-4d4a-9153-ab29785b6662/images/8c38b472-153b-4497-982c-8efb97d2f7a5.png)


이 다이어그램은 다음 워크플로를 보여줍니다.

1. Amazon CloudWatch 예약 이벤트 규칙은 Amazon AppFlow를 호출합니다.

1. Amazon AppFlow는 Google Analytics 데이터를 S3 버킷으로 수집합니다.

1. S3 버킷에서 데이터를 수집한 후, EventBridge의 이벤트 알림이 생성되고, CloudWatch 이벤트 규칙에 의해 캡처된 다음, Amazon SQS 대기열에 추가됩니다.

1. Lambda 함수는 Amazon SQS 대기열에서 이벤트를 사용하고, 각 S3 객체를 읽고, 객체를 Apache Parquet 형식으로 변환하고, 변환된 객체를 S3 버킷에 쓴 다음 AWS Glue Data Catalog 테이블 정의를 생성하거나 업데이트합니다.

1. Athena 쿼리는 테이블에 대해 실행됩니다.

## 도구
<a name="build-a-data-pipeline-to-ingest-transform-and-analyze-google-analytics-data-using-the-aws-dataops-development-kit-tools"></a>

**AWS 도구**
+ [Amazon AppFlow](https://docs.aws.amazon.com/appflow/latest/userguide/what-is-appflow.html)는 서비스형 소프트웨어(SaaS) 애플리케이션 간에 데이터를 안전하게 교환하는 데 사용할 수 있는 완전 관리형 통합 서비스입니다.
+ [Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/what-is.html)는 표준 SQL을 사용하여 Amazon S3에 있는 데이터를 직접 분석할 수 있는 대화형 쿼리 서비스입니다.
+ [Amazon CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html)를 사용하면 AWS 리소스 및에서 실행되는 애플리케이션의 지표를 실시간으로 모니터링할 AWS 수 있습니다.
+ [Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html)는 애플리케이션을 다양한 소스의 실시간 데이터와 연결할 수 있는 서버리스 이벤트 버스 서비스입니다. 예를 들어 AWS Lambda 함수, API 대상을 사용하는 HTTP 호출 엔드포인트 또는 다른의 이벤트 버스 등이 있습니다 AWS 계정.
+ [Amazon Simple Storage Service(S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)는 원하는 양의 데이터를 저장, 보호 및 검색하는 데 도움이 되는 클라우드 기반 객체 스토리지 서비스입니다.
+ [Amazon Simple Queue Service(Amazon SQS)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html)는 내구력 있고 가용성이 뛰어난 보안 호스팅 대기열을 제공하며 이를 통해 분산 소프트웨어 시스템과 구성 요소를 통합 및 분리할 수 있습니다.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html)는 코드에서 클라우드 인프라를 정의하고 이를 프로비저닝하기 위한 프레임워크입니다 CloudFormation.
+ [AWS DataOps Development Kit(AWS DDK)](https://github.com/awslabs/aws-ddk)는 데이터 워크플로와 최신 데이터 아키텍처를 구축하는 데 도움이 되는 오픈 소스 개발 프레임워크입니다 AWS.

**코드**

이 패턴의 코드는 GitHub [AWS DataOps Development Kit(AWS DDK)](https://github.com/awslabs/aws-ddk) 및 Amazon [ AppFlow, Amazon Athena 및 AWS DataOps Development Kit 리포지토리를 사용한 Google Analytics 데이터 분석에서](https://github.com/aws-samples/aws-ddk-examples/tree/main/google-analytics-data-using-appflow/python) 사용할 수 있습니다.

## 에픽
<a name="build-a-data-pipeline-to-ingest-transform-and-analyze-google-analytics-data-using-the-aws-dataops-development-kit-epics"></a>

### 환경 준비
<a name="prepare-the-environment"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 소스 코드를 복제합니다. | 다음 명령을 실행하여 소스 코드를 빌드합니다.<pre>git clone https://github.com/aws-samples/aws-ddk-examples.git</pre> | DevOps 엔지니어 | 
| 가상 환경을 생성합니다. | 소스 코드 디렉터리로 이동한 후, 다음 명령을 실행하여 가상 환경을 생성합니다.<pre>cd google-analytics-data-using-appflow/python && python3 -m venv .venv</pre> | DevOps 엔지니어 | 
| 종속성을 설치합니다. | 가상 환경을 활성화하고 종속성을 설치하려면 다음 명령을 실행합니다.<pre>source .venv/bin/activate && pip install -r requirements.txt</pre> | DevOps 엔지니어 | 

### 데이터 파이프라인을 사용하는 애플리케이션을 배포합니다.
<a name="deploy-the-application-that-uses-your-data-pipeline"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 환경을 부트스트랩합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/build-a-data-pipeline-to-ingest-transform-and-analyze-google-analytics-data-using-the-aws-dataops-development-kit.html) | DevOps 엔지니어 | 
| 데이터를 배포합니다. | 데이터 파이프라인을 배포하려면 `cdk deploy --profile [AWS_PROFILE]` 명령을 실행합니다. | DevOps 엔지니어 | 

### 배포 테스트
<a name="test-the-deployment"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 스택 상태를 확인합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/build-a-data-pipeline-to-ingest-transform-and-analyze-google-analytics-data-using-the-aws-dataops-development-kit.html) | DevOps 엔지니어 | 

## 문제 해결
<a name="build-a-data-pipeline-to-ingest-transform-and-analyze-google-analytics-data-using-the-aws-dataops-development-kit-troubleshooting"></a>


| 문제 | Solution | 
| --- | --- | 
| `AWS::AppFlow::Flow` 리소스 생성 중에 배포 실패 및 `Connector Profile with name ga-connection does not exist` 오류가 나타납니다. | Google Analytics용 Amazon AppFlow 커넥터를 만들고 이름을 `ga-connection`으로 지정했는지 확인하십시오.지침은 Amazon AppFlow 설명서의 [Google Analytics](https://docs.aws.amazon.com/appflow/latest/userguide/google-analytics.html)를 참고하십시오. | 

## 관련 리소스
<a name="build-a-data-pipeline-to-ingest-transform-and-analyze-google-analytics-data-using-the-aws-dataops-development-kit-resources"></a>
+ [AWS DataOps 개발 키트(AWS DDK)](https://github.com/awslabs/aws-ddk)(GitHub)
+ [AWS DDK 예제](https://github.com/aws-samples/aws-ddk-examples)(GitHub)

## 추가 정보
<a name="build-a-data-pipeline-to-ingest-transform-and-analyze-google-analytics-data-using-the-aws-dataops-development-kit-additional"></a>

AWS DDK 데이터 파이프라인은 하나 이상의 단계로 구성됩니다. 다음 코드 예제에서는 `AppFlowIngestionStage`를 사용하여 Google Analytics에서 데이터를 수집하고, `SqsToLambdaStage`를 사용하여 데이터 변환을 처리하고, `AthenaSQLStage`를 사용하여 Athena 쿼리를 실행합니다.

먼저 다음과 같은 코드 예제에서 볼 수 있듯이 데이터 변환 및 수집 단계가 생성됩니다.

```
        appflow_stage = AppFlowIngestionStage(
            self,
            id="appflow-stage",
            flow_name=flow.flow_name,
        )
        sqs_lambda_stage = SqsToLambdaStage(
            self,
            id="lambda-stage",
            lambda_function_props={
                "code": Code.from_asset("./ddk_app/lambda_handlers"),
                "handler": "handler.lambda_handler",
                "layers": [
                    LayerVersion.from_layer_version_arn(
                        self,
                        id="layer",
                        layer_version_arn=f"arn:aws:lambda:{self.region}:336392948345:layer:AWSDataWrangler-Python39:1",
                    )
                ],
                "runtime": Runtime.PYTHON_3_9,
            },
        )
        # Grant lambda function S3 read & write permissions
        bucket.grant_read_write(sqs_lambda_stage.function)
        # Grant Glue database & table permissions
        sqs_lambda_stage.function.add_to_role_policy(
            self._get_glue_db_iam_policy(database_name=database.database_name)
        )
        athena_stage = AthenaSQLStage(
            self,
            id="athena-sql",
            query_string=[
                (
                    "SELECT year, month, day, device, count(user_count) as cnt "
                    f"FROM {database.database_name}.ga_sample "
                    "GROUP BY year, month, day, device "
                    "ORDER BY cnt DESC "
                    "LIMIT 10; "
                )
            ],
            output_location=Location(
                bucket_name=bucket.bucket_name, object_key="query-results/"
            ),
            additional_role_policy_statements=[
                self._get_glue_db_iam_policy(database_name=database.database_name)
            ],
        )
```

다음으로, 아래의 코드 예제에서 볼 수 있듯이 이 `DataPipeline` 구성은 EventBridge 규칙을 사용하여 스테이지를 함께 “연결”하는 데 사용됩니다.

```
        (
            DataPipeline(self, id="ingestion-pipeline")
            .add_stage(
                stage=appflow_stage,
                override_rule=Rule(
                    self,
                    "schedule-rule",
                    schedule=Schedule.rate(Duration.hours(1)),
                    targets=appflow_stage.targets,
                ),
            )
            .add_stage(
                stage=sqs_lambda_stage,
                # By default, AppFlowIngestionStage stage emits an event after the flow run finishes successfully
                # Override rule below changes that behavior to call the the stage when data lands in the bucket instead
                override_rule=Rule(
                    self,
                    "s3-object-created-rule",
                    event_pattern=EventPattern(
                        source=["aws.s3"],
                        detail={
                            "bucket": {"name": [bucket.bucket_name]},
                            "object": {"key": [{"prefix": "ga-data"}]},
                        },
                        detail_type=["Object Created"],
                    ),
                    targets=sqs_lambda_stage.targets,
                ),
            )
            .add_stage(stage=athena_stage)
        )
```

자세한 코드 예제는 GitHub [Analyzing Google Analytics data with Amazon AppFlow, Amazon Athena, and AWS DataOps Development Kit](https://github.com/aws-samples/aws-ddk-examples/tree/main/google-analytics-data-using-appflow/python) repository를 참조하세요.

# Amazon Kinesis Video Streams 및 Fargate를 사용하여 비디오 처리 파이프라인 구축하기
<a name="build-a-video-processing-pipeline-by-using-amazon-kinesis-video-streams-and-aws-fargate"></a>

*Piotr Chotkowski, Pushparaju Thangavel, Amazon Web Services*

## 요약
<a name="build-a-video-processing-pipeline-by-using-amazon-kinesis-video-streams-and-aws-fargate-summary"></a>

이 패턴은[Amazon Kinesis Video Streams](https://aws.amazon.com/kinesis/video-streams/)와 [Fargate](https://aws.amazon.com/fargate)를 사용하여 비디오 스트림에서 프레임을 추출하고 추가 처리를 위해 [Amazon Simple Storage Service(S3](https://aws.amazon.com/s3/))에 저장하는 방법을 보여줍니다. 

이 패턴은 Java Maven 프로젝트 형태의 샘플 애플리케이션을 제공합니다. 이 애플리케이션은 [Cloud Development Kit](https://aws.amazon.com/cdk/)(CDK)를 사용하여 인프라를 정의합니다. 프레임 처리 로직과 인프라 정의 모두 Java 프로그래밍 언어로 작성되었습니다. 이 샘플 애플리케이션을 기반으로 실시간 비디오 처리 파이프라인을 개발하거나 기계 학습 파이프라인의 비디오 전처리 단계를 구축할 수 있습니다. 

## 사전 조건 및 제한 사항
<a name="build-a-video-processing-pipeline-by-using-amazon-kinesis-video-streams-and-aws-fargate-prereqs"></a>

**사전 조건 **
+ 활성 상태의 계정
+ Java SE Development Kit (JDK) 11가 설치됨
+ [Apache Maven](https://maven.apache.org/)이 설치됨
+ [Cloud Development Kit(CDK)](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html)가 설치됨
+ [Command Line Interface(CLI)](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html) 버전 2가 설치됨
+ [도커](https://docs.docker.com/get-docker/)(Fargate 작업 정의에서 사용할 도커 이미지를 구축하는 데 필요)가 설치됨

**제한 사항 **

이 패턴은 개념 증명 또는 추가 개발을 위한 기반으로 사용됩니다. 프로덕션 배포에는 현재 형태로 사용할 수 없습니다.

**제품 버전**
+ 이 패턴은 CDK 버전 1.77.0에서 테스트했습니다([CDK 버전](https://docs.aws.amazon.com/cdk/api/latest/versions.html) 참조)
+ JDK 11
+ CLI 버전 2

## 아키텍처
<a name="build-a-video-processing-pipeline-by-using-amazon-kinesis-video-streams-and-aws-fargate-architecture"></a>

**대상 기술 스택**
+ Amazon Kinesis Video Streams
+ Fargate 태스크
+ Amazon Simple Queue Service(Amazon SQS) 대기열
+ Amazon S3 버킷

**대상 아키텍처**

![\[Kinesis Video Streams 및 Fargate를 사용하여 비디오 처리 파이프라인을 구축하기 위한 아키텍처.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/9d1442c2-f3ee-47fd-8cce-90d9206ce4d4/images/a60e585f-27be-4dd6-897b-c38adf1d283f.png)


사용자는 Kinesis 비디오 스트림을 생성하고, 비디오를 업로드하며, 입력 Kinesis 비디오 스트림 및 출력 S3 버킷에 대한 세부 정보가 포함된 JSON 메시지를 SQS 대기열로 전송합니다. 컨테이너에서 기본 애플리케이션을 실행하는 Fargate는 SQS 대기열에서 메시지를 가져와 프레임 추출을 시작합니다. 각 프레임은 이미지 파일에 저장되고 대상 S3 버킷에 저장됩니다.

**자동화 및 규모 조정**

샘플 애플리케이션은 단일 리전 내에서 수평 및 수직으로 규모를 조정할 수 있습니다. SQS 대기열에서 읽는 배포된 Fargate 작업 수를 늘리면 수평적 규모 조정이 가능합니다. 애플리케이션의 프레임 분할 및 이미지 게시 스레드 수를 늘리면 수직적 규모 조정이 가능합니다. 이러한 설정은 CDK의 [QueueProcessingFargateService](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-ecs-patterns.QueueProcessingFargateService.html) 리소스 정의에서 애플리케이션에 환경 변수로 전달됩니다. CDK 스택 배포의 특성상 추가 노력 없이 이 애플리케이션을 여러 리전 및 계정에 배포할 수 있습니다.

## 도구
<a name="build-a-video-processing-pipeline-by-using-amazon-kinesis-video-streams-and-aws-fargate-tools"></a>

**도구**
+ [CDK는](https://aws.amazon.com/cdk/) TypeScript, JavaScript, Python, Java, C\$1/.Net 등의 프로그래밍 언어를 사용하여 클라우드 인프라 및 리소스를 정의하기 위한 소프트웨어 개발 프레임워크입니다.
+ [Amazon Kinesis Video Streams](https://aws.amazon.com/kinesis/video-streams/)는 라이브 비디오를 디바이스에서 클라우드로 스트리밍하거나 실시간 비디오 처리 또는 배치 중심 비디오 분석을 위한 애플리케이션을 빌드하는 데 사용할 수 있는 완전 관리형 서비스입니다.
+ [Fargate](https://aws.amazon.com/fargate)는 컨테이너용 서버리스 컴퓨팅 엔진입니다. Fargate를 사용하면 서버를 프로비저닝하고 관리할 필요가 없으므로 애플리케이션 개발에만 집중할 수 있습니다.
+ [Amazon S3](https://aws.amazon.com/s3/)는 업계 최고의 확장성, 데이터 가용성, 보안 및 성능을 제공하는 객체 스토리지 서비스입니다.
+ [Amazon SQS](https://aws.amazon.com/sqs/)는 마이크로서비스와 분산 시스템, 서버리스 애플리케이션을 분리하거나 확장하기 쉽게 해 주는 완전 관리형 메시지 대기열 서비스입니다.

**코드**
+ 샘플 애플리케이션 프로젝트(`frame-splitter-code.zip`)의.zip 파일이 첨부되어 있습니다.

## 에픽
<a name="build-a-video-processing-pipeline-by-using-amazon-kinesis-video-streams-and-aws-fargate-epics"></a>

### 인프라 배포
<a name="deploy-the-infrastructure"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Docker 대몬(daemon)을 시작합니다. | 로컬 시스템에서 Docker 대몬(daemon)을 시작합니다. CDK는 Docker를 사용하여 Fargate 작업에 사용되는 이미지를 구축합니다. 다음 단계를 진행하기 전에 Docker를 실행해야 합니다. | 개발자, DevOps 엔지니어 | 
| 프로젝트를 빌드합니다. | `frame-splitter-code` 샘플 애플리케이션(첨부)을 다운로드하고 해당 콘텐츠를 로컬 시스템의 폴더에 추출합니다. 인프라를 배포하려면 먼저 [Java Maven](https://maven.apache.org/) 프로젝트를 빌드해야 합니다. 명령 프롬프트에서 프로젝트의 루트 디렉터리로 이동하고 다음 명령을 실행하여 프로젝트를 빌드합니다. <pre>mvn clean install</pre> | 개발자, DevOps 엔지니어 | 
| CDK를 부트스트랩합니다. | (CDK를 처음 사용하는 사용자만 해당) CDK를 처음 사용하는 경우, 다음에서 CLI 명령을 실행하여 환경을 부트스트랩해야 할 수 있습니다.<pre>cdk bootstrap --profile "$AWS_PROFILE_NAME" </pre>`$AWS_PROFILE_NAME`이 보안 인증 정보의 프로필 이름을 보유할 때. 또는 이 파라미터를 제거하여 기본 프로필을 사용할 수 있습니다. 자세한 내용은 [CDK 설명서](https://docs.aws.amazon.com/cdk/latest/guide/bootstrapping.html)를 참조하십시오. | 개발자, DevOps 엔지니어 | 
| CDK 스택을 배포합니다. | 이 단계에서는 계정에서 필요한 인프라 리소스(SQS 대기열, S3 버킷, Fargate 작업 정의)를 생성하고, Fargate 작업에 필요한 도커 이미지를 구축하고, 애플리케이션을 배포합니다. 명령 프롬프트에서 프로젝트의 루트 디렉터리로 이동하고 다음 명령을 실행합니다.<pre>cdk deploy --profile "$AWS_PROFILE_NAME" --all </pre>`$AWS_PROFILE_NAME`이 보안 인증 정보의 프로필 이름을 보유할 때. 또는 이 파라미터를 제거하여 기본 프로필을 사용할 수 있습니다. 배포를 확인합니다. CDK 배포 출력의 **QueueUrl ** 및 **버킷**값을 기록해 둡니다. 이 값은 이후 단계에서 필요합니다. CDK는 자산을 생성하고, 이를 계정에 업로드하고, 모든 인프라 리소스를 생성합니다. [CloudFormation 콘솔](https://console.aws.amazon.com/cloudformation/)에서 리소스 생성 프로세스를 관찰할 수 있습니다. 자세한 내용은 [AWS CloudFormation 설명서](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) 및 [CDK 설명서](https://docs.aws.amazon.com/cdk/latest/guide/hello_world.html#hello_world_tutorial_deploy)를 참조하십시오. | 개발자, DevOps 엔지니어 | 
| 비디오 스트림을 생성합니다. | 이 단계에서는 비디오 처리를 위한 입력 스트림으로 사용할 Kinesis 비디오 스트림을 생성합니다. CLI가 설치되고 구성되어 있는지 확인합니다. CLI에서 다음을 실행합니다.<pre>aws kinesisvideo --profile "$AWS_PROFILE_NAME" create-stream --stream-name "$STREAM_NAME" --data-retention-in-hours "24" </pre>`$AWS_PROFILE_NAME`은(는) 보안 인증 정보의 프로필 이름을 보유하고 있으며(또는 기본 프로필을 사용하려면 이 파라미터를 제거), `$STREAM_NAME`은(는) 임의의 유효한 스트림 이름일 때. 또는 [Kinesis 비디오 스트림 설명서](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/gs-createstream.html#gs-createstream-console)의 단계에 따라 Kinesis 콘솔을 사용하여 비디오 스트림을 생성할 수도 있습니다. 생성된 스트림의 리소스 이름(ARN)을 적어 둡니다. 나중에 필요할 수 있습니다. | 개발자, DevOps 엔지니어 | 

### 예제 실행
<a name="run-an-example"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 비디오를 스트림에 업로드합니다. | 샘플 `frame-splitter-code` 애플리케이션의 프로젝트 폴더에서 `src/test/java/amazon/awscdk/examples/splitter` 폴더에 있는 `ProcessingTaskTest.java` 파일을 엽니다. `profileName`** **및 `streamName`** **변수를 이전 단계에서 사용한 값으로 대체합니다. 이전 단계에서 만든 Kinesis 비디오 스트림에 예시 비디오를 업로드하려면 다음을 실행합니다. <pre>amazon.awscdk.examples.splitter.ProcessingTaskTest#testExample test</pre>또는 [Kinesis 비디오 스트림 설명서](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk.html)에 설명된 방법 중 하나를 사용하여 비디오를 업로드할 수 있습니다. | 개발자, DevOps 엔지니어 | 
| 비디오 프로세싱을 시작합니다. | Kinesis 비디오 스트림에 비디오를 업로드했으므로 이제 처리를 시작할 수 있습니다. 처리 로직을 시작하려면 CDK가 배포 중에 생성한 세부 정보가 포함된 메시지를 SQS 대기열로 보내야 합니다. CLI를 사용하여 메시지를 보내려면 다음을 실행합니다.<pre>aws sqs --profile "$AWS_PROFILE_NAME" send-message --queue-url QUEUE_URL --message-body MESSAGE </pre>`$AWS_PROFILE_NAME`은(는) 보안 인증 정보의 프로파일 이름을 보유하고 있고(기본 프로파일을 사용하려면 이 파라미터 제거), `QUEUE_URL`은(는) CDK 출력의 **QueueUrl **값이고, `MESSAGE`은(는) 다음 형식의 JSON 문자열일 때. <pre>{ "streamARN": "STREAM_ARN", "bucket": "BUCKET_NAME", "s3Directory": "test-output" }</pre>`STREAM_ARN`은(는) 이전 단계에서 생성한 비디오 스트림의 ARN이고, `BUCKET_NAME`은(는) CDK 출력의 **버킷** 값일 때. 이 메시지를 보내면 비디오 처리가 시작됩니다. [Amazon SQS 설명서](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-using-send-messages.html)에 설명된 대로 Amazon SQS 콘솔을 사용하여 메시지를 보낼 수도 있습니다. | 개발자, DevOps 엔지니어 | 
| 비디오 프레임 이미지 보기. | `s3://BUCKET_NAME/test-output` `BUCKET_NAME`이(가) CDK 출력의 **버킷** 값일 때, S3 출력 버킷에서 결과 이미지를 볼 수 있습니다. | 개발자, DevOps 엔지니어 | 

## 관련 리소스
<a name="build-a-video-processing-pipeline-by-using-amazon-kinesis-video-streams-and-aws-fargate-resources"></a>
+ [CDK 설명서](https://docs.aws.amazon.com/cdk/latest/guide/home.html)
+ [CDK API 레퍼런스](https://docs.aws.amazon.com/cdk/api/latest/docs/aws-construct-library.html)
+ [CDK 입문 워크숍](https://cdkworkshop.com/)
+ [Amazon Kinesis Video Streams 설명서](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/what-is-kinesis-video.html)
+ [예: SageMaker를 사용하여 비디오 스트림에서 객체 식별](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/examples-sagemaker.html)
+ [예: Kinesis Video Streams 프래그먼트의 구문 분석 및 렌더링](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/examples-renderer.html)
+ [Amazon Kinesis Video Streams와 Amazon SageMaker를 사용하여 스케일 인 라이브 비디오를 실시간으로 분석할 수 있습니다](https://aws.amazon.com/blogs/machine-learning/analyze-live-video-at-scale-in-real-time-using-amazon-kinesis-video-streams-and-amazon-sagemaker/) (기계 학습 블로그 게시물).
+ [Fargate 시작하기](https://aws.amazon.com/fargate/getting-started/)

## 추가 정보
<a name="build-a-video-processing-pipeline-by-using-amazon-kinesis-video-streams-and-aws-fargate-additional"></a>

**IDE 선택**

선호하는 Java IDE를 사용하여 이 프로젝트를 빌드하고 탐색하는 것이 좋습니다. 

**정리**

이 예제를 모두 실행한 후에는 배포된 리소스를 모두 제거하여 추가 인프라 비용이 발생하지 않도록 하십시오. 

인프라 및 비디오 스트림을 제거하려면 CLI에서 다음 두 명령을 사용하십시오.

```
cdk destroy --profile "$AWS_PROFILE_NAME" --all
```

```
aws kinesisvideo --profile "$AWS_PROFILE_NAME" delete-stream --stream-arn "$STREAM_ARN"
```

또는 CloudFormation 콘솔을 사용하여 CloudFormation 스택을 제거하고 Kinesis 콘솔을 사용하여 Kinesis 비디오 스트림을 제거하여 리소스를 수동으로 제거할 수도 있습니다. 단, `cdk destroy`은(는) 출력 S3 버킷이나 Amazon Elastic Container Registry(Amazon ECR) 리포지토리(`aws-cdk/assets`)의 이미지를 제거하지 않습니다. 이를 수동으로 제거해야 합니다.

## 첨부
<a name="attachments-9d1442c2-f3ee-47fd-8cce-90d9206ce4d4"></a>

이 문서와 관련된 추가 콘텐츠에 액세스하려면 [attachment.zip](samples/p-attach/9d1442c2-f3ee-47fd-8cce-90d9206ce4d4/attachments/attachment.zip) 파일의 압축을 풉니다.

# AWS Glue를 사용하여 Amazon S3에서 Amazon Redshift로 데이터를 점차 늘려 로딩하기 위한 ETL 서비스 파이프라인 빌드
<a name="build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue"></a>

*Rohan Jamadagni, Arunabha Datta, Amazon Web Services*

## 요약
<a name="build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue-summary"></a>

이 패턴은 최적의 데이터 레이크 성능을 위해 Amazon Simple Storage Service(S3)를 구성한 다음, AWS Glue를 사용하여 추출, 전환, 적재(ETL) 작업을 수행하여 Amazon S3에서 Amazon Redshift로 점진적인 데이터 변경 사항을 로드하는 방법에 대한 지침을 제공합니다. 

Amazon S3의 소스 파일은 쉼표로 구분된 값 (CSV), XML, JSON 파일 등 다양한 형식을 가질 수 있습니다. 이 패턴은 AWS Glue를 사용하여 소스 파일을 Apache Parquet과 같이 비용 최적화 및 성능이 최적화된 형식으로 변환하는 방법을 설명합니다. Amazon Athena와 Amazon Redshift Spectrum에서 직접 파켓 파일을 쿼리할 수 있습니다. 또한 Parquet 파일을 Amazon Redshift에 로드하고, 집계하고, 집계된 데이터를 소비자와 공유하거나 Amazon Quick Sight를 사용하여 데이터를 시각화할 수 있습니다.

## 사전 조건 및 제한 사항
<a name="build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue-prereqs"></a>

**사전 조건 **
+ 활성 상태의 계정
+ 적절한 권한이 있고 CSV, XML 또는 JSON 파일을 포함하는 S3 소스 버킷.

**가정**
+ CSV, XML 또는 JSON 소스 파일은 이미 Amazon S3에 로드되어 있으며, AWS Glue 및 Amazon Redshift가 구성된 계정에서 액세스할 수 있습니다.
+ [Amazon Redshift 설명서](https://docs.aws.amazon.com/redshift/latest/dg/t_Loading-data-from-S3.html)에 설명된 대로 파일 로드, 파일 분할, 압축 및 매니페스트 사용에 대한 모범 사례를 따릅니다.
+ 소스 파일 구조는 변경되지 않습니다.
+ 소스 시스템은 Amazon S3에 정의된 폴더 구조를 따라 Amazon S3에 데이터를 수집할 수 있습니다.
+ Amazon Redshift 클러스터는 단일 가용 영역에 걸쳐 있습니다. (이 아키텍처는 AWS Lambda, AWS Glue 및 Amazon Athena가 서버리스이기 때문에 적절합니다.) 고가용성을 위해 클러스터 스냅샷은 일정한 빈도로 촬영됩니다.

**제한 사항 **
+ 파일 형식은 [현재 AWS Glue에서 지원](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-format.html)하는 형식으로 제한됩니다.
+ 실시간 다운스트림 보고는 지원되지 않습니다.

## 아키텍처
<a name="build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue-architecture"></a>

**소스 기술 스택**
+ CSV, XML 또는 JSON 파일이 포함된 S3 버킷

**대상 기술 스택**
+ S3 데이터 레이크(파티셔닝된 Parquet 파일 스토리지 포함)
+ Amazon Redshift

**대상 아키텍처 **

![\[AWS Glue를 사용하여 Amazon S3에서 Amazon Redshift로 증분 변경 사항을 로드하기 위한 아키텍처.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/105b58ec-56c1-464a-8e69-f625360caa14/images/626aa365-e6e6-4874-a873-1c71adbe5306.png)


 

**데이터 흐름**

![\[AWS Glue를 사용하여 Amazon S3에서 Amazon Redshift로 증분 변경 사항을 로드하기 위한 데이터 흐름.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/105b58ec-56c1-464a-8e69-f625360caa14/images/29569e48-9f2d-4f48-bc59-1f33949d01ca.png)


## 도구
<a name="build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue-tools"></a>
+ [Amazon S3](https://aws.amazon.com/s3/) - Amazon Simple Storage Service(S3)는 확장성이 뛰어난 객체 스토리지 서비스입니다. Amazon S3는 웹 사이트, 모바일 애플리케이션, 백업, 데이터 레이크 등 다양한 스토리지 솔루션에 사용할 수 있습니다.
+ [AWS Lambda](https://aws.amazon.com/lambda/) – AWS Lambda는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있습니다. AWS Lambda는 이벤트 기반 서비스이므로 다른 AWS 서비스에서 자동으로 시작되도록 코드를 설정할 수 있습니다.
+ [Amazon Redshift](https://aws.amazon.com/redshift/) - Amazon Redshift는 클라우드의 완전 관리형 페타바이트 규모 데이터 웨어하우스 서비스입니다. Amazon Redshift를 사용하면 표준 SQL을 사용하여 데이터 웨어하우스와 데이터 레이크 전반에서 페타바이트 규모의 정형 및 반정형 데이터를 쿼리할 수 있습니다.
+ [AWS Glue](https://aws.amazon.com/glue/) - AWS Glue는 고객이 분석할 데이터를 쉽게 준비하고 로드할 수 있는 완전관리형 ETL 서비스입니다. AWS Glue는 데이터를 검색하고 관련 메타데이터(예: 테이블 정의, 스키마 등)를 AWS Glue 데이터 카탈로그에 저장합니다. 카탈로그로 만들어지면 데이터를 즉시 검색하고 쿼리하고 ETL에 사용할 수 있습니다.
+ [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/) — AWS Secrets Manager를 사용하면 애플리케이션 또는 서비스 액세스에 필요한 비밀을 보호하고 중앙에서 관리할 수 있습니다. 이 서비스는 데이터베이스 보안 인증 정보, API 키, 기타 보안 암호를 저장하므로 민감한 정보를 일반 텍스트 형식으로 하드코딩할 필요가 없습니다. Secrets Manager는 또한 보안 및 규정 준수 요구 사항을 충족하기 위해 키 교체를 제공합니다. Amazon Redshift, Amazon Relational Database Service(RDS), Amazon DocumentDB 및 Amazon DocumentDB에 대한 통합 기능이 내장되어 있습니다. Secrets Manager 콘솔, 명령줄 인터페이스 (CLI) 또는 Secrets Manager API 및 SDK를 사용하여 비밀을 저장하고 중앙에서 관리할 수 있습니다.
+ [Amazon Athena](https://aws.amazon.com/athena/) - Amazon Athena는 Amazon S3에 저장된 데이터를 간편하게 분석할 수 있는 대화형 쿼리 서비스입니다. Athena는 서버리스이며 AWS Glue와 통합되어 있으므로 AWS Glue를 사용하여 카탈로그에 등록된 데이터를 직접 쿼리할 수 있습니다. Athena는 탄력적으로 확장되어 대화형 쿼리 성능을 제공합니다.

## 에픽
<a name="build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue-epics"></a>

### S3 버킷 및 폴더 구조 생성
<a name="create-the-s3-buckets-and-folder-structure"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 소스 시스템의 데이터 구조 및 속성을 분석합니다. | Amazon S3 데이터 레이크에 포함되는 데이터 소스에 대해 이 작업을 수행합니다. | 데이터 엔지니어 | 
| 파티션 및 액세스 전략을 정의합니다. | 이 전략은 데이터 캡처 빈도, 델타 처리 및 소비 요구 사항을 기반으로 해야 합니다. S3 버킷은 일반에 공개되지 않도록 하고 액세스는 특정 서비스 역할 기반 정책으로만 제어해야 합니다. 자세한 내용은 [Amazon S3 설명서](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/using-folders.html)를 참조하십시오. | 데이터 엔지니어 | 
| 각 데이터 소스 유형에 대해 별도의 S3 버킷을 생성하고 처리된 (Parquet) 데이터에 대해 소스별로 별도의 S3 버킷을 생성합니다. | 각 소스에 대해 별도의 버킷을 생성한 다음, 소스 시스템의 데이터 수집 빈도에 따라 폴더 구조를 생성합니다. 예: `s3://source-system-name/date/hour`. 처리된 (Parquet 형식으로 변환된) 파일의 경우 비슷한 구조를 생성합니다. 예: `s3://source-processed-bucket/date/hour`. S3 버킷 생성에 대한 자세한 내용은 [Amazon S3 설명서](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-bucket.html)를 참조하세요. | 데이터 엔지니어 | 

### 대상 Amazon Redshift 데이터 웨어하우스 생성
<a name="create-a-data-warehouse-in-amazon-redshift"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 적절한 파라미터 그룹과 유지 관리 및 백업 전략을 사용하여 Amazon Redshift 클러스터를 시작합니다. | Amazon Redshift 클러스터를 생성할 때는 Secrets Manager 데이터베이스 암호를 관리자 보안 인증 정보로 사용하세요. Amazon Redshift 클러스터를 생성하고 크기를 조정하는 방법에 대한 자세한 내용은 [Amazon Redshift 설명서](https://docs.aws.amazon.com/ses/latest/DeveloperGuide/event-publishing-redshift-cluster.html) 및 [클라우드 데이터 웨어하우스 크기 조정](https://d1.awsstatic.com/whitepapers/Size-Cloud-Data-Warehouse-on-AWS.pdf) 백서를 참조하세요. | 데이터 엔지니어 | 
| IAM 서비스 역할을 생성하여 Amazon Redshift 클러스터에 연결합니다. | AWS Identity and Access Management(IAM) 서비스 역할은 Secrets Manager 및 소스 S3버킷에 대한 액세스를 보장합니다. 자세한 내용은 [권한 부여](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html) 및 [역할 추가](https://docs.aws.amazon.com/redshift/latest/dg/c-getting-started-using-spectrum-add-role.html)에 대한 AWS 설명서를 참조하세요. | 데이터 엔지니어 | 
| 데이터베이스 스키마를 생성합니다. | Amazon Redshift 테이블 설계 모범 사례 사용 사례에 따라 적절한 정렬 및 배포 키와 가능한 최상의 압축 인코딩을 선택합니다. 모범 사례는 [AWS 설명서](https://docs.aws.amazon.com/redshift/latest/dg/c_designing-tables-best-practices.html)를 참조하세요. | 데이터 엔지니어 | 
| 워크로드 관리 구성 | 요구 사항에 따라 워크로드 관리(WLM) 대기열, 짧은 쿼리 가속화(SQA) 또는 동시성 확장을 구성하세요. 자세한 내용은 Amazon Redshift 설명서의 [워크로드 관리 구현](https://docs.aws.amazon.com/redshift/latest/dg/cm-c-implementing-workload-management.html)을 참고하세요. | 데이터 엔지니어 | 

### Secrets Manager에서 보안 암호 생성
<a name="create-a-secret-in-secrets-manager"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 새 암호를 생성하여 Amazon Redshift 로그인 보안 인증 정보을 Secrets Manager에 저장합니다. | 이 암호는 개별 데이터베이스 서비스 사용자뿐 아니라 관리자 사용자의 보안 인증 정보를 저장합니다. 자세한 지침은 [Secrets Manager 설명서](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html)를 참조하세요. **Amazon Redshift 클러스터**를 암호 유형으로 선택합니다. 또한 **암호 교체** 페이지에서 교체를 활성화하세요. 그러면 Amazon Redshift 클러스터에 적절한 사용자가 생성되고 정의된 간격에 따라 키 암호가 교체됩니다. | 데이터 엔지니어 | 
| IAM 정책을 생성하여 Secrets Manager 액세스를 제한합니다. | Secrets Manager에 대한 액세스를 Amazon Redshift 관리자와 AWS Glue로만 제한합니다. | 데이터 엔지니어 | 

### AWS Glue 구성
<a name="configure-aws-glue"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| AWS Glue 데이터 카탈로그에서 Amazon Redshift에 대한 연결을 추가합니다. | 지침은 [AWS Glue 설명서](https://docs.aws.amazon.com/glue/latest/dg/console-connections.html)를 참조하세요. | 데이터 엔지니어 | 
| Secrets Manager, Amazon Redshift 및 S3 버킷에 액세스할 수 있도록 AWS Glue용 IAM 서비스 역할을 생성하고 연결합니다. | 자세한 내용은 [AWS Glue 설명서](https://docs.aws.amazon.com/glue/latest/dg/create-service-policy.html)를 참조하세요. | 데이터 엔지니어 | 
| 해당 소스의 AWS Glue 데이터 카탈로그를 정의합니다. | 이 단계에는 AWS Glue 데이터 카탈로그에 데이터베이스와 필수 테이블을 생성하는 작업이 포함됩니다. 크롤러를 사용하여 AWS Glue 데이터베이스의 테이블을 카탈로그화하거나 Amazon Athena 외부 테이블로 정의할 수 있습니다. 또한 AWS Glue 데이터 카탈로그를 통해 Athena에 정의된 외부 테이블에 액세스할 수 있습니다. Athena에서 [데이터 카탈로그 정의](https://docs.aws.amazon.com/glue/latest/dg/populate-data-catalog.html)를 하고 [외부 테이블 생성](https://docs.aws.amazon.com/athena/latest/ug/creating-tables.html)을 하는 방법에 대한 자세한 내용은 AWS 설명서를 참조하세요. | 데이터 엔지니어 | 
| AWS Glue 작업을 생성하여 소스 데이터를 처리합니다. | AWS Glue 작업은 원본 데이터 파일을 표준화, 중복 제거 및 정리하기 위한 Python 셸 또는 PySpark일 수 있습니다. 성능을 최적화하고 전체 S3 원본 버킷을 쿼리하지 않으려면 AWS Glue 작업의 푸시다운 조건으로 S3 버킷을 날짜, 연도, 월, 일, 시간별로 분류하여 파티션을 나눕니다. 자세한 내용은 [AWS Glue 설명서](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-partitions.html)를 참조하세요. 처리 및 변환된 데이터를 처리된 S3 버킷 파티션에 Parquet 형식으로 로드합니다. Athena에서 파켓 파일을 쿼리할 수 있습니다. | 데이터 엔지니어 | 
| Amazon Redshift로 데이터를 로드하는 AWS Glue 작업을 생성합니다. | AWS Glue 작업은 Python 셸 또는 PySpark로 데이터를 업서트한 후 완전히 새로 고쳐 데이터를 로드할 수 있습니다. 자세한 내용은 [AWS Glue 설명서](https://docs.aws.amazon.com/glue/latest/dg/author-job.html) 및 *추가 정보* 단원을 참조하세요. | 데이터 엔지니어 | 
| (선택 사항) 필요에 따라 트리거를 사용하여 AWS Glue 작업을 예약합니다. | 증분 데이터 로드는 주로 AWS Lambda 함수가 AWS Glue 작업을 직접적으로 호출하도록 하는 Amazon S3 이벤트에 의해 구동됩니다. 이벤트 기반 일정 대신 시간 기반 일정을 요구하는 모든 데이터 로드에 대해 AWS Glue 트리거 기반 예약을 사용하세요. | 데이터 엔지니어 | 

### Lambda 함수 생성
<a name="create-a-lambda-function"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| AWS Lambda가 S3 버킷과 AWS Glue 작업에 액세스할 수 있도록 IAM 서비스 연결 역할을 생성하고 연결합니다. | Amazon S3 객체 및 버킷을 읽는 정책과 AWS Glue API에 액세스하여 AWS Glue 작업을 시작하는 정책을 사용하여 AWS Lambda용 IAM 서비스 연결 역할을 생성합니다. 자세한 정보는 [지식 센터](https://aws.amazon.com/premiumsupport/knowledge-center/lambda-execution-role-s3-bucket/)를 참조하세요. | 데이터 엔지니어 | 
| 정의된 Amazon S3 이벤트를 기반으로 AWS Glue 작업을 실행하는 Lambda 함수를 생성합니다. | Amazon S3 매니페스트 파일을 생성하여 Lambda 함수를 시작해야 합니다. Lambda 함수는 Amazon S3 폴더 위치(예: source\$1bucket/년/월/날짜/시간)를 AWS Glue 작업에 파라미터로 전달해야 합니다. AWS Glue 작업은 이 파라미터를 푸시다운 조건자로 사용하여 파일 액세스 및 작업 처리 성능을 최적화합니다. 자세한 내용은 [AWS Glue 설명서](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-python-calling.html)를 참조하세요. | 데이터 엔지니어 | 
| Amazon S3 PUT 객체 이벤트를 생성하여 객체 생성을 감지하고 해당 Lambda 함수를 직접적으로 호출합니다. | Amazon S3 PUT 객체 이벤트는 매니페스트 파일 생성을 통해서만 시작해야 합니다. 매니페스트 파일은 Lambda 함수와 AWS Glue 작업 동시성을 제어하며, S3 소스 버킷의 특정 파티션에 도착하는 개별 파일을 처리하는 대신 로드를 일괄 처리합니다. 자세한 내용은 [Lambda 설명서](https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html)를 참조하세요. | 데이터 엔지니어 | 

## 관련 리소스
<a name="build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue-resources"></a>
+ [Amazon S3 설명서](https://docs.aws.amazon.com/AmazonS3/latest/gsg/GetStartedWithS3.html)
+ [AWS Glue 설명서](https://docs.aws.amazon.com/glue/latest/dg/what-is-glue.html)
+ [Amazon Redshift 설명서](https://docs.aws.amazon.com/redshift/latest/gsg/getting-started.html)
+ [Lambda](https://aws.amazon.com/lambda/)
+ [Amazon Athena](https://aws.amazon.com/athena/)
+ [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/)

## 추가 정보
<a name="build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue-additional"></a>

**완전히 새로고침하기 위한 세부 접근 방식**

**업서트**: 비즈니스 사용 사례에 따라 기록의 집계가 필요한 데이터 세트를 위한 것입니다. 비즈니스에 필요한 사항에 따라 [새 데이터 업데이트 및 삽입](https://docs.aws.amazon.com/redshift/latest/dg/t_updating-inserting-using-staging-tables-.html) (Amazon Redshift 설명서)에 설명된 접근 방식 중 하나를 따르십시오.

**전체 새로 고침**: 기록 집계가 필요하지 않은 소규모 데이터 세트를 위한 것입니다. 다음 접근법 중 하나를 따르세요.

1. Amazon Redshift 테이블을 자릅니다.

1. 스테이징 영역에서 현재 파티션을 로드합니다.

또는

1. 현재 파티션 데이터를 사용하여 임시 테이블을 생성합니다.

1. 대상 Amazon Redshift의 대상 테이블을 삭제합니다.

1. 임시 테이블의 이름을 대상 테이블로 변경합니다.

# Amazon DataZone을 사용하여 엔터프라이즈 데이터 메시 구축 AWS CDK AWS CloudFormation
<a name="build-enterprise-data-mesh-amazon-data-zone"></a>

*Dhrubajyoti Mukherjee, Ravi Kumar, Wei™ Sun, Adjoa Taylor, Amazon Web Services*

## 요약
<a name="build-enterprise-data-mesh-amazon-data-zone-summary"></a>

Amazon Web Services(AWS)에서 고객은 데이터가 혁신을 가속화하고 기업의 비즈니스 가치를 창출하는 열쇠임을 이해합니다. 이 방대한 데이터를 관리하기 위해 데이터 메시와 같은 분산 아키텍처를 채택할 수 있습니다. 데이터 메시 아키텍처는 제품 사고, 즉 고객, 목표 및 시장을 고려하는 사고 방식을 용이하게 합니다. 또한 데이터 메시는 데이터에 대한 빠르고 안전한 액세스를 제공하는 페더레이션 거버넌스 모델을 설정하는 데 도움이 됩니다.

[에서 데이터 메시 기반 엔터프라이즈 솔루션을 구축하기 위한 전략 AWS](https://docs.aws.amazon.com/prescriptive-guidance/latest/strategy-data-mesh/introduction.html)에서는 Data Mesh Strategy Framework를 사용하여 조직의 데이터 메시 전략을 공식화하고 구현하는 방법을 설명합니다. Data Mesh Strategy Framework를 사용하면 팀 조직과 팀의 상호 작용을 최적화하여 데이터 메시 여정을 가속화할 수 있습니다.

이 문서에서는 [Amazon DataZone](https://docs.aws.amazon.com/datazone/latest/userguide/what-is-datazone.html)을 사용하여 엔터프라이즈 데이터 메시를 빌드하는 방법에 대한 지침을 제공합니다. Amazon DataZone은 전체, 온프레미스 및 타사 소스 AWS에 저장된 데이터를 카탈로그화, 검색, 공유 및 관리하기 위한 데이터 관리 서비스입니다. 패턴에는 AWS Cloud Development Kit (AWS CDK) 및를 사용하여 데이터 메시 기반 데이터 솔루션 인프라를 배포하는 데 도움이 되는 코드 아티팩트가 포함되어 있습니다 AWS CloudFormation. 이 패턴은 클라우드 아키텍트 및 DevOps 엔지니어를 위한 것입니다.

이 패턴의 목표와 솔루션 범위에 대한 자세한 내용은 [추가 정보](#build-enterprise-data-mesh-amazon-data-zone-additional) 섹션을 참조하세요.

## 사전 조건 및 제한 사항
<a name="build-enterprise-data-mesh-amazon-data-zone-prereqs"></a>

**사전 조건 **
+ 최소 2개의 활성 AWS 계정상태: 하나는 중앙 거버넌스 계정용이고 다른 하나는 멤버 계정용입니다.
+ AWS 개발 환경의 중앙 거버넌스 계정에 대한 관리자 자격 증명
+ AWS Command Line Interface 명령줄 AWS 서비스 에서를 관리하기 위해 [설치된](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) (AWS CLI)
+  AWS CDK 애플리케이션을 관리하기 [https://docs.npmjs.com/downloading-and-installing-node-js-and-npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) 위해 설치된 Node.js 및 Node Package Manager(npm)
+ AWS CDK npm을 사용하여 AWS CDK 애플리케이션을 합성하고 배포하여 개발 환경에 전 세계적으로 [설치된](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_install) 도구 키트

  ```
  npm install -g aws-cdk
  ```
+ 개발 환경에 설치된 Python 버전 3.12
+ 개발 환경에 설치되거나 npm 컴파일러를 사용하여 전역적으로 설치된 TypeScript:

  ```
  npm install -g typescript
  ```
+ 개발 환경에 설치된 Docker
+ 솔루션의 소스 코드를 유지하기 위한 Git과 같은 버전 관리 시스템(권장)
+ Python 및 TypeScript를 지원하는 통합 개발 환경(IDE) 또는 텍스트 편집기(강력 권장)

**제한 사항 **
+ 이 솔루션은 Linux 또는 macOS를 실행하는 시스템에서만 테스트되었습니다.
+ 현재 버전에서는 솔루션이 AWS IAM Identity Center 기본적으로 Amazon DataZone 및의 통합을 지원하지 않습니다. 그러나이 통합을 지원하도록 구성할 수 있습니다.

**제품 버전**
+ Python 버전 3.12

## 아키텍처
<a name="build-enterprise-data-mesh-amazon-data-zone-architecture"></a>

다음 다이어그램은 데이터 메시 참조 아키텍처를 보여줍니다. 아키텍처는 Amazon DataZone을 기반으로 하며 Amazon Simple Storage Service(Amazon S3) 및를 데이터 소스 AWS Glue Data Catalog 로 사용합니다. 데이터 메시 구현에서 Amazon DataZone과 함께 AWS 서비스 사용하는는 조직의 요구 사항에 따라 다를 수 있습니다.

![\[멤버 계정 및 중앙 거버넌스 계정에 대한 5단계 워크플로입니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/79056dd9-e669-4302-afb8-21e3e0e8a136/images/eacbffca-4f25-405a-a7c8-f89d0fee5682.png)


1. 생산자 계정에서 원시 데이터는 현재 형식의 소비에 적합하거나를 사용하여 소비를 위해 변환됩니다 AWS Glue. 데이터에 대한 기술적 메타데이터는 Amazon S3에 저장되며 AWS Glue 데이터 크롤러를 사용하여 평가됩니다. 데이터 품질은 [AWS Glue 데이터 품질을](https://docs.aws.amazon.com/glue/latest/dg/glue-data-quality.html) 사용하여 측정됩니다. 데이터 카탈로그의 소스 데이터베이스는 Amazon DataZone 카탈로그의 자산으로 등록됩니다. Amazon DataZone 카탈로그는 Amazon DataZone 데이터 소스 작업을 사용하여 중앙 거버넌스 계정에서 호스팅됩니다.

1. 중앙 거버넌스 계정은 Amazon DataZone 도메인과 Amazon DataZone 데이터 포털을 호스팅합니다. 데이터 생산자 및 소비자 AWS 계정 의는 Amazon DataZone 도메인과 연결됩니다. 데이터 생산자 및 소비자의 Amazon DataZone 프로젝트는 해당 Amazon DataZone 도메인 단위로 구성됩니다.

1. 데이터 자산의 최종 사용자는 AWS Identity and Access Management (IAM) 자격 증명 또는 Single Sign-On(IAM Identity Center를 통한 통합)을 사용하여 Amazon DataZone 데이터 포털에 로그인합니다. Amazon DataZone 데이터 카탈로그에서 자산 정보(예: 데이터 품질 정보 또는 비즈니스 및 기술 메타데이터)를 검색, 필터링 및 봅니다.

1. 최종 사용자는 원하는 데이터 자산을 찾은 후 Amazon DataZone 구독 기능을 사용하여 액세스를 요청합니다. 생산자 팀의 데이터 소유자는 알림을 받고 Amazon DataZone 데이터 포털에서 구독 요청을 평가합니다. 데이터 소유자는 유효성을 기반으로 구독 요청을 승인하거나 거부합니다.

1. 구독 요청이 부여되고 이행되면 다음 활동을 위해 소비자 계정에서 자산에 액세스합니다.
   + Amazon SageMaker AI를 사용한 AI/ML 모델 개발
   + Amazon Athena 및 Amazon Quick을 사용한 분석 및 보고

## 도구
<a name="build-enterprise-data-mesh-amazon-data-zone-tools"></a>

**AWS 서비스**
+ [Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/what-is.html)는 표준 SQL을 사용하여 Amazon Simple Storage Service(S3)에 있는 데이터를 직접 간편하게 분석할 수 있는 대화형 쿼리 서비스입니다.
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html)는 코드로 AWS 클라우드 인프라를 정의하고 프로비저닝하는 데 도움이 되는 소프트웨어 개발 프레임워크입니다.
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)를 사용하면 AWS 리소스를 설정하고, 빠르고 일관되게 프로비저닝하고, AWS 계정 및의 수명 주기 동안 리소스를 관리할 수 있습니다 AWS 리전.
+ [Amazon DataZone](https://docs.aws.amazon.com/datazone/latest/userguide/what-is-datazone.html)은 전체, 온프레미스 및 타사 소스에 저장된 데이터를 카탈로그 AWS화, 검색, 공유 및 관리하는 데 도움이 되는 데이터 관리 서비스입니다.
+ [Amazon Quick](https://docs.aws.amazon.com/quicksight/latest/user/welcome.html)은 단일 대시보드에서 데이터를 시각화, 분석 및 보고하는 데 도움이 되는 클라우드 규모의 비즈니스 인텔리전스(BI) 서비스입니다.
+ [Amazon SageMaker AI](https://docs.aws.amazon.com/sagemaker/?id=docs_gateway)는 ML 모델을 빌드하고 훈련시킨 후 모델을 프로덕션 지원 호스팅 환경에 배포할 수 있는 관리형 기계 학습(ML) 서비스입니다.
+ [Amazon Simple Storage Service(S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)는 원하는 양의 데이터를 저장, 보호 및 검색하는 데 도움이 되는 클라우드 기반 객체 스토리지 서비스입니다.
+ [Amazon Simple Queue Service(Amazon SQS)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html)는 내구력 있고 가용성이 뛰어난 보안 호스팅 대기열을 제공하며 이를 통해 분산 소프트웨어 시스템과 구성 요소를 통합 및 분리할 수 있습니다.
+ [Amazon Simple Storage Service(S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)는 원하는 양의 데이터를 저장, 보호 및 검색하는 데 도움이 되는 클라우드 기반 객체 스토리지 서비스입니다.

**코드 리포지토리**

이 솔루션은 GitHub [data-mesh-datazone-cdk-cloudformation](https://github.com/aws-samples/data-mesh-datazone-cdk-cloudformation) 리포지토리에서 사용할 수 있습니다.

## 에픽
<a name="build-enterprise-data-mesh-amazon-data-zone-epics"></a>

### 환경 설정
<a name="set-up-the-environment"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 리포지토리를 복제합니다. | 리포지토리를 복제하려면 로컬 개발 환경(Linux 또는 macOS)에서 다음 명령을 실행합니다.<pre>git clone https://github.com/aws-samples/data-mesh-datazone-cdk-cloudformation</pre> | 클라우드 아키텍트, DevOps 엔지니어 | 
| 환경을 생성합니다. | 다음 명령을 실행하여 Python 가상 환경을 설정합니다.<pre> python3 -m venv .venv<br /> source .venv/bin/activate<br /> pip install -r requirements.txt</pre> | 클라우드 아키텍트, DevOps 엔지니어 | 
| AWS 계정 부트스트랩 | 를 사용하여 중앙 거버넌스 계정을 부트스트랩하려면 다음 명령을 AWS CDK실행합니다.<pre>cdk bootstrap aws://<GOVERNANCE_ACCOUNT_ID>/<AWS_REGION></pre>에 로그인하고 중앙 거버넌스 계정 콘솔을 AWS Management Console열고 AWS CDK 실행 역할의 Amazon 리소스 이름(ARN)을 가져옵니다. | 클라우드 아키텍트, DevOps 엔지니어 | 
| `DzDataMeshMemberStackSet.yaml` 파일을 구성합니다. | `DzDataMeshMemberStackSet.yaml` 파일을 구성하려면 리포지토리의 루트 디렉터리에서 다음 bash 스크립트를 시작합니다.<pre>./lib/scripts/create_dz_data_mesh_member_stack_set.sh</pre> | 클라우드 아키텍트, DevOps 엔지니어 | 
| 템플릿 생성을 확인합니다. |  CloudFormation 템플릿 파일이 `lib/cfn-templates/DzDataMeshMemberStackSet.yaml` 위치에 생성되었는지 확인합니다. | 클라우드 아키텍트, DevOps 엔지니어 | 

### 중앙 거버넌스 계정에 리소스 배포
<a name="deploy-resources-in-the-central-governance-account"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 구성 파일을 수정합니다. | `config/Config.ts` 파일에서 다음 파라미터를 수정합니다.<pre>DZ_APPLICATION_NAME - Name of the application.<br />DZ_STAGE_NAME - Name of the stage. <br />DZ_DOMAIN_NAME - Name of the Amazon DataZone domain<br />DZ_DOMAIN_DESCRIPTION - Description of the Amazon DataZone domain<br />DZ_DOMAIN_TAG - Tag of the Amazon DataZone domain<br />DZ_ADMIN_PROJECT_NAME - Name of the Amazon DataZone project for administrators<br />DZ_ADMIN_PROJECT_DESCRIPTION - Description of the Amazon DataZone project for administrators<br />CDK_EXEC_ROLE_ARN - ARN of the cdk execution role<br />DZ_ADMIN_ROLE_ARN - ARN of the administrator role</pre>나머지 파라미터는 비워 둡니다. | 클라우드 아키텍트, DevOps 엔지니어 | 
| Amazon DataZone 용어집 구성을 업데이트합니다. | `lib/utils/glossary_config.json` 파일에서 Amazon DataZone 용어집 구성을 업데이트하려면 다음 예시 구성을 사용합니다.<pre>{<br />    "GlossaryName": "PII Data",<br />    "GlossaryDescription": "If data source contains PII attributes",<br />    "GlossaryTerms": [{<br />            "Name": "Yes",<br />            "ShortDescription": "Yes",<br />            "LongDescription": "Yes Glossary Term"<br />        },<br />        {<br />            "Name": "No",<br />            "ShortDescription": "No",<br />            "LongDescription": "No Glossary Term"<br />        }<br />    ]<br />}</pre> | 클라우드 아키텍트, DevOps 엔지니어 | 
| Amazon DataZone 메타데이터 양식 구성을 업데이트합니다. | `lib/utils/metadata_form_config.json file`에서 Amazon DataZone 메타데이터 양식 구성을 업데이트하려면 다음 예제 구성을 사용합니다.<pre>{<br />    "FormName": "ScheduleDataRefresh",<br />    "FormDescription": "Form for data refresh schedule",<br />    "FormSmithyModel": "@amazon.datazone#displayname(defaultName: \"Data Refresh Schedule\")\nstructure ScheduleDataRefresh {\n    @documentation(\"Schedule of Data Refresh\")\n    @required\n    @amazon.datazone#searchable\n    @amazon.datazone#displayname(defaultName: \"Data Refresh Schedule\")\n    data_refresh_schedule: String\n}"<br />}</pre> | 클라우드 아키텍트, DevOps 엔지니어 | 
|  AWS 자격 증명을 내보냅니다. | 관리 권한이 있는 IAM 역할의 개발 환경으로 AWS 자격 증명을 내보내려면 다음 형식을 사용합니다.<pre>export AWS_ACCESS_KEY_ID=<br />export AWS_SECRET_ACCESS_KEY=<br />export AWS_SESSION_TOKEN=</pre> | 클라우드 아키텍트, DevOps 엔지니어 | 
| 템플릿을 합성합니다. |  CloudFormation 템플릿을 합성하려면 다음 명령을 실행합니다.<pre>npx cdk synth</pre> | 클라우드 아키텍트, DevOps 엔지니어 | 
| 솔루션을 배포합니다. | 다음 명령을 사용하여 솔루션을 배포합니다.<pre>npx cdk deploy --all</pre> | 클라우드 아키텍트, DevOps 엔지니어 | 

### 새 멤버 계정 구성
<a name="configure-new-member-accounts"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
|  템플릿을 배포합니다. | 다음 입력 파라미터를 사용하여 멤버 계정의 `lib/cfn-templates/DzDataMeshCfnStackSetExecutionRole.yaml`에 있는 CloudFormation 템플릿을 배포합니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/build-enterprise-data-mesh-amazon-data-zone.html) | 클라우드 아키텍트, DevOps 엔지니어 | 
| ARN을 업데이트합니다. | 멤버 계정의 CloudFormation StackSet 실행 역할 ARNs 목록을 업데이트하려면 다음 코드를 사용합니다.<pre>DZ_MEMBER_STACK_SET_EXEC_ROLE_LIST  - List of Stack set execution role arns for the member accounts.</pre> | 클라우드 아키텍트, DevOps 엔지니어 | 
| 합성 및 배포. |  CloudFormation 템플릿을 합성하고 솔루션을 배포하려면 다음 명령을 실행합니다.<pre>npx cdk synth<br />npx cdk deploy --all</pre> | 클라우드 아키텍트, DevOps 엔지니어 | 
| 멤버 계정 연결 해지 | 멤버 계정을 중앙 거버넌스 계정과 연결하려면 다음을 수행합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/build-enterprise-data-mesh-amazon-data-zone.html) | 클라우드 아키텍트, DevOps 엔지니어 | 
| 파라미터를 업데이트합니다. | 의 구성 파일에서 멤버 계정별 파라미터를 업데이트하려면 다음 형식을 `config/Config.ts`사용합니다.<pre>export const DZ_MEMBER_ACCOUNT_CONFIG: memberAccountConfig = {<br />  '123456789012' : {<br />    PROJECT_NAME: 'TEST-PROJECT-123456789012',<br />    PROJECT_DESCRIPTION: 'TEST-PROJECT-123456789012',<br />    PROJECT_EMAIL: 'user@xyz.com'<br />  }<br />}</pre> | 클라우드 아키텍트, DevOps 엔지니어 | 
| 템플릿을 합성하고 배포합니다. |  CloudFormation 템플릿을 합성하고 솔루션을 배포하려면 다음 명령을 실행합니다.<pre>npx cdk synth<br />npx cdk deploy --all</pre> | 클라우드 아키텍트, DevOps 엔지니어 | 
| 구성원 계정 추가 | 데이터 솔루션에서 추가 멤버 계정을 생성하고 구성하려면 각 멤버 계정에 대해 이전 단계를 반복합니다.이 솔루션은 데이터 생산자와 소비자를 구분하지 않습니다. | 클라우드 아키텍트, DevOps 엔지니어 | 

### 정리
<a name="clean-up"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 멤버 계정 연결 해제 | 계정 연결을 해제하려면 다음을 수행합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/build-enterprise-data-mesh-amazon-data-zone.html) | 클라우드 아키텍트, DevOps 엔지니어 | 
| 스택 인스턴스 삭제() |  CloudFormation 스택 인스턴스를 삭제하려면 다음을 수행합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/build-enterprise-data-mesh-amazon-data-zone.html) | 클라우드 아키텍트, DevOps 엔지니어 | 
|  - 생성된 모든 리소스를 삭제합니다. | 리소스를 폐기하려면 로컬 개발 환경(Linux 또는 macOS)에서 다음 단계를 구현합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/build-enterprise-data-mesh-amazon-data-zone.html) | 클라우드 아키텍트, DevOps 엔지니어 | 

## 관련 리소스
<a name="build-enterprise-data-mesh-amazon-data-zone-resources"></a>
+ [Amazon DataZone AWS Glue 빠른 데이터 시작](https://docs.aws.amazon.com/datazone/latest/userguide/quickstart-glue.html)
+ [자습서: 첫 번째 AWS CDK 앱 생성](https://docs.aws.amazon.com/cdk/v2/guide/hello_world.html)
+ [시작하기 CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/GettingStarted.html)
+ [에서 데이터 메시 기반 엔터프라이즈 솔루션을 구축하기 위한 전략 AWS](https://docs.aws.amazon.com/prescriptive-guidance/latest/strategy-data-mesh/introduction.html)

## 추가 정보
<a name="build-enterprise-data-mesh-amazon-data-zone-additional"></a>

**목표**

이 패턴을 구현하면 다음과 같은 결과를 얻을 수 있습니다.
+ **데이터의 분산된 소유권** - 중앙 팀에서 조직의 소스 시스템, 사업부 또는 사용 사례를 대표하는 팀으로 데이터 소유권을 이동합니다.
+ **제품 사고** ‒ 조직의 데이터 자산을 고려할 때 고객, 시장 및 기타 요소를 포함하는 제품 기반 사고 방식을 도입합니다.
+ **페더레이션 거버넌스** - 조직의 데이터 제품 전반에서 보안 가드레일, 제어 및 규정 준수를 개선합니다.
+ **다중 계정 및 다중 프로젝트 지원** ‒ 조직의 사업부 또는 프로젝트 전반에서 효율적이고 안전한 데이터 공유 및 협업을 지원합니다.
+ **중앙 집중식 모니터링 및 알림** ‒ Amazon CloudWatch를 사용하여 데이터 메시의 클라우드 리소스를 모니터링하고 새 멤버 계정이 연결되면 사용자에게 알립니다.
+ **확장성 및 확장성** ‒ 조직이 발전함에 따라 데이터 메시에 새 사용 사례를 추가합니다.

**솔루션 범위**

이 솔루션을 사용하면 데이터 메시 여정을 진행하면서 소규모로 시작하고 규모를 조정할 수 있습니다. 멤버 계정이 데이터 솔루션을 채택하는 경우 조직, 프로젝트 또는 사업부별 계정 구성이 포함되는 경우가 많습니다. 이 솔루션은 다음 기능을 지원하여 이러한 다양한 AWS 계정 구성을 수용합니다.
+ Amazon DataZone의 데이터 소스로서 AWS Glue Data Catalog DataZone
+ Amazon DataZone 데이터 도메인 및 관련 데이터 포털 관리
+ 데이터 메시 기반 데이터 솔루션에서 멤버 계정 추가 관리
+ Amazon DataZone 프로젝트 및 환경
+ Amazon DataZone 용어집 및 메타데이터 양식 관리
+ 데이터 메시 기반 데이터 솔루션 사용자에 해당하는 IAM 역할 관리
+ 데이터 메시 기반 데이터 솔루션 사용자 알림
+ 프로비저닝된 클라우드 인프라 모니터링

  이 솔루션은 AWS CDK 및 CloudFormation 를 사용하여 클라우드 인프라를 배포합니다. CloudFormation 를 사용하여 다음을 수행합니다.
  + 더 낮은 추상화 수준에서 클라우드 리소스를 정의하고 배포합니다.
  + 에서 클라우드 리소스를 배포합니다 AWS Management Console. 이 접근 방식을 사용하면 개발 환경 없이 인프라를 배포할 수 있습니다.

  데이터 메시 솔루션은 AWS CDK 를 사용하여 더 높은 추상화 수준에서 리소스를 정의합니다. 따라서 솔루션은 클라우드 리소스를 배포하기 위한 관련 도구를 선택하여 분리된 모듈식의 확장 가능한 접근 방식을 제공합니다.

**다음 단계**

Amazon DataZone을 사용하여 데이터 메시를 구축하는 방법에 대한 지침은 AWS[ 전문가에게](https://aws.amazon.com/professional-services) 문의할 수 있습니다.

이 솔루션의 모듈식 특성은 데이터 패브릭 및 데이터 레이크와 같은 다양한 아키텍처로 데이터 관리 솔루션을 구축할 수 있도록 지원합니다. 또한 조직의 요구 사항에 따라 솔루션을 다른 Amazon DataZone 데이터 소스로 확장할 수 있습니다.

# AWS 서비스를 사용하여 위험 가치(VaR) 계산
<a name="calculate-value-at-risk-var-by-using-aws-services"></a>

*Sumon Samanta, Amazon Web Services*

## 요약
<a name="calculate-value-at-risk-var-by-using-aws-services-summary"></a>

이 패턴은 AWS 서비스를 사용하여 위험 가치(VaR) 계산 시스템을 구현하는 방법을 설명합니다. 온프레미스 환경에서 대부분의 VaR 시스템은 대규모의 전용 인프라와 사내 또는 상용 그리드 스케줄링 소프트웨어를 사용하여 배치 프로세스를 실행합니다. 이 패턴은 AWS 클라우드에서 VaR 프로세스를 처리할 수 있는 간단하고 안정적이며 확장 가능한 아키텍처를 제공합니다. Amazon Kinesis Data Streams를 스트리밍 서비스로, Amazon Simple Queue Service(Amazon SQS)를 관리형 대기열 서비스로, Amazon ElastiCache를 캐싱 서비스로, AWS Lambda를 사용하여 주문을 처리하고 위험을 계산하는 서버리스 아키텍처를 구축합니다.

VaR은 트레이더와 위험 관리자가 포트폴리오의 잠재적 손실을 특정 신뢰 수준 이상으로 추정하는 데 사용하는 통계 지표입니다. 대부분의 VaR 시스템에는 많은 수의 수학적 및 통계적 계산을 실행하고 결과를 저장하는 작업이 포함됩니다. 이러한 계산에는 상당한 컴퓨팅 리소스가 필요하므로 VaR 배치 프로세스를 더 작은 컴퓨팅 작업 세트로 나누어야 합니다. 대규모 배치를 작은 작업으로 분할하는 것은 이러한 작업이 대부분 독립적이기 때문에 가능합니다. 즉, 한 작업의 계산이 다른 작업에 종속되지 않습니다. 

VAR 아키텍처의 또 다른 중요한 요구 사항은 컴퓨팅 확장성입니다. 이 패턴은 컴퓨팅 부하에 따라 자동으로 규모를 늘리거나 줄이는 서버리스 아키텍처를 사용합니다. 배치 또는 온라인 컴퓨팅 수요를 예측하기 어렵기 때문에 서비스 수준에 관한 계약(SLA)에 따른 일정 내에 프로세스를 완료하려면 동적인 규모 조정이 필요합니다. 또한 비용 최적화된 아키텍처는 해당 리소스의 작업이 완료되는 즉시 각 컴퓨팅 리소스를 스케일 다운할 수 있어야 합니다. 

AWS 서비스는 확장 가능한 컴퓨팅 및 스토리지 용량, 비용 최적화된 방식으로 처리하는 분석 서비스, 위험 관리 워크플로를 실행할 수 있는 다양한 유형의 스케줄러를 제공하므로 VaR 계산에 매우 적합합니다. 또한 AWS에서 사용한 컴퓨팅 및 스토리지 리소스에 대해서만 비용을 지불합니다.

## 사전 조건 및 제한 사항
<a name="calculate-value-at-risk-var-by-using-aws-services-prereqs"></a>

**사전 조건 **
+ 활성 상태의 AWS 계정.
+ 입력 파일(비즈니스 요구 사항에 따라 다름). 일반적인 사용 사례에는 다음과 같은 입력 파일이 포함됩니다.
  + 시장 데이터 파일(VaR 계산 엔진에 입력)
  + 거래 데이터 파일(거래 데이터가 스트림을 통해 제공되는 경우 제외).
  + 구성 데이터 파일(모델 및 기타 정적 구성 데이터)
  + 계산 엔진 모델 파일(정량적 라이브러리)
  + 시계열 데이터 파일(지난 5년간의 주가와 같은 과거 데이터용)
+ 시장 데이터 또는 기타 입력이 스트림을 통해 들어오는 경우 Amazon Kinesis Data Streams가 설정되고 스트림에 쓰도록 Amazon Identity and Access Management(IAM) 권한이 구성됩니다. 

이 패턴은 트레이딩 시스템에서 Kinesis 데이터 스트림으로 거래 데이터를 쓰는 아키텍처를 구축합니다. 스트리밍 서비스를 사용하는 대신, 작은 배치 파일에 거래 데이터를 저장하여 Amazon Simple Storage Service(S3) 버킷에 저장한 다음, 이벤트를 간접적으로 호출하여 데이터 처리를 시작할 수 있습니다.

**제한 사항 **
+ Kinesis 데이터 스트림 시퀀싱은 각 샤드에서 보장되므로 여러 샤드에 작성된 거래 주문은 쓰기 작업과 동일한 순서로 전달되지 않을 수 있습니다.
+ AWS Lambda 런타임 제한은 현재 15분입니다. (자세한 내용은 [Lambda FAQ](https://aws.amazon.com/lambda/faqs/)를 참조하세요.)

## 아키텍처
<a name="calculate-value-at-risk-var-by-using-aws-services-architecture"></a>

**대상 아키텍처 **

다음 아키텍처 다이어그램은 위험 평가 시스템의 AWS 서비스와 워크플로를 보여줍니다.

![\[AWS 서비스를 사용한 VaR 계산 시스템\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/eb615fc5-3cc3-445a-af2c-8446ee7b5276/images/c60aec03-ff6c-410c-8ee8-f1f6efa22cf7.png)


다이어그램은 다음을 보여 줍니다.

1. 주문 관리 시스템에서 거래가 유입됩니다.

1. *티켓 포지션 네팅* Lambda 함수는 주문을 처리하고 각 티커에 대한 통합 메시지를 Amazon SQS의 위험 대기열에 기록합니다.

1. *위험 계산 엔진* Lambda 함수는 Amazon SQS의 메시지를 처리하고, 위험 계산을 수행하고, Amazon ElastiCache의 위험 캐시에 있는 VaR 손익(PnL) 정보를 업데이트합니다.

1. *ElastiCache 데이터 읽기* Lambda 함수는 ElastiCache에서 위험 결과를 검색하여 데이터베이스와 S3 버킷에 저장합니다.

이러한 서비스와 단계에 대한 자세한 내용은 *에픽* 섹션을 참조하세요.

**자동화 및 규모 조정**

AWS Cloud Development Kit(AWS CDK) 또는 AWS CloudFormation 템플릿을 사용하여 전체 아키텍처를 배포할 수 있습니다. 이 아키텍처는 일괄 처리와 당일(실시간) 처리를 모두 지원할 수 있습니다.

규모 조정은 아키텍처에 내장되어 있습니다. 더 많은 거래가 Kinesis 데이터 스트림에 기록되고 처리 대기 중인 경우 추가 Lambda 함수를 간접적으로 호출하여 해당 거래를 처리한 다음 처리가 완료된 후 규모를 축소할 수 있습니다. 여러 Amazon SQS 위험 계산 대기열을 통한 처리 옵션도 있습니다. 대기열 전체에 엄격한 순서 지정 또는 통합이 필요한 경우 처리를 병렬화할 수 없습니다. 하지만 당일 배치 또는 미니 당일 배치의 경우 Lambda 함수가 병렬로 처리하고 최종 결과를 ElastiCache에 저장할 수 있습니다. 

## 도구
<a name="calculate-value-at-risk-var-by-using-aws-services-tools"></a>

**AWS 서비스**
+ [Amazon Aurora MySQL-Compatible Edition](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraMySQL.html)은 MySQL 배포의 설정, 운영, 규모 조정에 도움이 되는 완전 관리형의 MySQL 호환 관계형 데이터베이스 엔진입니다. 이 패턴은 MySQL을 예로 사용하지만 모든 RDBMS 시스템을 사용하여 데이터를 저장할 수 있습니다.
+ [Amazon ElastiCache](https://docs.aws.amazon.com/elasticache/)는 AWS 클라우드에서 분산 인 메모리 캐시 환경을 설정 및 관리하고 규모를 조정할 수 있습니다.
+ [Amazon Kinesis Data Streams](https://docs.aws.amazon.com/streams/latest/dev/introduction.html)를 사용하여 대규모 데이터 레코드 스트림을 실시간으로 수집하고 처리할 수 있습니다.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.
+ [Amazon Simple Queue Service(Amazon SQS)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html)는 내구력 있고 가용성이 뛰어난 보안 호스팅 대기열을 제공하며 이를 통해 분산 소프트웨어 시스템과 구성 요소를 통합 및 분리할 수 있습니다.
+ [Amazon Simple Storage Service(S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)는 원하는 양의 데이터를 저장, 보호 및 검색할 수 있는 클라우드 기반 객체 스토리지 서비스입니다.

**코드**

이 패턴은 AWS 클라우드의 VaR 시스템을 위한 예제 아키텍처를 제공하고 VaR 계산에 Lambda 함수를 사용하는 방법을 설명합니다. Lambda 함수를 생성하려면 [Lambda 설명서](https://docs.aws.amazon.com/lambda/latest/dg/service_code_examples.html)의 코드 예제를 참조하세요. 도움이 필요하면 [AWS Professional Services](https://pages.awscloud.com/AWS-Professional-Services.html)에 문의하세요.

## 모범 사례
<a name="calculate-value-at-risk-var-by-using-aws-services-best-practices"></a>
+ 각 VaR 컴퓨팅 작업을 최대한 작고 가볍게 유지합니다. 각 컴퓨팅 작업에서 서로 다른 수의 거래를 실험하여 어떤 것이 컴퓨팅 시간과 비용에 가장 최적화되어 있는지 확인해 보세요.
+ Amazon ElastiCache에 재사용 가능한 객체를 저장합니다. Apache Arrow와 같은 프레임워크를 사용하여 직렬화 및 역직렬화를 줄이세요.
+ Lambda의 시간 제한을 고려해 보세요. 컴퓨팅 작업이 15분을 초과할 것으로 생각되면 Lambda 시간 초과가 발생하지 않도록 작은 작업으로 나눕니다. 이것이 가능하지 않다면 AWS Fargate, Amazon Elastic Container Service(Amazon ECS), Amazon Elastic Kubernetes Service(Amazon EKS)의 컨테이너 오케스트레이션 솔루션을 고려해 볼 수 있습니다.

## 에픽
<a name="calculate-value-at-risk-var-by-using-aws-services-epics"></a>

### 리스크 시스템으로의 거래 흐름
<a name="trade-flow-to-risk-system"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 거래 작성을 시작합니다. | 신규, 정산 또는 부분 정산 거래가 주문 관리 시스템에서 리스크 스트림으로 기록됩니다. 이 패턴은 Amazon Kinesis를 관리형 스트리밍 서비스로 사용합니다. 거래 주문 티커의 해시는 여러 샤드에 거래 주문을 보내는 데 사용됩니다. | Amazon Kinesis | 

### 주문 처리를 위한 Lambda 함수 실행
<a name="run-lambda-functions-for-order-processing"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Lambda로 위험 처리를 시작합니다. | 새 주문에 대해 AWS Lambda 함수를 실행합니다. 보류 중인 거래 주문 수에 따라 Lambda가 자동으로 규모를 조정합니다. 각 Lambda 인스턴스에는 하나 이상의 주문이 있으며 Amazon ElastiCache에서 각 티커의 최신 포지션을 검색합니다. (CUSIP ID, Curve 이름 또는 다른 금융 파생 상품의 인덱스 이름을 ElasticCache에서 데이터를 저장하고 검색하기 위한 키로 사용할 수 있습니다.) ElastiCache에서 전체 위치(수량) 및 키-값 쌍<*티커*, *순 포지션*>(여기서 *순 포지션*은 스케일링 팩터임)은 각 티커에 대해 한 번씩 업데이트됩니다.  | Amazon Kinesis, AWS Lambda, Amazon ElastiCache | 

### 각 티커에 대한 메시지를 대기열에 기록
<a name="write-messages-for-each-ticker-into-queue"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 통합 메시지를 위험 대기열에 기록합니다. | 메시지를 대기열에 기록합니다. 이 패턴은 Amazon SQS를 관리형 대기열 서비스로 사용합니다. 단일 Lambda 인스턴스는 언제든지 소량의 거래 주문을 받을 수 있지만 Amazon SQS에는 각 티커에 대해 단일 메시지만 기록합니다. 스케일링 팩터는 (*기존 순 포지션* \$1 *현재 포지션*) / *기존 순 포지션*과 같이 계산됩니다. | Amazon SQS, AWS Lambda | 

### 리스크 엔진 간접 호출
<a name="invoke-risk-engine"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 위험 계산을 시작합니다. | 리스크 엔진 Lambda에 대한 Lambda 함수가 간접적으로 호출됩니다. 각 위치는 단일 Lambda 함수에 의해 처리됩니다. 하지만 최적화를 위해 각 Lambda 함수는 Amazon SQS의 여러 메시지를 처리할 수 있습니다. | Amazon SQS, AWS Lambda | 

### 캐시에서 위험 결과 검색
<a name="retrieve-risk-results-from-cache"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 위험 캐시를 검색 및 업데이트합니다. | Lambda는 ElastiCache에서 각 티커의 현재 순 포지션을 검색합니다. 또한 ElastiCache에서 각 티커에 대한 VaR 손익(PnL) 배열을 검색합니다. PnL 배열이 이미 존재하는 경우, Lambda 함수는 네팅 Lambda 함수가 작성한 Amazon SQS 메시지에서 가져온 스케일을 사용하여 배열과 VaR을 업데이트합니다. PnL 배열이 ElasticCache에 없는 경우 시뮬레이션된 티커 가격 시리즈 데이터를 사용하여 새로운 PnL 및 Var이 계산됩니다. | Amazon SQS, AWS Lambda, Amazon ElastiCache | 

### Elastic Cache에서 데이터를 업데이트하고 데이터베이스에 저장
<a name="update-data-in-elastic-cache-and-store-in-database"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 위험 결과를 저장합니다. | ElastiCache에서 VaR 및 PnL 번호가 업데이트된 후에는 5분마다 새로운 Lambda 함수가 간접적으로 호출됩니다. 이 함수는 ElastiCache에서 저장된 모든 데이터를 읽고 Aurora MySQL 호환 데이터베이스와 S3 버킷에 저장합니다. | AWS Lambda, Amazon ElastiCache | 

## 관련 리소스
<a name="calculate-value-at-risk-var-by-using-aws-services-resources"></a>
+ [바젤 VaR 프레임워크](https://www.bis.org/basel_framework/chapter/DIS/50.htm)

# Amazon Athena를 사용하여 공유 AWS Glue 데이터 카탈로그에 대한 크로스 계정 액세스 구성
<a name="configure-cross-account-access-to-a-shared-aws-glue-data-catalog-using-amazon-athena"></a>

*Denis Avdonin, Amazon Web Services*

## 요약
<a name="configure-cross-account-access-to-a-shared-aws-glue-data-catalog-using-amazon-athena-summary"></a>

이 패턴은 AWS Glue 데이터 카탈로그를 사용하여 Amazon Simple Storage Service(S3) 버킷에 저장된 데이터 세트의 크로스 계정 공유를 구성하기 위한 단계별 지침(AWS Identity and Access Management(IAM) 정책 샘플 포함)을 제공합니다. S3 버킷에 데이터 세트를 저장할 수 있습니다. 메타데이터는 AWS Glue 크롤러에 의해 수집되어 AWS Glue 데이터 카탈로그에 저장됩니다. S3 버킷과 AWS Glue 데이터 카탈로그는 *데이터 계정*이라고 하는 AWS 계정에 있습니다. *소비자 계정*이라고 하는 다른 AWS 계정의 IAM 보안 주체에 대한 액세스 권한을 제공할 수 있습니다. 사용자는 Amazon Athena 서버리스 쿼리 엔진을 사용하여 소비자 계정의 데이터를 쿼리할 수 있습니다.

## 사전 조건 및 제한 사항
<a name="configure-cross-account-access-to-a-shared-aws-glue-data-catalog-using-amazon-athena-prereqs"></a>

**사전 조건 **
+ 활성 상태의 [AWS 계정](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-creating.html) 두 개
+ AWS 계정 중 하나에 있는 [S3 버킷](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)
+ [Athena 엔진 버전 2](https://docs.aws.amazon.com/athena/latest/ug/engine-versions-reference.html#engine-versions-reference-0002)
+ [설치](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) 및 [구성](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)된 AWS Command Line Interface(AWS CLI)(또는 AWS CLI 명령 실행을 위한 [AWS 클라우드Shell](https://aws.amazon.com/cloudshell/))

**제품 버전**

이 패턴은 [Athena 엔진 버전 2](https://docs.aws.amazon.com/athena/latest/ug/engine-versions-reference-0002.html)와 [Athena 엔진 버전 3](https://docs.aws.amazon.com/athena/latest/ug/engine-versions-reference-0003.html)에서만 작동합니다. Athena 엔진 버전 3로 업그레이드하는 것이 좋습니다. Athena 엔진 버전 1에서 Athena 엔진 버전 3로 업그레이드할 수 없는 경우 AWS 빅 데이터 블로그에서 설명하는 [Cross-account AWS Glue Data Catalog access with Amazon Athena](https://aws.amazon.com/blogs/big-data/cross-account-aws-glue-data-catalog-access-with-amazon-athena/)에 있는 접근 방식을 따르세요.

## 아키텍처
<a name="configure-cross-account-access-to-a-shared-aws-glue-data-catalog-using-amazon-athena-architecture"></a>

**대상 기술 스택**
+ Amazon Athena
+ Amazon Simple Storage Service(Amazon S3)
+ AWS Glue
+ Identity and Access Management(IAM)
+ AWS Key Management Service(AWS KMS)

다음 다이어그램은 IAM 권한을 사용하여 AWS Glue 데이터 카탈로그를 통해 한 AWS 계정(데이터 계정)의 S3 버킷에 있는 데이터를 다른 AWS 계정(소비자 계정)과 공유하는 아키텍처를 보여줍니다.

![\[AWS Glue Data Catalog를 사용하여 데이터 계정과 소비자 계정 간에 S3 버킷의 데이터세트를 공유합니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/4ee1d6f5-f8e1-4acb-8a9c-7601c832a87d/images/e73a2b47-c0b1-49f1-be66-9c563c11c9f9.png)


이 다이어그램은 다음 워크플로를 보여줍니다.

1. 데이터 계정의 S3 버킷 정책은 소비자 계정의 IAM 역할과 데이터 계정의 AWS Glue 크롤러 서비스 역할에 권한을 부여합니다.

1. 데이터 계정의 AWS KMS 키 정책은 소비자 계정의 IAM 역할과 데이터 계정의 AWS Glue 크롤러 서비스 역할에 권한을 부여합니다.

1. 데이터 계정의 AWS Glue 크롤러는 S3 버킷에 저장된 데이터의 스키마를 검색합니다.

1. 데이터 계정의 AWS Glue 데이터 카탈로그 리소스 정책은 소비자 계정의 IAM 역할에 대한 액세스 권한을 부여합니다.

1. 사용자는 AWS CLI 명령을 사용하여 소비자 계정에서 명명된 카탈로그 참조를 생성합니다.

1. IAM 정책은 소비자 계정의 IAM 역할에 데이터 계정의 리소스에 대한 액세스 권한을 부여합니다. IAM 역할의 신뢰 정책을 통해 소비자 계정의 사용자가 IAM 역할을 수임할 수 있습니다.

1. 소비자 계정의 사용자는 IAM 역할을 수임하고 SQL 쿼리를 사용하여 데이터 카탈로그의 객체에 액세스합니다.

1.  Athena 서버리스 엔진은 SQL 쿼리를 실행합니다.

**참고**  
[IAM 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)에서는 IAM 역할에 권한을 부여하고 자격 [증명 페더레이션](https://aws.amazon.com/identity/federation/)을 사용하도록 권장합니다.

## 도구
<a name="configure-cross-account-access-to-a-shared-aws-glue-data-catalog-using-amazon-athena-tools"></a>
+ [Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/what-is.html)는 표준 SQL을 사용하여 Amazon S3에 있는 데이터를 직접 분석할 수 있는 대화형 쿼리 서비스입니다.
+ [Amazon Simple Storage Service(S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)는 원하는 양의 데이터를 저장, 보호 및 검색할 수 있는 클라우드 기반 객체 스토리지 서비스입니다.
+ [AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/what-is-glue.html)는 완전 관리형 추출, 전환, 적재(ETL) 서비스입니다. 이를 통해 데이터 스토어와 데이터 스트림 간에 데이터를 안정적으로 분류, 정리, 보강하고 이동할 수 있습니다.
+ [AWS Identity and Access Management(IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)를 이용하면 사용자에 대해 인증 및 권한 부여를 제어함으로써 AWS 리소스에 대한 액세스를 안전하게 관리할 수 있습니다.
+ [AWS Key Management Service(AWS KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)를 이용하면 암호화 키를 생성하고 제어하여 데이터를 보호할 수 있습니다.

## 에픽
<a name="configure-cross-account-access-to-a-shared-aws-glue-data-catalog-using-amazon-athena-epics"></a>

### 데이터 계정에서 권한 설정
<a name="set-up-permissions-in-the-data-account"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| S3 버킷에 있는 데이터에 대한 액세스 권한을 부여합니다. | 다음 템플릿을 기반으로 [S3 버킷 정책을 생성](https://docs.aws.amazon.com/AmazonS3/latest/userguide/add-bucket-policy.html)하고 데이터가 저장된 버킷에 정책을 할당합니다.<pre>{<br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />        {<br />            "Effect": "Allow",<br />            "Principal": {<br />                "AWS": [<br />                     "arn:aws:iam::<consumer account id>:role/<role name>",<br />                     "arn:aws:iam::<data account id>:role/service-role/AWSGlueServiceRole-data-bucket-crawler"<br />                ]<br />            },<br />            "Action": "s3:GetObject",<br />            "Resource": "arn:aws:s3:::data-bucket/*"<br />        },<br />        {<br />            "Effect": "Allow",<br />            "Principal": {<br />                "AWS": [<br />                      "arn:aws:iam::<consumer account id>:role/<role name>",<br />                      "arn:aws:iam::<data account id>:role/service-role/AWSGlueServiceRole-data-bucket-crawler"<br />                ]<br />            },<br />            "Action": "s3:ListBucket",<br />            "Resource": "arn:aws:s3:::data-bucket"<br />        }<br />    ]<br />}</pre>버킷 정책은 소비자 계정의 IAM 역할과 데이터 계정의 AWS Glue 크롤러 서비스 역할에 권한을 부여합니다. | 클라우드 관리자 | 
| (필요한 경우) 데이터 암호화 키에 대한 액세스 권한을 부여합니다. | S3 버킷이 AWS KMS 키로 암호화된 경우 소비자 계정의 IAM 역할과 데이터 계정의 AWS Glue 크롤러 서비스 역할에 키에 대한 `kms:Decrypt` 권한을 부여합니다.다음 문으로 [키 정책](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)을 업데이트합니다.<pre>{<br />    "Effect": "Allow",<br />    "Principal": {<br />        "AWS": [<br />            "arn:aws:iam::<consumer account id>:role/<role name>",<br />            "arn:aws:iam::<data account id>:role/service-role/AWSGlueServiceRole-data-bucket-crawler"<br />        ]<br />    },<br />    "Action": "kms:Decrypt",<br />    "Resource": "arn:aws:kms:<region>:<data account id>:key/<key id>"<br />}</pre> | 클라우드 관리자 | 
| 크롤러에게 데이터에 대한 액세스 권한을 부여합니다. | 다음 IAM 정책을 크롤러의 서비스 역할에 연결합니다.<pre>{<br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />        {<br />            "Effect": "Allow",<br />            "Action": "s3:GetObject",<br />            "Resource": "arn:aws:s3:::data-bucket/*"<br />        },<br />        {<br />            "Effect": "Allow",<br />            "Action": "s3:ListBucket",<br />            "Resource": "arn:aws:s3:::data-bucket"<br />        }<br />    ]<br />} </pre> | 클라우드 관리자 | 
| (필요한 경우) 크롤러에게 데이터 암호화 키에 대한 액세스 권한을 부여합니다. | S3 버킷이 AWS KMS 키로 암호화된 경우 다음 정책을 연결하여 크롤러의 서비스 역할에 키에 대한 `kms:Decrypt` 권한을 부여합니다.<pre>{<br />    "Effect": "Allow",<br />    "Action": "kms:Decrypt",<br />    "Resource": "arn:aws:kms:<region>:<data account id>:key/<key id>"<br />}</pre> | 클라우드 관리자 | 
| 소비자 계정의 IAM 역할에 데이터 카탈로그에 대한 크롤러 액세스 권한을 부여합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-a-shared-aws-glue-data-catalog-using-amazon-athena.html)<pre>{<br />    "Version" : "2012-10-17",<br />    "Statement" : [ <br />        {<br />            "Effect" : "Allow",<br />            "Principal" : {<br />                "AWS" : [<br />                     "arn:aws:iam::<consumer account id>:role/<role name>",<br />                    "arn:aws:iam::<data account id>:role/service-role/AWSGlueServiceRole-data-bucket-crawler"<br />                ]<br />            },<br />            "Action" : "glue:*",<br />            "Resource" : [ <br />                 "arn:aws:glue:<region>:<data account id>:catalog", <br />                 "arn:aws:glue:<region>:<data account id>:database/*", <br />                 "arn:aws:glue:<region>:<data account id>:table/*" <br />            ]<br />        } <br />    ]<br />}</pre>이 정책은 데이터 계정의 모든 데이터베이스와 테이블에서 모든 AWS Glue 작업을 허용합니다. 소비자 보안 주체에게 필요한 권한만 부여하도록 정책을 사용자 지정할 수 있습니다. 예를 들어 데이터베이스의 특정 테이블이나 뷰에 대한 읽기 전용 액세스를 제공할 수 있습니다. | 클라우드 관리자 | 

### 소비자 계정에서 데이터 액세스
<a name="access-data-from-the-consumer-account"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 데이터 카탈로그에 대한 명명된 참조를 생성합니다. | 명명된 데이터 카탈로그 참조를 생성하려면 [CloudShell](https://docs.aws.amazon.com/cloudshell/latest/userguide/getting-started.html) 또는 로컬에 설치된 AWS CLI를 사용하여 다음 명령을 실행합니다.<pre>aws athena create-data-catalog --name <shared catalog name> --type GLUE --parameters catalog-id=<data account id></pre> | 클라우드 관리자 | 
| 소비자 계정의 IAM 역할에 데이터 액세스 권한을 부여합니다. | 소비자 계정의 IAM 역할에 다음 정책을 연결하여 역할에 데이터에 대한 크로스 계정 액세스 권한을 부여합니다.<pre>{<br />     "Version": "2012-10-17",		 	 	 <br />     "Statement": [<br />        {<br />             "Effect": "Allow",<br />             "Action": "s3:GetObject",<br />             "Resource": "arn:aws:s3:::data-bucket/*"<br />        },<br />        {<br />             "Effect": "Allow",<br />             "Action": "s3:ListBucket",<br />             "Resource": "arn:aws:s3:::data-bucket"<br />        },<br />        {<br />            "Effect": "Allow",<br />            "Action": "glue:*",<br />            "Resource": [<br />                 "arn:aws:glue:<region>:<data account id>:catalog",<br />                 "arn:aws:glue:<region>:<data account id>:database/*",<br />                 "arn:aws:glue:<region>:<data account id>:table/*"<br />            ]<br />        }<br />    ]<br />}</pre>다음으로 다음 템플릿을 사용하여 신뢰 정책에서 IAM 역할을 수락할 수 있는 사용자를 지정합니다.<pre>{<br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />       {<br />            "Effect": "Allow",<br />            "Principal": {<br />                "AWS": "arn:aws:iam::<consumer account id>:user/<IAM user>"<br />            },<br />            "Action": "sts:AssumeRole"<br />        }<br />    ]<br />}</pre>마지막으로 사용자가 속한 사용자 그룹에 동일한 정책을 연결하여 IAM 역할을 수임할 수 있는 권한을 사용자에게 부여합니다. | 클라우드 관리자 | 
| (필요한 경우) 소비자 계정의 IAM 역할에 데이터 암호화 키에 대한 액세스 권한을 부여합니다. | S3 버킷이 AWS KMS 키로 암호화된 경우 다음 정책을 연결하여 소비자 계정의 IAM 역할에 키에 대한 `kms:Decrypt` 권한을 부여합니다.<pre>{<br />     "Effect": "Allow",<br />     "Action": "kms:Decrypt",<br />     "Resource": "arn:aws:kms:<region>:<data account id>:key/<key id>"<br />}</pre> | 클라우드 관리자 | 
| 소비자 계정의 IAM 역할로 전환하여 데이터에 액세스합니다. | 데이터 소비자는 [IAM 역할로 전환](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-console.html)하여 데이터 계정의 데이터에 액세스합니다. | 데이터 소비자 | 
| 데이터에 액세스합니다. | Athena를 사용하여 데이터를 쿼리합니다. 예를 들어 Athena 쿼리 편집기를 열고 다음 쿼리를 실행합니다.<pre>SELECT *<br />  FROM <shared catalog name>.<database name>.<table name></pre>명명된 카탈로그 참조를 사용하는 대신 Amazon 리소스 이름(ARN)으로 카탈로그를 참조할 수도 있습니다.쿼리 또는 뷰에서 동적 카탈로그 참조를 사용하는 경우 참조를 이스케이프된 큰따옴표(\$1”)로 묶어야 합니다. 예제:<pre>SELECT * <br />  FROM \"glue:arn:aws:glue:<region>:<data account id>:catalog\".<database name>.<table name></pre>자세한 내용은 Amazon Athena 사용 설명서의 [AWS Glue 데이터 카탈로그에 대한 크로스 계정 액세스](https://docs.aws.amazon.com/athena/latest/ug/security-iam-cross-account-glue-catalog-access.html)를 참조하세요. | 데이터 소비자 | 

## 관련 리소스
<a name="configure-cross-account-access-to-a-shared-aws-glue-data-catalog-using-amazon-athena-resources"></a>
+ [AWS Glue 데이터 카탈로그에 대한 크로스 계정 액세스](https://docs.aws.amazon.com/athena/latest/ug/security-iam-cross-account-glue-catalog-access.html)(Athena 설명서)
+ [(AWS CLI) create-data-catalog](https://docs.aws.amazon.com/cli/latest/reference/athena/create-data-catalog.html)(AWS CLI 명령 참조)
+ [Cross-account AWS Glue Data Catalog access with Amazon Athena](https://aws.amazon.com/blogs/big-data/cross-account-aws-glue-data-catalog-access-with-amazon-athena/)(AWS 빅 데이터 블로그)
+ [IAM의 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)(IAM 설명서)

## 추가 정보
<a name="configure-cross-account-access-to-a-shared-aws-glue-data-catalog-using-amazon-athena-additional"></a>

**크로스 계정 공유 대안으로 Lake Formation 사용**

AWS Lake Formation을 사용하여 계정 간에 AWS Glue 카탈로그 객체에 대한 액세스 권한을 공유할 수 있습니다. Lake Formation은 열 및 행 수준으로 세분화된 액세스 제어, 태그 기반 액세스 제어, ACID 트랜잭션에 대한 관리 테이블 및 기타 기능을 제공합니다. Lake Formation은 Athena와 잘 통합되어 있지만 이 패턴의 IAM 전용 접근 방식에 비해 추가 구성이 필요합니다. 전체 솔루션 아키텍처의 더 넓은 맥락에서 Lake Formation 또는 IAM 전용 액세스 제어를 사용할지 결정하는 것이 좋습니다. 고려 사항에는 관련된 다른 서비스와 이러한 서비스가 두 접근 방식과 통합되는 방식이 포함됩니다.

# Teradata NORMALIZE 임시 기능을 Amazon Redshift SQL로 변환
<a name="convert-the-teradata-normalize-temporal-feature-to-amazon-redshift-sql"></a>

*Po Hong, Amazon Web Services*

## 요약
<a name="convert-the-teradata-normalize-temporal-feature-to-amazon-redshift-sql-summary"></a>

**정규화**는 ANSI SQL 표준의 테라데이타 확장입니다. SQL 테이블에 **기간** 데이터 유형의 열이 포함된 경우 **정규화**는 해당 열과 일치하거나 겹치는 값을 결합하여 여러 개별 기간 값을 통합하는 단일 기간을 형성합니다. **정규화**를 사용하려면 SQL **선택** 목록에서 하나 이상의 열이 Teradata의 임시 **기간** 데이터 유형이어야 합니다. **정규화**에 대한 자세한 내용은 [Teradata 설명서](https://docs.teradata.com/reader/2_MC9vCtAJRlKle2Rpb0mA/MIGI5UMEwgERC3Un7tEZ6g)를 참조하세요. 

Amazon Redshift는 **정규화**를 지원하지 않지만 Amazon Redshift의 네이티브 SQL 구문과 **LAG** 윈도우 함수를 사용하여 이 기능을 구현할 수 있습니다. 이 패턴은 가장 많이 사용되는 형식인 **ON MEETS 또는 OVERLAPS** 조건과 함께 테라데이타 **정규화** 확장 프로그램을 사용하는 데 중점을 둡니다. 테라데이타에서 이 기능이 작동하는 방식과 이 기능을 Amazon Redshift 네이티브 SQL 구문으로 변환하는 방법을 설명합니다.

## 사전 조건 및 제한 사항
<a name="convert-the-teradata-normalize-temporal-feature-to-amazon-redshift-sql-prereqs"></a>

**사전 조건 **
+ 테라데이타 SQL에 대한 기본 지식 및 경험
+ Amazon Redshift에 대한 지식과 경험

## 아키텍처
<a name="convert-the-teradata-normalize-temporal-feature-to-amazon-redshift-sql-architecture"></a>

**소스 기술 스택**
+ Teradata 데이터 웨어하우스

**대상 기술 스택**
+ Amazon Redshift

**대상 아키텍처**

Teradata 데이터베이스를 Amazon Redshift로 마이그레이션하기 위한 전체적인 아키텍처는 [AWS SCT 데이터 추출 에이전트를 사용하여 Teradata 데이터베이스를 Amazon Redshift로 마이그레이션](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/migrate-a-teradata-database-to-amazon-redshift-using-aws-sct-data-extraction-agents.html) 패턴을 참조하세요. 마이그레이션은 테라데이타 **정규화** 구문을 Amazon Redshift SQL로 자동으로 변환하지 않습니다. 이 패턴의 지침에 따라 이 테라데이타 확장을 변환할 수 있습니다.

## 도구
<a name="convert-the-teradata-normalize-temporal-feature-to-amazon-redshift-sql-tools"></a>

**코드**

**정규화**의 개념과 기능을 설명하려면 Teradata에 있는 다음 테이블 정의를 살펴보세요.

```
CREATE TABLE systest.project
     (    emp_id        INTEGER,
          project_name  VARCHAR(20),
          dept_id       INTEGER,
          duration      PERIOD(DATE)
     );
```

다음 SQL 코드를 실행하여 샘플 데이터를 테이블에 삽입합니다.

```
BEGIN TRANSACTION;

INSERT INTO systest.project VALUES (10, 'First Phase', 1000,  PERIOD(DATE '2010-01-10', DATE '2010-03-20') );
INSERT INTO systest.project VALUES (10, 'First Phase', 2000,  PERIOD(DATE '2010-03-20', DATE '2010-07-15') );

INSERT INTO systest.project VALUES (10, 'Second Phase', 2000,  PERIOD(DATE '2010-06-15', DATE '2010-08-18') );
INSERT INTO systest.project VALUES (20, 'First Phase', 2000,  PERIOD(DATE '2010-03-10', DATE '2010-07-20') );

INSERT INTO systest.project VALUES (20, 'Second Phase', 1000,  PERIOD(DATE '2020-05-10', DATE '2020-09-20') );

END TRANSACTION;
```

결과:

```
select * from systest.project order by 1,2,3;
 
 *** Query completed. 4 rows found. 4 columns returned.
 *** Total elapsed time was 1 second.
 
     emp_id  project_name              dept_id  duration
-----------  --------------------  -----------  ------------------------
         10  First Phase                  1000  ('10/01/10', '10/03/20')        
         10  First Phase                  2000  ('10/03/20', '10/07/15')
         10  Second Phase                 2000  ('10/06/15', '10/08/18')
         20  First Phase                  2000  ('10/03/10', '10/07/20')
         20  Second Phase                 1000  ('20/05/10', '20/09/20')
```

*테라데이타 정규화 사용 사례*

이제 **선택** 문에 테라데이타 **정규화** SQL 절을 추가합니다.

```
SELECT NORMALIZE ON MEETS OR OVERLAPS emp_id, duration 
FROM systest.project 
ORDER BY 1,2;
```

이 **정규화** 작업은 단일 열(`emp_id`)에서 수행됩니다. 의 경우 `emp_id=10`다음과 같이 기간의 세 중첩 기간 값이 단일 기간 값으로 병합됩니다. 

```
     emp_id  duration
-----------  ------------------------
         10  ('10/01/10', '10/08/18')
         20  ('10/03/10', '10/07/20')
         20  ('20/05/10', '20/09/20')
```

다음 **SELECT** 문은 `project_name` 및에서 **NORMALIZE** 작업을 수행합니다`dept_id`. **SELECT** 목록에는 **기간** 열가 하나만 포함되어 있습니다`duration`.

```
SELECT NORMALIZE project_name, dept_id, duration 
FROM systest.project;
```

출력:

```
project_name              dept_id  duration
--------------------  -----------  ------------------------
First Phase                  1000  ('10/01/10', '10/03/20')
Second Phase                 1000  ('20/05/10', '20/09/20')
First Phase                  2000  ('10/03/10', '10/07/20')
Second Phase                 2000  ('10/06/15', '10/08/18')
```

*Amazon Redshift에 해당하는 SQL*

Amazon Redshift는 현재 테이블의 **기간** 데이터 유형을 지원하지 않습니다. 대신 다음과 `start_date, end_date`같이 Teradata **PERIOD** 데이터 필드를 두 부분으로 나누어야 합니다. 

```
CREATE TABLE systest.project
     (    emp_id        INTEGER,
          project_name  VARCHAR(20),
          dept_id       INTEGER,
          start_date  DATE,
          end_date    DATE
     );
```

다음 테이블에 샘플 데이터를 삽입합니다.

```
BEGIN TRANSACTION;
 
INSERT INTO systest.project VALUES (10, 'First Phase', 1000,  DATE '2010-01-10', DATE '2010-03-20' );
INSERT INTO systest.project VALUES (10, 'First Phase', 2000,  DATE '2010-03-20', DATE '2010-07-15');
 
INSERT INTO systest.project VALUES (10, 'Second Phase', 2000,  DATE '2010-06-15', DATE '2010-08-18' );
INSERT INTO systest.project VALUES (20, 'First Phase', 2000,  DATE '2010-03-10', DATE '2010-07-20' );
 
INSERT INTO systest.project VALUES (20, 'Second Phase', 1000,  DATE '2020-05-10', DATE '2020-09-20' );
 
END TRANSACTION;
```

출력:

```
 emp_id | project_name | dept_id | start_date |  end_date
--------+--------------+---------+------------+------------
     10 | First Phase  |    1000 | 2010-01-10 | 2010-03-20
     10 | First Phase  |    2000 | 2010-03-20 | 2010-07-15
     10 | Second Phase |    2000 | 2010-06-15 | 2010-08-18
     20 | First Phase  |    2000 | 2010-03-10 | 2010-07-20
     20 | Second Phase |    1000 | 2020-05-10 | 2020-09-20
(5 rows)
```

테라데이타의 **정규화** 절을 다시 작성하려면 Amazon Redshift의 [LAG 윈도우 함수](https://docs.aws.amazon.com/redshift/latest/dg/r_WF_LAG.html)를 사용하시면 됩니다. 이 함수는 파티션에서 현재 행 위(앞)의 지정 오프셋에 위치한 행의 값을 반환합니다.

**LAG** 함수를 사용하면 기간이 이전 기간과 일치하거나 겹치는지를 판단하여 새 기간을 시작하는 각 행을 식별할 수 있습니다(예인 경우 0, 아니요인 경우 1). 이 플래그를 누적하여 합산하면 Amazon Redshift에서 원하는 결과에 도달하기 위해 외부 **그룹별** 절에서 사용할 수 있는 그룹 식별자가 제공됩니다. 

**LAG()**를 사용하는 Amazon Redshift SQL 문 샘플은 다음과 같습니다.

```
SELECT emp_id, start_date, end_date, 
            (CASE WHEN start_date <= LAG(end_date) OVER (PARTITION BY emp_id ORDER BY start_date, end_date) THEN 0 ELSE 1 END) AS GroupStartFlag
FROM systest.project 
ORDER BY 1,2;
```

출력:

```
 emp_id | start_date |  end_date  | groupstartflag
--------+------------+------------+----------------
     10 | 2010-01-10 | 2010-03-20 |              1
     10 | 2010-03-20 | 2010-07-15 |              0
     10 | 2010-06-15 | 2010-08-18 |              0
     20 | 2010-03-10 | 2010-07-20 |              1
     20 | 2020-05-10 | 2020-09-20 |              1
(5 rows)
```

다음 Amazon Redshift SQL 문은 `emp_id` 열에서만 정규화됩니다.

```
SELECT T2.emp_id, MIN(T2.start_date) as new_start_date, MAX(T2.end_date) as new_end_date
FROM 
( SELECT T1.*, SUM(GroupStartFlag) OVER (PARTITION BY emp_id ORDER BY start_date ROWS UNBOUNDED PRECEDING) As GroupID
FROM ( SELECT emp_id, start_date, end_date, 
            (CASE WHEN start_date <= LAG(end_date) OVER (PARTITION BY emp_id ORDER BY start_date, end_date) THEN 0 ELSE 1 END) AS GroupStartFlag
FROM systest.project ) T1
) T2
GROUP BY T2.emp_id, T2.GroupID
ORDER BY 1,2;
```

출력:  

```
 emp_id | new_start_date | new_end_date
--------+----------------+------------------------------------
     10 | 2010-01-10     | 2010-08-18
     20 | 2010-03-10     | 2010-07-20
     20 | 2020-05-10     | 2020-09-20
(3 rows)
```

** **

다음 Amazon Redshift SQL 문은 `project_name` 및 `dept_id` 열 모두에서 정규화됩니다.

```
SELECT T2.project_name, T2.dept_id, MIN(T2.start_date) as new_start_date, MAX(T2.end_date) as new_end_date
FROM 
( SELECT T1.*, SUM(GroupStartFlag) OVER (PARTITION BY project_name, dept_id ORDER BY start_date ROWS UNBOUNDED PRECEDING) As GroupID
FROM ( SELECT project_name, dept_id, start_date, end_date, 
            (CASE WHEN start_date <= LAG(end_date) OVER (PARTITION BY project_name, dept_id ORDER BY start_date, end_date) THEN 0 ELSE 1 END) AS GroupStartFlag
FROM systest.project ) T1
) T2
GROUP BY T2.project_name, T2.dept_id, T2.GroupID
ORDER BY 1,2,3;
```

출력:

```
 project_name | dept_id | new_start_date | new_end_date
--------------+---------+----------------+--------------
 First Phase  |    1000 | 2010-01-10     | 2010-03-20
 First Phase  |    2000 | 2010-03-10     | 2010-07-20
 Second Phase |    1000 | 2020-05-10     | 2020-09-20
 Second Phase |    2000 | 2010-06-15     | 2010-08-18
(4 rows)
```

## 에픽
<a name="convert-the-teradata-normalize-temporal-feature-to-amazon-redshift-sql-epics"></a>

### 정규화를 Amazon Redshift SQL로 변환
<a name="convert-normalize-to-amazon-redshift-sql"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 테라데이타 SQL 코드를 생성합니다. | 필요에 따라 Normalize 문구를 사용합니다. | SQL Developer | 
| 코드를 Amazon Redshift SQL로 변환합니다. | 코드를 변환하려면 이 패턴의 ‘도구’ 섹션에 있는 지침을 따르세요. | SQL Developer | 
| Amazon Redshift에서 코드를 실행합니다. | 테이블을 생성하고, 테이블에 데이터를 로드하고, Amazon Redshift에서 코드를 실행합니다. | SQL Developer | 

## 관련 리소스
<a name="convert-the-teradata-normalize-temporal-feature-to-amazon-redshift-sql-resources"></a>

**참조**
+ [테라데이타 정규화 임시 기능](https://docs.teradata.com/reader/2_MC9vCtAJRlKle2Rpb0mA/MIGI5UMEwgERC3Un7tEZ6g)(테라데이타 설명서)
+ [LAG 윈도우 함수](https://docs.aws.amazon.com/redshift/latest/dg/r_WF_LAG.html)(Amazon Redshift 설명서)
+ [Amazon Redshift로 마이그레이션](https://aws.amazon.com/redshift/data-warehouse-migration/)(AWS 웹 사이트)
+ [AWS SCT 데이터 추출 에이전트를 사용하여 테라데이타 데이터베이스를 Amazon Redshift로 마이그레이션](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/migrate-a-teradata-database-to-amazon-redshift-using-aws-sct-data-extraction-agents.html)(AWS 권장 가이드)
+ [Teradata RESET WHEN 기능을 Amazon Redshift SQL로 변환](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/convert-the-teradata-reset-when-feature-to-amazon-redshift-sql.html)(AWS 권장 가이드)

**도구**
+ [AWS Schema Conversion Tool(AWS SCT)](https://aws.amazon.com/dms/schema-conversion-tool/)

**파트너**
+ [AWS 마이그레이션 컴피턴시 파트너](https://aws.amazon.com/migration/partner-solutions/#delivery)

# Teradata RESET WHEN 기능을 Amazon Redshift SQL로 변환
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql"></a>

*Po Hong, Amazon Web Services*

## 요약
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql-summary"></a>

**RESET WHEN**은 SQL 분석 창 함수에 사용되는 Teradata 기능입니다. ANSI SQL 표준의 확장입니다. **RESET WHEN**은 특정 조건에 따라 SQL 창 함수가 작동하는 파티션을 결정합니다. 조건이 **TRUE**로 평가되면 기존 창 파티션 내에 새로운 동적 하위 파티션이 생성됩니다. **RESET WHEN**에 대한 자세한 내용은 [Teradata 설명서](https://docs.teradata.com/reader/1DcoER_KpnGTfgPinRAFUw/b7wL86OoMTPno6hrSPNdDg)를 참조하세요.

Amazon Redshift는 SQL 창 함수에서 **RESET WHEN**을 지원하지 않습니다. 이 기능을 구현하려면 **RESET WHEN**을 Amazon Redshift의 네이티브 SQL 구문으로 변환하고 여러 개의 중첩 함수를 사용해야 합니다. 이 패턴은 Teradata **RESET WHEN** 기능을 사용하는 방법과 이를 Amazon Redshift SQL 구문으로 변환하는 방법을 보여 줍니다. 

## 사전 조건 및 제한 사항
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql-prereqs"></a>

**사전 조건 **
+ Teradata 데이터 웨어하우스와 해당 SQL 구문에 대한 기본 지식
+ Amazon Redshift와 해당 SQL 구문에 대한 충분한 이해

## 아키텍처
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql-architecture"></a>

**소스 기술 스택**
+ Teradata 데이터 웨어하우스

**대상 기술 스택**
+ Amazon Redshift

**아키텍처**

Teradata 데이터베이스를 Amazon Redshift로 마이그레이션하기 위한 전체적인 아키텍처는 [AWS SCT 데이터 추출 에이전트를 사용하여 Teradata 데이터베이스를 Amazon Redshift로 마이그레이션](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/migrate-a-teradata-database-to-amazon-redshift-using-aws-sct-data-extraction-agents.html) 패턴을 참조하세요. 마이그레이션은 Teradata **RESET WHEN** 구문을 Amazon Redshift SQL로 자동 변환하지 않습니다. 다음 섹션의 지침에 따라 이 Teradata 확장을 변환할 수 있습니다.

## 도구
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql-tools"></a>

**코드**

**RESET WHEN**의 개념을 설명하기 위해 Teradata의 다음 테이블 정의를 생각해 보세요.

```
create table systest.f_account_balance                                
( account_id integer NOT NULL,
  month_id integer,
  balance integer )
unique primary index (account_id, month_id);
```

다음 SQL 코드를 실행하여 샘플 데이터를 테이블에 삽입합니다.

```
BEGIN TRANSACTION;
Insert Into systest.f_account_balance values (1,1,60);
Insert Into systest.f_account_balance values (1,2,99);
Insert Into systest.f_account_balance values (1,3,94);
Insert Into systest.f_account_balance values (1,4,90);
Insert Into systest.f_account_balance values (1,5,80);
Insert Into systest.f_account_balance values (1,6,88);
Insert Into systest.f_account_balance values (1,7,90);
Insert Into systest.f_account_balance values (1,8,92);
Insert Into systest.f_account_balance values (1,9,10);
Insert Into systest.f_account_balance values (1,10,60);
Insert Into systest.f_account_balance values (1,11,80);
Insert Into systest.f_account_balance values (1,12,10);
END TRANSACTION;
```

샘플 테이블에는 다음과 같은 데이터가 있습니다.


| 
| 
| account\$1id | month\$1id | balance | 
| --- |--- |--- |
| 1 | 1 | 60 | 
| 1 | 2 | 99 | 
| 1 | 3 | 94 | 
| 1 | 4 | 90 | 
| 1 | 5 | 80 | 
| 1 | 6 | 88 | 
| 1 | 7 | 90 | 
| 1 | 8 | 92 | 
| 1 | 9 | 10 | 
| 1 | 10 | 60 | 
| 1 | 11 | 80 | 
| 1 | 12 | 10 | 

각 계좌에 대해 연속적인 월간 잔액 증가 순서를 분석한다고 가정합시다. 한 달 잔액이 이전 달의 잔액보다 작거나 같으면 카운터를 0으로 재설정하고 다시 시작해야 합니다.

*Teradata RESET WHEN 사용 사례*

이 데이터를 분석하기 위해 Teradata SQL은 다음과 같이 중첩 집계와 **RESET WHEN** 구문이 있는 창 함수를 사용합니다.

```
SELECT account_id, month_id, balance,
 ( ROW_NUMBER() OVER (PARTITION BY account_id ORDER BY month_id
RESET WHEN balance <= SUM(balance) over (PARTITION BY account_id ORDER BY month_id ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) ) -1 ) as balance_increase
FROM systest.f_account_balance
ORDER BY 1,2;
```

출력:


| 
| 
|  account\$1id | month\$1id | balance | balance\$1increase | 
| --- |--- |--- |--- |
| 1 | 1 | 60 | 0 | 
| 1 | 2 | 99 | 1 | 
| 1 | 3 | 94 | 0 | 
| 1 | 4 | 90 | 0 | 
| 1 | 5 | 80 | 0 | 
| 1 | 6 | 88 | 1 | 
| 1 | 7 | 90 | 2 | 
| 1 | 8 | 92 | 3 | 
| 1 | 9 | 10 | 0 | 
| 1 | 10 | 60 | 1 | 
| 1 | 11 | 80 | 2 | 
| 1 | 12 | 10 | 0 | 

쿼리는 Teradata에서 다음과 같이 처리됩니다.

1. **SUM(balance)** 집계 함수는 특정 달에 특정 계좌의 모든 잔액 합계를 계산합니다.

1. 특정 달의(특정 계좌의) 잔액이 이전 달의 잔액보다 큰지 확인합니다.

1. 잔액이 증가하면 누적 카운트 값을 추적합니다. **RESET WHEN** 조건이 **거짓**으로 평가되면(즉, 잔액이 몇 달 연속 증가함) 카운트를 계속 늘립니다.

1. **ROW\$1NUMBER()** 정렬 분석 함수는 카운트 값을 계산합니다. 잔액이 이전 달의 잔액보다 작거나 같은 달에 도달하면 **RESET WHEN** 조건이 **참**으로 평가됩니다. 그렇다면 새 파티션을 시작하고 **ROW\$1NUMBER()**는 카운트를 1부터 다시 시작합니다. 이전 행의 값에 액세스하려면 **ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING**을 사용합니다.

1. 카운트 값이 0부터 시작하도록 1을 뺍니다.

*Amazon Redshift에 해당하는 SQL*

Amazon Redshift는 SQL 분석 창 함수의 **RESET WHEN** 구문을 지원하지 않습니다.  동일한 결과를 생성하려면 다음과 같이 Amazon Redshift 네이티브 SQL 구문과 중첩된 하위 쿼리를 사용하여 Teradata SQL을 다시 작성해야 합니다. 

```
SELECT account_id, month_id, balance,
   (ROW_NUMBER() OVER(PARTITION BY account_id, new_dynamic_part ORDER BY month_id) -1) as balance_increase
FROM
( SELECT account_id, month_id, balance, prev_balance,
SUM(dynamic_part) OVER (PARTITION BY account_id ORDER BY month_id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) As new_dynamic_part
FROM ( SELECT account_id, month_id, balance,
SUM(balance) over (PARTITION BY account_id ORDER BY month_id ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) as prev_balance,
(CASE When balance <= prev_balance Then 1 Else 0 END) as dynamic_part
FROM systest.f_account_balance ) A
) B
ORDER BY 1,2;
```

Amazon Redshift는 단일 SQL 문의 **SELECT** 절에서 중첩된 창 함수를 지원하지 않으므로 두 개의 중첩된 하위 쿼리를 사용해야 합니다.
+ 내부 하위 쿼리(별칭 A)에서 동적 파티션 표시기(**dynamic\$1part**)가 생성되고 채워집니다. 한 달의 잔액이 이전 달의 잔액보다 작거나 같으면 **dynamic\$1part**는 1로 설정되고, 그렇지 않으면 0으로 설정됩니다. 
+ 다음 레이어(별칭 B)에서는 **SUM** 창 함수의 결과로 **new\$1dynamic\$1part** 속성이 생성됩니다. 
+ 마지막으로 **new\$1dynamic\$1part**를 새 파티션 속성(**dynamic partition**)으로 기존 파티션 속성(**account\$1id**)에 추가하고 Teradata에서와 동일한 **ROW\$1NUMBER()** 창 함수를 적용합니다(그리고 1을 뺍니다). 

이러한 변경 후 Amazon Redshift SQL은 Teradata와 동일한 출력을 생성합니다.

## 에픽
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql-epics"></a>

### RESET WHEN을 Amazon Redshift SQL로 변환
<a name="convert-reset-when-to-amazon-redshift-sql"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Teradata 창 함수를 생성합니다. | 필요에 따라 중첩 집계 및 RESET WHEN 구문을 사용합니다. | SQL Developer | 
| 코드를 Amazon Redshift SQL로 변환합니다. | 코드를 변환하려면 이 패턴의 ‘도구’ 섹션에 있는 지침을 따르세요. | SQL Developer | 
| Amazon Redshift에서 코드를 실행합니다. | 테이블을 생성하고, 테이블에 데이터를 로드하고, Amazon Redshift에서 코드를 실행합니다. | SQL Developer | 

## 관련 리소스
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql-resources"></a>

**참조**
+ [RESET WHEN 구문](https://docs.teradata.com/reader/1DcoER_KpnGTfgPinRAFUw/b7wL86OoMTPno6hrSPNdDg)(Teradata 설명서)
+ [RESET WHEN 설명](https://stackoverflow.com/questions/53344536/teradata-reset-when-partition-by-order-by)(Stack Overflow)
+ [Amazon Redshift로 마이그레이션](https://aws.amazon.com/redshift/data-warehouse-migration/)(AWS 웹 사이트)
+ [AWS SCT 데이터 추출 에이전트를 사용하여 테라데이타 데이터베이스를 Amazon Redshift로 마이그레이션](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/migrate-a-teradata-database-to-amazon-redshift-using-aws-sct-data-extraction-agents.html)(AWS 권장 가이드)
+ [Teradata NORMALIZE 임시 기능을 Amazon Redshift SQL로 변환](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/convert-the-teradata-normalize-temporal-feature-to-amazon-redshift-sql.html)(AWS 권장 가이드)

**도구**
+ [AWS Schema Conversion Tool(AWS SCT)](https://aws.amazon.com/dms/schema-conversion-tool/)

**파트너**
+ [AWS 마이그레이션 컴피턴시 파트너](https://aws.amazon.com/migration/partner-solutions/#delivery)

# AWS 클라우드에서 인프라를 코드로 사용하여 서버리스 데이터 레이크 배포와 관리
<a name="deploy-and-manage-a-serverless-data-lake-on-the-aws-cloud-by-using-infrastructure-as-code"></a>

*Kirankumar Chandrashekar, Abdel Jaidi, Amazon Web Services*

## 요약
<a name="deploy-and-manage-a-serverless-data-lake-on-the-aws-cloud-by-using-infrastructure-as-code-summary"></a>

이 패턴은 [서버리스 컴퓨팅](https://aws.amazon.com/serverless/) 및 [코드형 인프라](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/infrastructure-as-code.html)(IaC)를 사용하여 Amazon Web Services(AWS) 클라우드에서 데이터 레이크를 구현하고 관리하는 방법을 설명합니다. 이 패턴은 AWS에서 개발한 [서버리스 데이터 레이크 프레임워크(SDLF)](https://sdlf.workshop.aws/) 워크숍을 기반으로 합니다.

SDLF는 AWS 클라우드의 엔터프라이즈 데이터 레이크 전송을 가속화하고 프로덕션에 더 빠르게 배포하는 데 도움이 되는 재사용 가능한 리소스 컬렉션입니다. 모범 사례에 따라 데이터 레이크의 기본 구조를 구현하는 데 사용됩니다.

SDLF는 AWS CodePipeline, AWS CodeBuild, AWS CodeCommit과 같은 AWS 서비스를 사용하여 코드 및 인프라 배포 전반에 걸쳐 지속적 통합/지속적 배포(CI/CD) 프로세스를 구현합니다.

이 패턴은 여러 서버리스 서비스를 사용하여 데이터 레이크 관리를 단순화합니다. 여기에는 스토리지용 Amazon Simple Storage Service(S3)와 Amazon DynamoDB, 컴퓨팅용 Lambda와 Glue, 오케스트레이션용 Amazon CloudWatch Events, Amazon Simple Queue Service(Amazon SQS), Step Functions가 포함됩니다.

AWS CloudFormation 및 코드 서비스는 IaC 계층 역할을 하여 간편한 운영 및 관리와 함께 재현 가능하고 빠른 배포를 제공합니다.

## 사전 조건 및 제한 사항
<a name="deploy-and-manage-a-serverless-data-lake-on-the-aws-cloud-by-using-infrastructure-as-code-prereqs"></a>

**사전 조건 **
+ 활성 상태의 AWS 계정.
+ 설치 및 구성된 [Command Line Interface (CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html). 
+ Git 클라이언트 설치 및 구성.
+ [SDLF 워크샵](https://sdlf.workshop.aws/)이 웹 브라우저 창에서 열리면 바로 사용할 수 있습니다. 

## 아키텍처
<a name="deploy-and-manage-a-serverless-data-lake-on-the-aws-cloud-by-using-infrastructure-as-code-architecture"></a>

![\[AWS 클라우드에서 데이터 레이크 구현 및 관리.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/f4fc3ad2-1c4f-45ea-bc86-2db13105a173/images/e0cfff30-f0f8-4fc1-8e84-a152ef615c58.png)


 아키텍처 다이어그램은 다음 단계를 포함하는 이벤트 중심 프로세스를 보여줍니다. 

1. 파일이 원시 데이터 S3 버킷에 추가된 후에 Amazon S3 이벤트 알림이 SQS 대기열에 배치됩니다. 각 알림은 S3 버킷 이름, 객체 키 또는 타임스탬프와 같은 메타데이터를 포함하는 JSON 파일로서 전송됩니다.

1. 이 알림은 메타데이터를 기반으로 올바른 추출, 전환, 적재(ETL) 프로세스로 이벤트를 라우팅하는 Lambda 함수에서 사용됩니다. Lambda 함수는 Amazon DynamoDB 테이블에 저장된 상황별 구성을 사용할 수도 있습니다. 이 단계를 통해 데이터 레이크의 여러 애플리케이션을 분리하고 확장할 수 있습니다.

1. 이벤트는 ETL 프로세스의 첫 번째 Lambda 함수로 라우팅되며, 이 함수는 원시 데이터 영역의 데이터를 데이터 레이크의 스테이징 영역으로 변환하고 이동합니다. 첫 번째 단계는 종합 카탈로그를 업데이트하는 것입니다. 이는 데이터 레이크의 모든 파일 메타데이터를 포함하는 DynamoDB 테이블입니다. 이 테이블의 각 행에는 Amazon S3에 저장된 단일 객체에 대한 운영 메타데이터가 들어 있습니다. Lambda 함수가 동기식으로 호출되어 S3 객체에서 계산에 따른 리소스 비용이 높은 작업인 광변환(예: 파일을 한 형식에서 다른 형식으로 변환하는 작업)을 수행합니다. 스테이징 S3 버킷에 새 객체가 추가되었으므로 종합 카탈로그가 업데이트되고 메시지가 ETL에서 다음 단계를 기다리면서 SQS 대기열로 전송됩니다.

1. CloudWatch 이벤트 규칙은 5분마다 Lambda 함수를 트리거합니다. 이 함수는 메시지가 이전 ETL 단계에서 SQS 대기열로 전송되었는지 확인합니다. 메시지가 전송된 경우 Lambda 함수는 ETL 프로세스의 [Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/sample-start-workflow.html)에서 두 번째 함수를 시작합니다.

1. 그런 다음 배치 파일에 대규모 변환이 적용됩니다. 이 대규모 변환은 AWS Glue 작업, AWS Fargate 작업, Amazon EMR 단계 또는 Amazon SageMaker 노트북에 대한 동기 호출과 같은 계산에 따른 리소스 비용이 높은 작업입니다. 테이블 메타데이터는 AWS Glue 카탈로그를 업데이트하는 AWS Glue 크롤러를 사용하여 출력 파일에서 추출됩니다. 파일 메타데이터는 DynamoDB의 종합 카탈로그 테이블에도 추가됩니다. 마지막으로 [Deequ](https://github.com/awslabs/deequ)를 활용하는 데이터 품질 단계도 실행됩니다.

**기술 스택  **
+ Amazon CloudWatch Events
+ AWS CloudFormation
+ AWS CodePipeline
+ AWS CodeBuild
+ AWS CodeCommit
+ Amazon DynamoDB
+ AWS Glue
+ AWS Lambda
+ Amazon S3
+  Amazon SQS
+ AWS Step Functions

## 도구
<a name="deploy-and-manage-a-serverless-data-lake-on-the-aws-cloud-by-using-infrastructure-as-code-tools"></a>
+ [Amazon CloudWatch Events](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html) - CloudWatch Events는 AWS 리소스의 변경 사항을 설명하는 시스템 이벤트의 스트림을 거의 실시간으로 제공합니다.
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) – AWS CloudFormation을 사용하면 AWS 인프라 배포를 예상한 대로 반복해서 생성 및 프로비저닝할 수 있습니다.
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) – CodeBuild는 소스 코드를 컴파일하고 단위 테스트를 실행하며 배포할 준비가 완료된 아티팩트를 생성하는 완전 관리형 빌드 서비스입니다.
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) – CodeCommit은 클라우드에서 자산(예: 문서, 소스 코드, 바이너리 파일)을 비공개로 저장하여 관리할 수 있도록 AWS에서 호스팅되는 버전 관리 서비스입니다.
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) – CodePipeline은 소프트웨어 릴리스에 필요한 단계를 모델링, 시각화 및 자동화하는 데 사용할 수 있는 지속적 전달 서비스입니다.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) - DynamoDB는 완전 관리형 NoSQL 데이터베이스 서비스로, 원활한 확장성과 함께 빠르고 예측 가능한 성능을 제공합니다. 
+ [Glue](https://docs.aws.amazon.com/glue/latest/dg/what-is-glue.html) - Glue는 고객이 분석할 데이터를 쉽게 준비하고 로드할 수 있는 완전관리형 ETL 서비스입니다.
+ [Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) - Lambda는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있습니다. Lambda는 필요 시에만 코드를 실행하며, 일일 몇 개의 요청에서 초당 수천 개의 요청까지 자동으로 규모를 조정합니다. 
+ [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/gsg/GetStartedWithS3.html) - Amazon Simple Storage Service(S3)는 확장성이 뛰어난 객체 스토리지 서비스입니다. Amazon S3는 웹 사이트, 모바일 애플리케이션, 백업, 데이터 레이크 등 다양한 스토리지 솔루션에 사용할 수 있습니다.
+ [Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html) — Step Functions는 Lambda 함수 및 여러 AWS 서비스를 비즈니스 크리티컬 애플리케이션으로 쉽게 시퀀싱할 수 있게 해주는 서버리스 함수 오케스트레이터입니다.
+ [Amazon SQS](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html) – Amazon Simple Queue Service(Amazon SQS)는 마이크로서비스, 분산 시스템 및 서버리스 애플리케이션을 분리하고 확장하는 메시지 대기열 서비스입니다.
+ [Deequ](https://github.com/awslabs/deequ) — Deequ는 대규모 데이터 세트에 대한 데이터 품질 지표를 계산하고, 데이터 품질 제약 조건을 정의 및 확인하며, 데이터 배포의 변경 사항을 지속적으로 파악할 수 있도록 지원하는 도구입니다.

**코드 리포지토리**

SDLF의 소스 코드와 리소스는 [Labs GitHub 리포지토리](https://github.com/awslabs/aws-serverless-data-lake-framework/)에서 구할 수 있습니다.

## 에픽
<a name="deploy-and-manage-a-serverless-data-lake-on-the-aws-cloud-by-using-infrastructure-as-code-epics"></a>

### IaC를 프로비저닝하기 위한 CI/CD 파이프라인을 설정
<a name="set-up-the-ci-cd-pipeline-to-provision-iac"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| CI/CD 파이프라인을 설정하여 데이터 레이크의 IaC를 관리합니다. | AWS Management Console에 로그인하고 SDLF 워크숍의 [초기 설정](https://sdlf.workshop.aws/en/10-deployment/100-setup.html) 섹션에 나와 있는 절차를 따릅니다. 그러면 CodeCommit 리포지토리, CodeBuild 환경, 그리고 데이터 레이크용 IaC를 프로비저닝하고 관리하는 CodePipeline 파이프라인 등의 초기 CI/CD 리소스가 생성됩니다. | DevOps 엔지니어 | 

### IaC의 버전 제어
<a name="version-control-the-iac"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 로컬 시스템에서 CodeCommit 리포지토리를 복제합니다. | SDLF 워크숍의 [기반 배포](https://sdlf.workshop.aws/en/10-deployment/200-foundations.html) 섹션에 나와 있는 절차를 따릅니다. 이렇게 하면 IaC를 호스팅하는 Git 리포지토리를 로컬 환경에 복제할 수 있습니다. 이에 대한 자세한 내용은 CodeCommit 설명서의 [CodeCommit 리포지토리 연결](https://docs.aws.amazon.com/codecommit/latest/userguide/how-to-connect.html)을 참조하세요. | DevOps 엔지니어 | 
| CloudFormation 템플릿을 수정합니다. | 로컬 워크스테이션과 코드 편집기를 사용하여 사용 사례 또는 요구 사항에 따라 CloudFormation 템플릿을 수정합니다. 로컬로 복제된 Git 리포지토리에 커밋합니다. 더 자세한 내용은 [AWS CloudFormation 템플릿으로 작업하기](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-guide.html)(CloudFormation 설명서)를 참조하세요. | DevOps 엔지니어 | 
| CodeCommit 리포지토리에 변경사항을 푸시합니다. | 이제 인프라 코드가 버전 제어 하에 있으며 코드 베이스의 수정이 추적됩니다. CodeCommit 리포지토리에 변경 사항을 푸시하면 CodePipeline은 변경 사항을 인프라에 자동으로 적용하고 CodeBuild에 전달합니다. CodeBuild에서 AWS SAM CLI를 사용하는 경우 `sam package` 및 `sam deploy` 명령을 실행합니다. CLI를 사용하는 경우 `aws cloudformation package` 및 `aws cloudformation deploy` 명령을 실행합니다. | DevOps 엔지니어 | 

## 관련 리소스
<a name="deploy-and-manage-a-serverless-data-lake-on-the-aws-cloud-by-using-infrastructure-as-code-resources"></a>

**CI/CD 파이프라인을 설정하여 IaC를 프로비저닝**
+ [SDLF 워크숍 — 초기 설정](https://sdlf.workshop.aws/en/10-deployment/100-setup.html)

**IaC 버전 제어 **
+ [SDLF 워크숍 — 기반 배포](https://sdlf.workshop.aws/en/10-deployment/200-foundations.html)
+ [CodeCommit 리포지토리에 연결](https://docs.aws.amazon.com/codecommit/latest/userguide/how-to-connect.html)
+ [AWS CloudFormation 템플릿으로 작업](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-guide.html)

**기타 리소스**
+ [서버리스 데이터 분석 파이프라인 참조 아키텍처](https://aws.amazon.com/blogs/big-data/aws-serverless-data-analytics-pipeline-reference-architecture/)
+ [SDLF 설명서](https://sdlf.readthedocs.io/en/latest/)

# 시작 시 Amazon EMR 클러스터에 태그 지정 적용
<a name="enforce-tagging-of-amazon-emr-clusters-at-launch"></a>

*Priyanka Chaudhary, Amazon Web Services*

## 요약
<a name="enforce-tagging-of-amazon-emr-clusters-at-launch-summary"></a>

이 패턴은 Amazon EMR 클러스터가 생성될 때 해당 클러스터에 태그가 지정되도록 하는 보안 제어를 제공합니다. 

Amazon EMR은 방대한 양의 데이터를 처리하고 분석하기 위한 Amazon Web Services(AWS) 서비스입니다. Amazon EMR은 사내 클러스터 컴퓨팅 실행에 대한 손쉬운 대안으로 확장 가능하고 구성이 적은 서비스를 제공합니다. 태그를 사용하여 용도, 소유자 또는 환경을 기준으로 하는 것과 같이 AWS 리소스를 다양한 방식으로 분류할 수 있습니다. 예를 들어, 각 클러스터에 사용자 정의 메타데이터를 할당하여 Amazon EMR 클러스터에 태그를 지정할 수 있습니다. 태그는 사용자가 정의하는 키와 값으로 구성됩니다. 조직 요구 사항에 맞는 일관된 태그 집합을 생성하는 것이 좋습니다. 또한 태그를 Amazon EMR 클러스터에 추가하면 태그가 클러스터와 연결된 각각의 활성 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스로 전파됩니다. 마찬가지로, 태그를 Amazon EMR 클러스터에서 제거할 경우 해당 태그가 각각의 연결된 활성 EC2 인스턴스에서도 제거됩니다.

탐지 제어 기능은 API 직접 호출을 모니터링하고 [RunJobFlow](https://docs.aws.amazon.com/emr/latest/APIReference/API_RunJobFlow.html), [AddTags](https://docs.aws.amazon.com/emr/latest/APIReference/API_AddTags.html), [RemoveTags](https://docs.aws.amazon.com/emr/latest/APIReference/API_RemoveTags.html), [CreateTags](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTags.html) API에 대한 Amazon CloudWatch Events 이벤트를 시작합니다. 이벤트는 Python 스크립트를 실행하는 AWS Lambda를 호출합니다. Python 함수는 이벤트의 JSON 입력으로부터 Amazon EMR 클러스터 ID를 가져오고 다음 검사를 수행합니다.
+ Amazon EMR 클러스터가 지정한 태그 이름으로 구성되어 있는지 확인합니다.
+ 그렇지 않은 경우 Amazon EMR 클러스터 이름, 위반 세부 정보, AWS 리전, AWS 계정, 이 알림의 출처인 Lambda의 Amazon 리소스 이름(ARN)과 같은 관련 정보를 포함하여 Amazon Simple Notification Service(SNS) 알림을 사용자에게 보내세요.

## 사전 조건 및 제한 사항
<a name="enforce-tagging-of-amazon-emr-clusters-at-launch-prereqs"></a>

**사전 조건 **
+ 활성 상태의 AWS 계정
+ 제공된 Lambda 코드를 업로드하기 위한 Amazon Simple Storage Service(S3) 버킷입니다. 또는 *에픽 *섹션에 설명된 대로 이 용도로 S3 버킷을 생성할 수 있습니다.
+ 위반 알림을 받을 활성 이메일 주소입니다.
+ 확인하려는 필수 태그 목록입니다.

**제한 사항 **
+ 이 보안 제어는 리전별로 적용됩니다. 모니터링하려는 각 AWS 리전에 배포해야 합니다.

**제품 버전**
+ Amazon EMR 릴리스 4.8.0 이상에만 사용됩니다.

## 아키텍처
<a name="enforce-tagging-of-amazon-emr-clusters-at-launch-architecture"></a>

**워크플로 아키텍처**

![\[클러스터 시작, API를 사용한 모니터링, 이벤트 생성, Lambda 함수 호출, 알림 전송.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/1a4fc0f8-b0c9-4391-9c79-9eb3898d6ecb/images/0d95c414-69d1-4f29-a9e7-09f202e27014.png)


**자동화 및 규모 조정**
+ [AWS Organizations](https://aws.amazon.com/organizations/)를 사용하는 경우 [AWS Cloudformation StackSets](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/what-is-cfnstacksets.html)를 사용하여 모니터링하려는 여러 계정에 이 템플릿을 배포할 수 있습니다.

## 도구
<a name="enforce-tagging-of-amazon-emr-clusters-at-launch-tools"></a>

**서비스**
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) - AWS CloudFormation을 사용하면 AWS 리소스를 모델링 및 설정하고, 빠르고 일관되게 프로비저닝하고, 수명 주기 전반에 걸쳐 관리할 수 있습니다. 템플릿을 사용하여 리소스와 해당 종속성을 설명하고, 리소스를 개별적으로 관리하는 대신 스택으로 함께 시작하고 구성할 수 있습니다. 여러 AWS 계정 및 AWS 리전에서 스택을 관리하고 프로비저닝할 수 있습니다.
+ [Amazon CloudWatch Events](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html) – Amazon CloudWatch Events는 AWS 리소스의 변경 사항을 설명하는 시스템 이벤트의 스트림을 거의 실시간으로 제공합니다.
+ [Amazon EMR](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-what-is-emr.html) - Amazon EMR은 빅 데이터 프레임워크 실행을 간소화하고 방대한 양의 데이터를 효율적으로 처리하는 웹 서비스입니다.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) - AWS Lambda는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있도록 지원하는 컴퓨팅 서비스입니다. Lambda는 필요 시에만 코드를 실행하며, 일일 몇 개의 요청에서 초당 수천 개의 요청까지 자동으로 규모를 조정합니다. 
+ [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)-Amazon Simple Storage Service(S3)는 객체 스토리지 서비스입니다. Amazon S3를 사용하면 인터넷을 통해 언제 어디서든 원하는 양의 데이터를 저장하고 검색할 수 있습니다.
+ [Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) – Amazon Simple Notification Service(SNS)는 웹 서버와 이메일 주소를 포함하여 게시자와 클라이언트 간에 메시지를 전달 또는 전송하는 것을 조정하고 관리합니다. 구독자는 구독하는 주제에 게시된 모든 메시지를 수신하며 주제에 대한 모든 구독자는 동일한 메시지를 수신합니다.

**코드**

이 패턴에는 다음과 같은 첨부 파일이 포함됩니다.
+ `EMRTagValidation.zip` - 보안 제어를 위한 Lambda 코드입니다.
+ `EMRTagValidation.yml` - 이벤트 및 Lambda 함수를 설정하는 CloudFormation 템플릿입니다.

## 에픽
<a name="enforce-tagging-of-amazon-emr-clusters-at-launch-epics"></a>

### S3 버킷을 설정합니다.
<a name="set-up-the-s3-bucket"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| S3 버킷을 정의합니다. | [Amazon S3 콘솔](https://console.aws.amazon.com/s3/)에서 Lambda 코드 .zip 파일을 호스팅할 S3 버킷을 선택하거나 생성합니다. 이 S3 버킷은 모니터링하려는 Amazon EMR 클러스터와 동일한 AWS 리전에 있어야 합니다. Amazon S3 버킷 이름은 전역 수준에서 고유하며 네임스페이스는 모든 AWS 계정이 공유합니다. S3 버킷 이름에는 선행 슬래시를 포함할 수 없습니다. | 클라우드 아키텍트 | 
| Lambda 코드를 업로드합니다. | *첨부 파일* 섹션에 제공된 Lambda 코드 .zip 파일을 S3 버킷에 업로드합니다.                                              | 클라우드 아키텍트 | 

### AWS CloudFormation 템플릿 배포
<a name="deploy-the-aws-cloudformation-template"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| AWS CloudFormation 템플릿을 실행합니다. | S3 버킷과 동일한 AWS 리전에서 [AWS CloudFormation 콘솔](https://console.aws.amazon.com/cloudformation/.)을 열고 첨부된 템플릿 을 배포합니다. AWS CloudFormation 템플릿 배포에 대한 자세한 내용은 CloudFormation 설명서의 [AWS CloudFormation 콘솔에서 스택 생성](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html)을 참조하세요. | 클라우드 아키텍트 | 
| 템플릿에서 파라미터를 작성합니다. | 템플릿을 시작하면 다음 정보를 입력하라는 메시지가 표시됩니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/enforce-tagging-of-amazon-emr-clusters-at-launch.html) | 클라우드 아키텍트 | 

### 구독 확인
<a name="confirm-the-subscription"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 구독을 확인합니다. | CloudFormation 템플릿이 성공적으로 배포되면 입력한 이메일 주소로 구독 이메일이 전송됩니다. 위반 알림을 받기 시작하려면 이 이메일 구독을 확인해야 합니다. | 클라우드 아키텍트 | 

## 관련 리소스
<a name="enforce-tagging-of-amazon-emr-clusters-at-launch-resources"></a>
+ [AWS Lambda 개발자 안내서](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)
+ [Amazon EMR에서 클러스터에 태그 지정](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-tags.html)

## 첨부
<a name="attachments-1a4fc0f8-b0c9-4391-9c79-9eb3898d6ecb"></a>

이 문서와 관련된 추가 콘텐츠에 액세스하려면 [attachment.zip](samples/p-attach/1a4fc0f8-b0c9-4391-9c79-9eb3898d6ecb/attachments/attachment.zip) 파일의 압축을 풉니다.

# 시작 시 Amazon S3에 Amazon EMR 로깅이 활성화되었는지 확인
<a name="ensure-amazon-emr-logging-to-amazon-s3-is-enabled-at-launch"></a>

*Priyanka Chaudhary, Amazon Web Services*

## 요약
<a name="ensure-amazon-emr-logging-to-amazon-s3-is-enabled-at-launch-summary"></a>

이 패턴은 Amazon Web Services에서 실행되는 Amazon EMR 클러스터의 로깅 구성을 모니터링하는 보안 제어를 제공합니다.

Amazon EMR은 빅 데이터 처리 및 분석을 위한 도구입니다. Amazon EMR은 사내 클러스터 컴퓨팅 실행의 대안으로 확장 가능한 저구성 서비스를 제공합니다. Amazon EMR은 두 가지 유형의 EMR 클러스터를 제공합니다.
+ **임시 Amazon EMR 클러스터**: 임시 Amazon EMR 클러스터는 처리가 완료되면 자동으로 종료되고 비용 발생을 중단합니다.
+ **영구 Amazon EMR 클러스터**: 영구 Amazon EMR 클러스터는 데이터 처리 작업이 완료된 후에도 계속 실행됩니다.

Amazon EMR와 Hadoop은 모두 클러스터에서 상태를 보고하는 로그 파일을 생성합니다. 기본적으로 이러한 파일은 **/mnt/var/log/** 디렉터리의 프라이머리 노드에 기록됩니다. 클러스터를 시작할 때 클러스터를 구성하는 방법에 따라, Amazon Simple Storage Service(S3)에 로그를 저장하고 그래픽 디버깅 도구를 통해 볼 수도 있습니다. Amazon S3 로깅은 클러스터가 시작될 때만 지정할 수 있다는 점에 유의하십시오. 이 구성을 사용하면 5분마다 프라이머리 노드에서 Amazon S3 위치로 로그가 전송됩니다. 임시 클러스터의 경우, 처리가 완료되면 클러스터가 사라지고 이러한 로그 파일을 사용하여 실패한 작업을 디버깅할 수 있으므로 Amazon S3 로깅이 중요합니다.

이 패턴은 CloudFormation 템플릿을 사용하여 API 직접 호출을 모니터링하고 “RunJobFlow”에서 Amazon CloudWatch Events를 시작하는 보안 제어를 배포합니다. 이 트리거는 Python 스크립트를 실행하는 Lambda를 호출합니다. Lambda 함수는 이벤트 JSON 입력에서 EMR 클러스터 ID를 검색하고 Amazon S3 로그 URI도 확인합니다. Amazon S3 URI를 찾을 수 없는 경우, Lambda 함수는 EMR 클러스터 이름, 위반 세부 정보, 리전, 계정 및 알림의 출처가 되는 Lambda Amazon 리소스 이름(ARN)을 자세히 설명하는 Amazon Simple Notification Service(SNS) 알림을 보냅니다.

## 사전 조건 및 제한 사항
<a name="ensure-amazon-emr-logging-to-amazon-s3-is-enabled-at-launch-prereqs"></a>

**사전 조건 **
+ 활성 상태의 AWS 계정
+ Lambda 코드 .zip 파일을 위한 S3 버킷
+ 위반 알림을 수신하려는 이메일 주소

**제한 사항 **
+ 이 탐지 제어는 리전별이므로 모니터링하려는 각 AWS 리전에 배포해야 합니다.

**제품 버전**
+ Amazon EMR 릴리스 4.8.0 이상에만 사용됩니다.

## 아키텍처
<a name="ensure-amazon-emr-logging-to-amazon-s3-is-enabled-at-launch-architecture"></a>

**대상 기술 스택**
+ Amazon CloudWatch Events 이벤트
+ Amazon EMR
+ Lambda 함수
+ S3 버킷
+ Amazon SNS

**대상 아키텍처 **

![\[시작 시 Amazon S3에 Amazon EMR 로깅이 활성화되었는지 확인하는 워크플로,\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/079af32e-0418-4bb2-bc20-c67ea5ac3b6e/images/3ba125cb-018a-4ace-838f-8c20992ecc20.png)


**자동화 및 규모 조정**
+ AWS Organizations를 사용하는 경우, [CloudFormation StackSets](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/what-is-cfnstacksets.html)을 사용하여 모니터링하려는 여러 계정에 이 템플릿을 배포할 수 있습니다.

## 도구
<a name="ensure-amazon-emr-logging-to-amazon-s3-is-enabled-at-launch-tools"></a>

**도구**
+ [CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) - CloudFormation은 인프라를 코드로 사용하여 리소스를 모델링하고 설정하는 데 도움이 되는 서비스입니다.
+ [Cloudwatch Events](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html) – CloudWatch Events는 리소스의 변경 사항을 설명하는 시스템 이벤트의 스트림을 거의 실시간으로 제공합니다.
+ [Amazon EMR](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-what-is-emr.html) - Amazon EMR은 빅 데이터 프레임워크 실행을 간소화는 관리형 클러스터 플랫폼입니다.
+ [Lambda](https://aws.amazon.com/lambda/) - Lambda는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있습니다. Lambda는 필요 시에만 코드를 실행하며, 일일 몇 개의 요청에서 초당 수천 개의 요청까지 자동으로 규모를 조정합니다.
+ [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/Welcome.html) - Amazon S3에서 언제든지 웹상 어디서나 원하는 양의 데이터를 저장하고 검색할 수 있는 웹 서비스 인터페이스입니다.
+ [Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) - Amazon SNS는 게시자와 클라이언트 간에 웹 서버와 이메일 주소를 포함한 메시지 전달 또는 전송을 조정하고 관리하는 웹 서비스입니다.

**코드 **
+ 프로젝트의 .zip 파일은 첨부 파일로 제공됩니다.

## 에픽
<a name="ensure-amazon-emr-logging-to-amazon-s3-is-enabled-at-launch-epics"></a>

### S3 버킷 정의
<a name="define-the-s3-bucket"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| S3 버킷을 정의합니다. | Lambda 코드 .zip 파일을 호스팅하려면 선행 슬래시가 없는 고유한 이름을 가진 S3 버킷을 선택하거나 생성합니다. S3 버킷 이름은 전역 수준에서 고유하며, 네임스페이스는 모든 계정이 공유합니다. S3 버킷은 평가 중인 Amazon EMR 클러스터와 동일한 리전에 있어야 합니다. | 클라우드 아키텍트 | 

### Lambda 코드를 S3 버킷에 업로드
<a name="upload-the-lambda-code-to-the-s3-bucket"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Lambda 코드를 S3 버킷에 업로드합니다. | “첨부 파일” 섹션에 나와 있는 Lambda 코드 .zip 파일을 S3 버킷에 업로드합니다. S3 버킷은 평가 중인 Amazon EMR 클러스터와 동일한 리전에 있어야 합니다. | 클라우드 아키텍트 | 

### AWS CloudFormation 템플릿 배포
<a name="deploy-the-aws-cloudformation-template"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| AWS CloudFormation 템플릿을 배포합니다. | AWS CloudFormation션 콘솔에서 S3 버킷과 동일한 리전에 이 패턴에 대한 첨부 파일로 제공된 AWS CloudFormation 템플릿을 배포합니다. 다음 에픽에서 파라미터에 대한 값을 입력합니다. AWS CloudFormation 템플릿 배포에 대한 자세한 내용은 ‘관련 리소스’ 섹션을 참조합니다. | 클라우드 아키텍트 | 

### AWS CloudFormation 템플릿에서 파라미터 작성
<a name="complete-the-parameters-in-the-aws-cloudformation-template"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| S3 버킷에 이름을 지정합니다. | 첫 번째 에픽에서 생성한 S3 버킷의 이름을 입력합니다. | 클라우드 아키텍트 | 
| Amazon S3 키를 입력합니다. | S3 버킷의 Lambda 코드 .zip 파일 위치를 선행 슬래시 없이 입력합니다(예: <디렉토리>/<파일 이름>.zip). | 클라우드 아키텍트 | 
| 이메일 주소를 입력합니다. | Amazon SNS 알림을 수신할 활성 이메일 주소를 입력합니다. | 클라우드 아키텍트 | 
| 로깅 수준을 정의합니다. | Lambda 함수의 로깅 수준 및 빈도를 정의합니다. ‘정보’는 애플리케이션 진행 상황에 대한 자세한 정보 메시지를 의미합니다. ‘오류’는 애플리케이션을 계속 실행하도록 허용하는 오류 이벤트를 의미합니다. ‘경고’는 잠재적으로 위험한 상황을 의미합니다. | 클라우드 아키텍트 | 

### 구독 확인
<a name="confirm-the-subscription"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 구독을 확인합니다. | 템플릿이 성공적으로 배포되면 입력한 이메일 주소로 구독 이메일 메시지가 전송됩니다. 위반 알림을 받으려면 이 이메일 구독을 확인해야 합니다. | 클라우드 아키텍트 | 

## 관련 리소스
<a name="ensure-amazon-emr-logging-to-amazon-s3-is-enabled-at-launch-resources"></a>
+ [Lambda](https://aws.amazon.com/lambda/)
+ [Amazon EMR 로깅](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-debugging.html)
+ [CloudFormation 템플릿 배포](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html)

## 첨부
<a name="attachments-079af32e-0418-4bb2-bc20-c67ea5ac3b6e"></a>

이 문서와 관련된 추가 콘텐츠에 액세스하려면 [attachment.zip](samples/p-attach/079af32e-0418-4bb2-bc20-c67ea5ac3b6e/attachments/attachment.zip) 파일의 압축을 풉니다.

# AWS Glue 작업과 Python을 사용하여 테스트 데이터 생성
<a name="generate-test-data-using-an-aws-glue-job-and-python"></a>

*Moinul Al-Mamun, Amazon Web Services*

## 요약
<a name="generate-test-data-using-an-aws-glue-job-and-python-summary"></a>

이 패턴은 Python으로 작성된 AWS Glue 작업을 생성하여 수백만 개의 샘플 파일을 동시에 빠르고 쉽게 생성하는 방법을 보여줍니다. 샘플 파일은 Amazon Simple Storage Service(S3) 버킷에 저장됩니다. AWS 클라우드에서 서비스를 테스트하거나 평가하려면 대량의 샘플 파일을 빠르게 생성할 수 있는 능력이 중요합니다. 예를 들어 Amazon S3 접두사에 있는 수백만 개의 작은 파일에 대한 데이터 분석을 수행하여 AWS Glue Studio 또는 AWS Glue DataBrew 작업의 성능을 테스트할 수 있습니다.

다른 AWS 서비스를 사용하여 샘플 데이터 세트를 생성할 수도 있지만 AWS Glue를 사용하는 것이 좋습니다. AWS Glue는 서버리스 데이터 처리 서비스이므로 인프라를 관리할 필요가 없습니다. 코드를 가져와서 AWS Glue 클러스터에서 실행하기만 하면 됩니다. 또한 AWS Glue는 작업 실행에 필요한 리소스를 프로비저닝, 구성 및 확장합니다. 사용하는 리소스에 대해서만 비용을 지불합니다.

## 사전 조건 및 제한 사항
<a name="generate-test-data-using-an-aws-glue-job-and-python-prereqs"></a>

**사전 조건 **
+ 활성 상태의 AWS 계정
+ AWS 계정과 작동하도록 [설치](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) 및 [구성](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)된 AWS Command Line Interface(AWS CLI)

**제품 버전**
+ Python 3.9
+ CLI 버전 2

**제한 사항 **

트리거당 최대 AWS Glue 작업 수는 50개입니다. 자세한 내용은 [AWS Glue 엔드포인트 및 할당량](https://docs.aws.amazon.com/general/latest/gr/glue.html)을 참조하세요.

## 아키텍처
<a name="generate-test-data-using-an-aws-glue-job-and-python-architecture"></a>

다음 다이어그램은 출력(즉, 샘플 파일)을 S3 버킷에 쓰는 AWS Glue 작업을 중심으로 한 예제 아키텍처를 보여줍니다.

![\[AWS CLI가 S3 버킷에 출력을 쓰는 AWS Glue 작업을 시작하는 것을 보여주는 워크플로.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/f35943e8-3b2b-410e-a3f0-05e1ebd357d0/images/452ccbda-71f2-42b8-976d-bcc968bb1dab.png)


이 다이어그램은 다음 워크플로우를 포함합니다.

1. AWS CLI, AWS Management Console 또는 API를 사용하여 AWS Glue 작업을 시작합니다. AWS CLI 또는 API를 사용하면 호출된 작업의 병렬화를 자동화하고 샘플 파일 생성 런타임을 줄일 수 있습니다.

1. AWS Glue 작업은 파일 콘텐츠를 무작위로 생성하고, 콘텐츠를 CSV 형식으로 변환한 다음, 콘텐츠를 공통 접두사 아래의 Amazon S3 객체로 저장합니다. 각 파일은 1킬로바이트 미만입니다. AWS Glue 작업은 두 개의 사용자 정의 작업 파라미터인 `START_RANGE` 및 `END_RANGE`를 허용합니다. 이러한 파라미터를 사용하여 각 작업 실행에 의해 Amazon S3에서 생성되는 파일 이름과 파일 수를 설정할 수 있습니다. 이 작업의 여러 인스턴스를 병렬로 실행할 수 있습니다(예: 인스턴스 100개).

## 도구
<a name="generate-test-data-using-an-aws-glue-job-and-python-tools"></a>
+ [Amazon Simple Storage Service(S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)는 원하는 양의 데이터를 저장, 보호 및 검색하는 데 도움이 되는 클라우드 기반 객체 스토리지 서비스입니다.
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)는 명령줄 쉘에서 명령을 사용하여 AWS 서비스와 상호 작용할 수 있는 오픈 소스 도구입니다.
+ [AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/what-is-glue.html)는 완전 관리형 추출, 전환, 적재(ETL) 서비스입니다. 이를 통해 데이터 스토어와 데이터 스트림 간에 데이터를 안정적으로 분류, 정리, 보강하고 이동할 수 있습니다.
+ [AWS Identity and Access Management(IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)는 사용자에 대한 인증 및 권한 부여를 제어함으로써 AWS 리소스에 대한 액세스를 안전하게 제어할 수 있습니다.

## 모범 사례
<a name="generate-test-data-using-an-aws-glue-job-and-python-best-practices"></a>

이 패턴을 구현할 때는 다음과 같은 AWS Glue 모범 사례를 고려하세요.
+ **적절한 AWS Glue 작업자 유형을 사용하여 비용을 절감합니다.** 작업자 유형의 다양한 속성을 이해한 다음 CPU 및 메모리 요구 사항에 따라 워크로드에 적합한 작업자 유형을 선택하는 것이 좋습니다. 이 패턴의 경우 DPU를 최소화하고 비용을 줄이려면 Python 쉘 작업을 작업 유형으로 사용하는 것이 좋습니다. 자세한 내용은 AWS Glue 개발자 가이드의 [AWS Glue에서 작업 추가](https://docs.aws.amazon.com/glue/latest/dg/add-job.html)를 참조하세요.
+ **적절한 동시성 한도를 사용하여 작업을 확장합니다.** 시간 요구 사항과 필요한 파일 수를 기준으로 AWS Glue 작업의 최대 동시 실행 시간을 정하는 것이 좋습니다.
+ **처음에는 적은 수의 파일을 생성하기 시작합니다.** AWS Glue 작업을 구축할 때 비용을 줄이고 시간을 절약하려면 적은 수의 파일(예: 1,000개)부터 시작합니다. 이렇게 하면 문제 해결이 더 쉬워질 수 있습니다. 적은 수의 파일을 생성하는 데 성공하면 더 많은 파일로 확장할 수 있습니다.
+ **먼저 로컬에서 실행합니다.** AWS Glue 작업을 구축할 때 비용을 줄이고 시간을 절약하려면 로컬에서 개발을 시작하고 코드를 테스트합니다. 쉘과 통합 개발 환경(IDE)에서 AWS Glue 추출, 전환, 적재(ETL) 작업을 작성하는 데 도움이 되는 Docker 컨테이너를 설정하는 방법에 대한 지침은 AWS 빅 데이터 블로그의 [컨테이너를 사용하여 로컬에서 AWS Glue ETL 작업 개발](https://aws.amazon.com/blogs/big-data/developing-aws-glue-etl-jobs-locally-using-a-container/)을 참조하세요.

더 많은 AWS Glue 모범 사례는 AWS Glue 설명서의 [모범 사례](https://docs.aws.amazon.com/prescriptive-guidance/latest/serverless-etl-aws-glue/best-practices.html)를 참조하세요.

## 에픽
<a name="generate-test-data-using-an-aws-glue-job-and-python-epics"></a>

### 대상 S3 버킷 및 IAM 역할 생성
<a name="create-a-destination-s3-bucket-and-iam-role"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 파일을 저장할 S3 버킷을 만듭니다. | [S3 버킷](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)과 그 안에 [접두사](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-prefixes.html)를 생성합니다.이 패턴은 데모용으로 `s3://{your-s3-bucket-name}/small-files/` 위치를 사용합니다. | 앱 개발자 | 
| IAM 역할 생성 및 구성. | AWS Glue 작업에서 S3 버킷에 쓰는 데 사용할 수 있는 IAM 역할을 생성해야 합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/generate-test-data-using-an-aws-glue-job-and-python.html) | 앱 개발자 | 

### 동시 실행을 처리하도록 AWS Glue 작업을 생성하고 구성합니다.
<a name="create-and-configure-an-aws-glue-job-to-handle-concurrent-runs"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| AWS Glue 작업을 생성합니다. | 콘텐츠를 생성하여 S3 버킷에 저장하는 AWS Glue 작업을 생성해야 합니다.[AWS Glue 작업](https://docs.aws.amazon.com/glue/latest/dg/console-jobs.html)을 생성한 후 다음 단계를 완료하여 작업을 구성합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/generate-test-data-using-an-aws-glue-job-and-python.html) | 앱 개발자 | 
| 작업 코드를 업데이트합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/generate-test-data-using-an-aws-glue-job-and-python.html) | 앱 개발자 | 

### 명령줄 또는 콘솔에서 AWS Glue 작업을 실행합니다.
<a name="run-the-aws-glue-job-from-the-command-line-or-console"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 명령줄에서 AWS Glue 작업을 실행합니다. | AWS CLI에서 AWS Glue 작업을 실행하려면 해당 값을 사용하여 다음 명령을 실행합니다.<pre>cmd:~$ aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"0","--END_RANGE":"1000000"}'<br />cmd:~$ aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1000000","--END_RANGE":"2000000"}'</pre>AWS Management Console에서 AWS Glue 작업을 실행하는 방법에 대한 지침은 이 패턴의 *AWS Management Console에서 AWS Glue 작업 실행 스토리*를 참조하세요.위의 예와 같이 다른 파라미터로 한 번에 여러 실행을 실행하려면 AWS CLI를 사용하여 AWS Glue 작업을 실행하는 것이 좋습니다.특정 병렬화 요소를 사용하여 정의된 수의 파일을 생성하는 데 필요한 모든 AWS CLI 명령을 생성하려면 해당 값을 사용하여 다음 bash 코드를 실행합니다.<pre># define parameters<br />NUMBER_OF_FILES=10000000;<br />PARALLELIZATION=50; <br /> <br /># initialize<br />_SB=0;<br />      <br /># generate commands<br />for i in $(seq 1 $PARALLELIZATION); <br />do <br />      echo aws glue start-job-run --job-name create_small_files --arguments "'"'{"--START_RANGE":"'$(((NUMBER_OF_FILES/PARALLELIZATION) * (i-1) + _SB))'","--END_RANGE":"'$(((NUMBER_OF_FILES/PARALLELIZATION) * (i)))'"}'"'";<br />      _SB=1; <br />done</pre>위 스크립트를 사용하는 경우 다음 사항을 고려합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/generate-test-data-using-an-aws-glue-job-and-python.html) 위 스크립트의 출력 예를 보려면 이 패턴의 *추가 정보* 섹션에서 *쉘 스크립트* 출력을 참조하세요. | 앱 개발자 | 
| AWS Management Console에서 AWS Glue 작업을 실행합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/generate-test-data-using-an-aws-glue-job-and-python.html) | 앱 개발자 | 
| AWS Glue 작업의 상태를 확인합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/generate-test-data-using-an-aws-glue-job-and-python.html) | 앱 개발자 | 

## 관련 리소스
<a name="generate-test-data-using-an-aws-glue-job-and-python-resources"></a>

**참조**
+ [Registry of Open Data on AWS](https://registry.opendata.aws/)
+ [분석용 데이터 세트](https://aws.amazon.com/marketplace/solutions/data-analytics/data-sets)
+ [AWS 기반 오픈 데이터](https://aws.amazon.com/opendata/)
+ [AWS Glue에 작업 추가](https://docs.aws.amazon.com/glue/latest/dg/add-job.html)
+ [AWS Glue 시작하기](https://aws.amazon.com/glue/getting-started/)

**가이드 및 패턴**
+ [AWS Glue 모범 사례](https://docs.aws.amazon.com/prescriptive-guidance/latest/serverless-etl-aws-glue/best-practices.html)
+ [부하 테스트 애플리케이션](https://docs.aws.amazon.com/prescriptive-guidance/latest/load-testing/welcome.html)

## 추가 정보
<a name="generate-test-data-using-an-aws-glue-job-and-python-additional"></a>

**벤치마킹 테스트**

이 패턴은 벤치마킹 테스트의 일환으로 다양한 병렬화 파라미터를 사용하여 1천만 개의 파일을 생성하는 데 사용되었습니다. 다음 표는 테스트 결과를 보여줍니다.


| 
| 
| 병렬화 | 작업 실행으로 생성된 파일 수 | 작업 기간 | Speed | 
| --- |--- |--- |--- |
| 10 | 1,000,000 | 6시간 40분 | 매우 느림 | 
| 50 | 200,000 | 80분 | 보통 | 
| 100 | 100,000건 | 40분 | 빠른 | 

프로세스를 더 빠르게 진행하려면 작업 구성에서 더 많은 동시 실행을 구성할 수 있습니다. 요구 사항에 따라 작업 구성을 쉽게 조정할 수 있지만, AWS Glue Service Quotas 한도가 있다는 점을 기억합니다. 자세한 내용은 [AWS Glue 엔드포인트 및 할당량](https://docs.aws.amazon.com/general/latest/gr/glue.html)을 참조하세요.

**쉘 스크립트 출력**

다음 예제는 이 패턴의 *명령줄에서 AWS Glue 작업 실행* 스토리의 쉘 스크립트 출력을 보여줍니다.

```
user@MUC-1234567890 MINGW64 ~
  $ # define parameters
  NUMBER_OF_FILES=10000000;
  PARALLELIZATION=50;
  # initialize
  _SB=0;
   
  # generate commands
  for i in $(seq 1 $PARALLELIZATION);
   do
         echo aws glue start-job-run --job-name create_small_files --arguments "'"'{"--START_RANGE":"'$(((NUMBER_OF_FILES/PARALLELIZATION)  (i-1) + SB))'","--ENDRANGE":"'$(((NUMBER_OF_FILES/PARALLELIZATION)  (i)))'"}'"'";
         _SB=1;
   done
   
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"0","--END_RANGE":"200000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"200001","--END_RANGE":"400000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"400001","--END_RANGE":"600000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"600001","--END_RANGE":"800000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"800001","--END_RANGE":"1000000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1000001","--END_RANGE":"1200000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1200001","--END_RANGE":"1400000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1400001","--END_RANGE":"1600000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1600001","--END_RANGE":"1800000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1800001","--END_RANGE":"2000000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"2000001","--END_RANGE":"2200000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"2200001","--END_RANGE":"2400000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"2400001","--END_RANGE":"2600000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"2600001","--END_RANGE":"2800000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"2800001","--END_RANGE":"3000000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"3000001","--END_RANGE":"3200000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"3200001","--END_RANGE":"3400000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"3400001","--END_RANGE":"3600000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"3600001","--END_RANGE":"3800000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"3800001","--END_RANGE":"4000000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"4000001","--END_RANGE":"4200000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"4200001","--END_RANGE":"4400000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"4400001","--END_RANGE":"4600000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"4600001","--END_RANGE":"4800000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"4800001","--END_RANGE":"5000000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"5000001","--END_RANGE":"5200000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"5200001","--END_RANGE":"5400000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"5400001","--END_RANGE":"5600000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"5600001","--END_RANGE":"5800000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"5800001","--END_RANGE":"6000000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"6000001","--END_RANGE":"6200000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"6200001","--END_RANGE":"6400000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"6400001","--END_RANGE":"6600000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"6600001","--END_RANGE":"6800000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"6800001","--END_RANGE":"7000000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"7000001","--END_RANGE":"7200000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"7200001","--END_RANGE":"7400000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"7400001","--END_RANGE":"7600000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"7600001","--END_RANGE":"7800000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"7800001","--END_RANGE":"8000000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"8000001","--END_RANGE":"8200000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"8200001","--END_RANGE":"8400000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"8400001","--END_RANGE":"8600000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"8600001","--END_RANGE":"8800000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"8800001","--END_RANGE":"9000000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"9000001","--END_RANGE":"9200000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"9200001","--END_RANGE":"9400000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"9400001","--END_RANGE":"9600000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"9600001","--END_RANGE":"9800000"}'
  aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"9800001","--END_RANGE":"10000000"}'
  
  user@MUC-1234567890 MINGW64 ~
```

**FAQ**

*동시 실행 또는 병렬 작업은 몇 개나 사용해야 할까요?*

동시 실행 및 병렬 작업 수는 필요한 시간 및 원하는 테스트 파일 수에 따라 달라집니다. 만들고 있는 파일의 크기를 확인하는 것이 좋습니다. 먼저, AWS Glue 작업에서 원하는 수의 파일을 생성하는 데 걸리는 시간을 확인합니다. 그런 다음, 적절한 수의 동시 실행을 사용하여 목표를 달성합니다. 예를 들어 100,000개의 파일이 실행을 완료하는 데 40분이 걸리지만 목표 시간이 30분이라고 가정하면 AWS Glue 작업의 동시성 설정을 늘려야 합니다.

*이 패턴을 사용하여 어떤 유형의 콘텐츠를 생성할 수 있나요?*

구분자가 다른 텍스트 파일(예: PIPE, JSON 또는 CS)과 같은 모든 유형의 콘텐츠를 만들 수 있습니다. 이 패턴은 Boto3를 사용하여 파일에 쓴 다음 파일을 S3 버킷에 저장합니다.

*S3 버킷에 필요한 IAM 권한 수준은 어느 정도인가요?*

S3 버킷에 있는 객체에 대한 `Write` 액세스를 허용하는 ID 기반 정책이 있어야 합니다. 자세한 내용은 Amazon S3 설명서의 [Amazon S3: S3 버킷에 있는 객체에 대한 읽기 및 쓰기 액세스 권한 허용](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_s3_rw-bucket.html)을 참조하세요.

# AWS IoT Greengrass를 사용하여 IoT 데이터를 Amazon S3에 직접 비용 효율적으로 수집할 수 있습니다
<a name="cost-effectively-ingest-iot-data-directly-into-amazon-s3-using-aws-iot-greengrass"></a>

*Sebastian Viviani, Rizwan Syed, Amazon Web Services*

## 요약
<a name="cost-effectively-ingest-iot-data-directly-into-amazon-s3-using-aws-iot-greengrass-summary"></a>

이 패턴은 AWS IoT Greengrass 버전 2 디바이스를 사용하여 Amazon Simple Storage Service(S3) 버킷으로 직접 사물 인터넷(IoT) 데이터를 비용 효율적으로 수집하는 방법을 보여줍니다. 기기는 IoT 데이터를 읽고 영구 리포지토리(즉, 로컬 디스크 또는 볼륨)에 데이터를 저장하는 사용자 지정 구성 요소를 실행합니다. 그런 다음 디바이스는 IoT 데이터를 Apache Parquet 파일로 압축하고 주기적으로 데이터를 S3 버킷에 업로드합니다.

수집하는 IoT 데이터의 양과 속도는 엣지 하드웨어 기능과 네트워크 대역폭에 의해서만 제한됩니다. Amazon Athena를 사용하면 수집된 데이터를 비용 효율적으로 분석할 수 있습니다. Athena는 [Amazon Managed Grafana](https://docs.aws.amazon.com/grafana/latest/userguide/what-is-Amazon-Managed-Service-Grafana.html)를 사용하여 압축된 Apache Parquet 파일 및 데이터 시각화를 지원합니다.

## 사전 조건 및 제한 사항
<a name="cost-effectively-ingest-iot-data-directly-into-amazon-s3-using-aws-iot-greengrass-prereqs"></a>

**사전 조건 **
+ 활성 상태의 AWS 계정
+ [AWS IoT Greengrass 버전 2](https://docs.aws.amazon.com/greengrass/v2/developerguide/greengrass-v2-whats-new.html)에서 실행되고 센서로부터 데이터를 수집하는 [엣지 게이트웨이](https://docs.aws.amazon.com/greengrass/v1/developerguide/quick-start.html) (데이터 소스 및 데이터 수집 프로세스는 이 패턴의 범위를 벗어나지만 거의 모든 유형의 센서 데이터를 사용할 수 있습니다. 이 패턴은 데이터를 로컬에 게시하는 센서 또는 게이트웨이가 있는 로컬 [MQTT](https://mqtt.org/) 브로커를 사용합니다.)
+ AWS IoT Greengrass [구성 요소](https://docs.aws.amazon.com/greengrass/v2/developerguide/develop-greengrass-components.html), [역할](https://docs.aws.amazon.com/greengrass/v1/developerguide/service-role.html) 및 [SDK 종속성](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html#installation)
+ S3 버킷에 데이터를 업로드하기 위한 [스트림 관리자 구성 요소](https://docs.aws.amazon.com/greengrass/v2/developerguide/stream-manager-component.html)
+ API를 실행하기 위한 [AWS SDK for Java](https://aws.amazon.com/sdk-for-java/), [AWS SDK for JavaScript](https://aws.amazon.com/sdk-for-javascript/) [AWS SDK for Python(Boto3)](https://docs.aws.amazon.com/pythonsdk/)

**제한 사항 **
+ 이 패턴의 데이터는 S3 버킷에 실시간으로 업로드되지 않습니다. 지연 기간이 있으며 지연 기간을 구성할 수 있습니다. 데이터는 에지 디바이스에서 일시적으로 버퍼링된 후 기간이 만료되면 업로드됩니다.
+ SDK는 Java, Node.js 및 Python에서만 이용 가능합니다.

## 아키텍처
<a name="cost-effectively-ingest-iot-data-directly-into-amazon-s3-using-aws-iot-greengrass-architecture"></a>

**대상 기술 스택 **
+ Amazon S3
+ AWS IoT Greengrass
+ MQTT 브로커
+ 스트림 매니저 컴포넌트

**대상 아키텍처**

다음 다이어그램은 IoT 센서 데이터를 수집하고 해당 데이터를 S3 버킷에 저장하도록 설계된 아키텍처를 보여줍니다.

![\[아키텍처 다이어그램\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/b9032ae2-fffb-4750-b161-09810e19d878/images/8c28e639-5dcf-4950-b4a6-8015ec1a2894.png)


이 다이어그램은 다음 워크플로를 보여줍니다.

1. 여러 센서(예: 온도 및 밸브) 업데이트가 로컬 MQTT 브로커에 게시됩니다.

1. 이러한 센서를 구독하는 Parquet 파일 압축기는 주제를 업데이트하고 업데이트를 수신합니다.

1. Parquet 파일 압축기는 업데이트를 로컬에 저장합니다.

1. 기간이 경과하면 저장된 파일이 Parquet 파일로 압축되고 스트림 관리자로 전달되어 지정된 S3 버킷에 업로드됩니다.

1. 스트림 관리자는 ParQuet 파일을 S3 버킷에 업로드합니다.

**참고**  
스트림 관리자(`StreamManager`)는 관리되는 구성 요소입니다. Amazon S3로 데이터를 내보내는 방법에 대한 예는 AWS IoT Greengrass 설명서의 [스트림 관리자](https://docs.aws.amazon.com/greengrass/v2/developerguide/stream-manager-component.html)를 참조하세요. 로컬 MQTT 브로커를 구성 요소로 사용하거나 [Eclipse Mosquitto](https://mosquitto.org/)와 같은 다른 브로커로 사용할 수 있습니다.

## 도구
<a name="cost-effectively-ingest-iot-data-directly-into-amazon-s3-using-aws-iot-greengrass-tools"></a>

**AWS 도구**
+ [Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/what-is.html)는 표준 SQL을 사용하여 Amazon S3에 있는 데이터를 직접 분석할 수 있는 대화형 쿼리 서비스입니다.
+ [Amazon Simple Storage Service(S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)는 원하는 양의 데이터를 저장, 보호 및 검색할 수 있는 클라우드 기반 객체 스토리지 서비스입니다.
+ [AWS IoT Greengrass](https://docs.aws.amazon.com/greengrass/v2/developerguide/what-is-iot-greengrass.html)는 디바이스에서 IoT 애플리케이션을 구축, 배포 및 관리하는 데 도움이 되는 오픈 소스 IoT 엣지 런타임 및 클라우드 서비스입니다.

**기타 도구**
+ [Apache Parquet](https://parquet.apache.org/)는 스토리지 및 검색을 위해 설계된 오픈 소스 열 지향 데이터 파일 형식입니다.
+ [MQTT](https://docs.aws.amazon.com/iot/latest/developerguide/mqtt.html)(메시지 큐잉 텔레메트리 전송)는 제약이 있는 디바이스용으로 설계된 경량 메시징 프로토콜입니다.

## 모범 사례
<a name="cost-effectively-ingest-iot-data-directly-into-amazon-s3-using-aws-iot-greengrass-best-practices"></a>

**업로드된 데이터에 적합한 파티션 형식 사용**

S3 버킷의 루트 접두사 이름(예: `"myAwesomeDataSet/"` 또는`"dataFromSource"`)에 대한 특정 요구 사항은 없지만 데이터 세트의 용도를 쉽게 이해할 수 있도록 의미 있는 파티션과 접두사를 사용하는 것이 좋습니다.

또한 쿼리가 데이터 세트에서 최적으로 실행되도록 Amazon S3에서 올바른 파티셔닝을 사용하는 것이 좋습니다. 다음 예제에서는 각 Athena 쿼리에서 스캔되는 데이터의 양이 최적화되도록 데이터를 HIVE 형식으로 분할합니다. 이렇게 하면 성능을 개선하고 비용을 절감할 수 있습니다.

`s3://<ingestionBucket>/<rootPrefix>/year=YY/month=MM/day=DD/HHMM_<suffix>.parquet`

## 에픽
<a name="cost-effectively-ingest-iot-data-directly-into-amazon-s3-using-aws-iot-greengrass-epics"></a>

### 환경을 설정합니다
<a name="set-up-your-environment"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| S3 버킷을 생성합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/cost-effectively-ingest-iot-data-directly-into-amazon-s3-using-aws-iot-greengrass.html) | 앱 개발자 | 
| S3 버킷에 IAM 권한을 부여합니다. | 이전에 생성한 S3 버킷 및 접두사에 대한 쓰기 액세스 권한을 사용자에게 부여하려면 AWS IoT Greengrass 역할에 다음 IAM 정책을 추가하세요.<pre>{<br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />        {<br />            "Sid": "S3DataUpload",<br />            "Effect": "Allow",<br />            "Action": [<br />                "s3:List*",<br />                "s3:Put*"<br />            ],<br />            "Resource": [<br />                "arn:aws:s3:::<ingestionBucket>",<br />                "arn:aws:s3:::<ingestionBucket>/<prefix>/*"<br />            ]<br />        }<br />    ]<br />}</pre>자세한 내용은 Aurora 설명서의 [Amazon S3 리소스에 액세스할 수 있는 IAM 정책 생성](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Integrating.Authorizing.IAM.S3CreatePolicy.html)을 참조하세요.다음으로 올바른 AWS [보안 주체](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-bucket-user-policy-specifying-principal-intro.html)로 쓰기 액세스를 허용하도록 S3 버킷의 리소스 정책(필요한 경우)을 업데이트하세요. | 앱 개발자 | 

### AWS IoT Greengrass 구성 요소 구축 및 배포
<a name="build-and-deploy-the-aws-iot-greengrass-component"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 구성 요소의 레시피를 업데이트합니다. | 다음 예제를 기반으로 [배포를 생성](https://docs.aws.amazon.com/greengrass/v2/developerguide/create-deployments.html)할 때 [구성 요소 구성을 업데이트](https://docs.aws.amazon.com/greengrass/v2/developerguide/update-component-configurations.html)합니다.<pre>{<br />  "region": "<region>",<br />  "parquet_period": <period>,<br />  "s3_bucket": "<s3Bucket>",<br />  "s3_key_prefix": "<s3prefix>"<br />}</pre>AWS 리전, 주기적 간격의 `<region>`, S3 버킷이 있는 `<period>`, 접두사가 있는 `<s3Bucket>`로 바꿉니다 `<s3prefix>`. | 앱 개발자 | 
| 구성 요소를 생성합니다. | 다음 중 하나를 수행하세요.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/cost-effectively-ingest-iot-data-directly-into-amazon-s3-using-aws-iot-greengrass.html) | 앱 개발자 | 
| MQTT 클라이언트를 업데이트합니다. | 구성 요소가 브로커에 로컬로 연결되므로 샘플 코드는 인증을 사용하지 않습니다. 시나리오가 다를 경우 필요에 따라 MQTT 클라이언트 섹션을 업데이트하세요. 또한 다음 사항을 수행하세요.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/cost-effectively-ingest-iot-data-directly-into-amazon-s3-using-aws-iot-greengrass.html) | 앱 개발자 | 

### AWS IoT Greengrass 버전 2 코어 디바이스에 구성 요소 추가
<a name="add-the-component-to-the-aws-iot-greengrass-version-2-core-device"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 코어 디바이스 배포를 업데이트합니다. | AWS IoT Greengrass 버전 2 코어 디바이스의 배포가 이미 있는 경우 [배포를 수정](https://docs.aws.amazon.com/greengrass/v2/developerguide/revise-deployments.html)하세요. 배포가 존재하지 않는 경우 [새 배포를 생성](https://docs.aws.amazon.com/greengrass/v2/developerguide/create-deployments.html)하세요.구성 요소에 올바른 이름을 지정하려면 다음을 기반으로 새 구성 요소(필요한 경우)에 대한 [로그 관리자 구성을 업데이트하세요](https://docs.aws.amazon.com/greengrass/v2/developerguide/log-manager-component.html).<pre>{<br />  "logsUploaderConfiguration": {<br />    "systemLogsConfiguration": {<br />    ...<br />    },<br />    "componentLogsConfigurationMap": {<br />      "<com.iot.ingest.parquet>": {<br />        "minimumLogLevel": "INFO",<br />        "diskSpaceLimit": "20",<br />        "diskSpaceLimitUnit": "MB",<br />        "deleteLogFileAfterCloudUpload": "false"<br />      }<br />      ...<br />    }<br />  },<br />  "periodicUploadIntervalSec": "300"<br />}</pre>마지막으로 AWS IoT Greengrass 코어 디바이스에 대한 배포 개정을 완료하세요. | 앱 개발자 | 

### S3 버킷으로의 데이터 모으기 검증
<a name="verify-data-ingestion-into-the-s3-bucket"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| AWS IoT Greengrass 볼륨에 대한 로그를 확인합니다. | 다음 사항을 확인합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/cost-effectively-ingest-iot-data-directly-into-amazon-s3-using-aws-iot-greengrass.html) | 앱 개발자 | 
| S3 버킷을 선택합니다. | 데이터가 S3 버킷에 업로드되고 있는지 검증합니다. 매 기간마다 업로드되는 파일을 확인할 수 있습니다.다음 섹션에서 데이터를 쿼리하여 데이터가 S3 버킷에 업로드되었는지 확인할 수도 있습니다. | 앱 개발자 | 

### Athena에서 쿼리 설정
<a name="set-up-querying-from-athena"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 데이터베이스 및 테이블을 생성합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/cost-effectively-ingest-iot-data-directly-into-amazon-s3-using-aws-iot-greengrass.html) | 앱 개발자 | 
| Athena에게 데이터에 대한 액세스 권한을 부여합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/cost-effectively-ingest-iot-data-directly-into-amazon-s3-using-aws-iot-greengrass.html) | 앱 개발자 | 

## 문제 해결
<a name="cost-effectively-ingest-iot-data-directly-into-amazon-s3-using-aws-iot-greengrass-troubleshooting"></a>


| 문제 | Solution | 
| --- | --- | 
| MQTT 클라이언트 연결 실패 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/cost-effectively-ingest-iot-data-directly-into-amazon-s3-using-aws-iot-greengrass.html) | 
| MQTT 클라이언트 구독 실패 | MQTT 브로커의 권한을 검증합니다. AWS의 MQTT 브로커가 있는 경우 [MQTT 3.1.1 브로커(Moquette)](https://docs.aws.amazon.com/greengrass/v2/developerguide/mqtt-broker-moquette-component.html) 및 [MQTT 5 브로커(EMQX)](https://docs.aws.amazon.com/greengrass/v2/developerguide/mqtt-broker-emqx-component.html)를 참조하세요. | 
| 파케이 파일은 생성되지 않습니다 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/cost-effectively-ingest-iot-data-directly-into-amazon-s3-using-aws-iot-greengrass.html) | 
| 객체가 S3 버킷에 업로드되지 않았습니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/cost-effectively-ingest-iot-data-directly-into-amazon-s3-using-aws-iot-greengrass.html) | 

## 관련 리소스
<a name="cost-effectively-ingest-iot-data-directly-into-amazon-s3-using-aws-iot-greengrass-resources"></a>
+ [데이터프레임(](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html)Pandas 설명서)
+ [Apache Parquet 설명서](https://parquet.apache.org/docs/)(Parquet 설명서)
+ [AWS IoT Greengrass 구성 요소 개발](https://docs.aws.amazon.com/greengrass/v2/developerguide/develop-greengrass-components.html)(AWS IoT Greengrass 개발자 가이드, 버전 2)
+ [AWS IoT Greengrass 구성 요소를 디바이스에 배포](https://docs.aws.amazon.com/greengrass/v2/developerguide/manage-deployments.html)(AWS IoT Greengrass 개발자 가이드, 버전 2)
+ [로컬 IoT 디바이스와 상호 작용](https://docs.aws.amazon.com/greengrass/v2/developerguide/interact-with-local-iot-devices.html)(AWS IoT Greengrass 개발자 가이드, 버전 2)
+ [MQTT 3.1.1 브로커(Moquette)](https://docs.aws.amazon.com/greengrass/v2/developerguide/mqtt-broker-moquette-component.html)(AWS IoT Greengrass 개발자 가이드, 버전 2)
+ [MQTT 5 브로커(EMQX)](https://docs.aws.amazon.com/greengrass/v2/developerguide/mqtt-broker-emqx-component.html)(AWS IoT Greengrass 개발자 가이드, 버전 2)

## 추가 정보
<a name="cost-effectively-ingest-iot-data-directly-into-amazon-s3-using-aws-iot-greengrass-additional"></a>

**비용 분석**

다음 비용 분석 시나리오는 이 패턴에서 다루는 데이터 모으기 접근 방식이 AWS 클라우드의 데이터 모으기 비용에 어떤 영향을 미칠 수 있는지를 보여줍니다. 이 시나리오의 요금 예시는 발행 시점의 가격을 기준으로 합니다. 요금은 변경될 수 있습니다. 또한 비용은 AWS 리전, AWS service quotas 및 클라우드 환경과 관련된 기타 요인에 따라 달라질 수 있습니다.

*입력 신호 세트*

이 분석에서는 다음과 같은 입력 신호 세트를 기반으로 IoT 수집 비용을 사용 가능한 다른 대안과 비교합니다.


| 
| 
| 신호 수 | 빈도 | 신호당 데이터 | 
| --- |--- |--- |
| 125 | 25Hz | 8 bytes | 

이 시나리오에서 시스템은 125개의 신호를 수신합니다. 각 신호는 8바이트이며 40밀리초(25Hz)마다 발생합니다. 이러한 신호는 개별적으로 제공되거나 공통 페이로드에 그룹화될 수 있습니다. 필요에 따라 이러한 신호를 분리하고 패킹할 수 있습니다. 지연 시간도 확인할 수 있습니다. 지연 시간은 데이터 수신, 누적 및 수집 기간으로 구성됩니다.

비교를 위해 이 시나리오의 수집 작업은 `us-east-1` AWS 리전을 기반으로 합니다. 비용 비교는 AWS 서비스에만 적용됩니다. 하드웨어 또는 연결과 같은 기타 비용은 분석에 포함되지 않습니다.

*비용 비교*

다음 표는 각 섭취 방법에 대한 월별 비용을 미국 달러(USD)로 보여줍니다.


| 
| 
| 방법 | 월별 비용 | 
| --- |--- |
| AWS IoT SiteWise*\$1* | 331.77 USD | 
| 데이터 처리 팩이 포함된 AWS IoT SiteWise Edge(모든 데이터를 엣지에 보관) | 200 USD | 
| 원시 데이터 액세스를 위한 AWS IoT Core 및 Amazon S3 규칙 | 84.54 USD | 
| 엣지에서의 파케이 파일 압축 및 Amazon S3에 업로드 | 0.5 USD | 

\$1Service Quotas를 준수하려면 데이터를 다운샘플링해야 합니다. 즉, 이 방법을 사용하면 데이터가 약간 손실될 수 있습니다.

*대체 방법*

이 섹션에서는 다음과 같은 대체 방법에 대한 해당 비용을 보여줍니다.
+ **AWS IoT SiteWise** - 각 신호는 개별 메시지로 업로드해야 합니다. 따라서 월별 총 메시지 수는 125×25×3600×24×30, 즉 월별 81억 개의 메시지입니다. 그러나 AWS IoT SiteWise는 속성당 초당 10개의 데이터 포인트만 처리할 수 있습니다. 데이터를 10Hz로 다운샘플링한다고 가정하면 월별 메시지 수는 125×10×3600×24×30, 즉 32억 4천만 개로 줄어듭니다. 측정값을 10개씩 그룹으로 묶는 퍼블리셔 구성 요소를 사용하면(메시지 백만 개당 1 USD) 월별 비용은 324 USD입니다. 각 메시지가 8바이트(1Kb/125)라고 가정하면 25.92Gb의 데이터 스토리지가 됩니다. 이로 인해 매월 7.77 USD의 월별 비용이 추가됩니다. 첫 달의 총 비용은 331.77 USD이며 매달 7.77 USD씩 증가합니다.
+ **엣지에서 완전히 처리된 모든 모델 및 신호(즉, 클라우드 통합 없음)를 포함하는 데이터 처리 팩이 포함된 AWS IoT SiteWise Edge** - 데이터 처리 팩을 대안으로 사용하여 비용을 절감하고 엣지에서 계산되는 모든 모델을 구성할 수 있습니다. 이는 실제 계산이 수행되지 않더라도 스토리지 및 시각화에만 사용할 수 있습니다. 이 경우 엣지 게이트웨이에 강력한 하드웨어를 사용해야 합니다. 매월 200 USD의 고정 비용이 부과됩니다.
+ **MQTT를 통한 AWS IoT Core로의 직접 수집 및 Amazon S3에 원시 데이터를 저장하는 IoT 규칙** - 모든 신호가 공통 페이로드에 게시된다고 가정하면 AWS IoT Core에 게시되는 총 메시지 수는 25×3600×24×30, 즉 매월 6,480만 개입니다. 메시지 백만 개당 1 USD로 계산하면 월별 비용은 64.8 USD입니다. 규칙 활성화 횟수 백만 회당 0.15 USD이고 메시지당 규칙 1개를 사용할 경우 월별 비용은 19.44 USD입니다. Amazon S3의 스토리지 GB당 0.023 USD의 비용이 발생하므로 매월 1.5 USD가 추가됩니다(새 데이터를 반영하기 위해 매월 증가). 첫 달의 총 비용은 84.54 USD이며 매달 1.5 USD씩 증가합니다.
+ **Parquet 파일의 엣지에서 데이터를 압축하여 Amazon S3에 업로드(제안된 방법**) - 압축률은 데이터 유형에 따라 다릅니다. MQTT에 대해 동일한 산업 데이터를 테스트한 결과, 한 달 동안의 총 출력 데이터는 1.2Gb입니다. 이 비용은 월 0.03 USD입니다. 다른 벤치마크에서 설명한 압축률(무작위 데이터 사용)은 66% 정도입니다(최악의 시나리오에 가까움). 총 데이터는 21Gb이고 비용은 월 0.5 USD입니다.

**파케이 파일 생성기**

다음 코드 예제는 Python으로 작성된 Parquet 파일 생성기의 구조를 보여줍니다. 코드 예제는 설명을 위한 용도로만 사용되며 사용자 환경에 붙여넣으면 작동하지 않습니다.

```
import queue
import paho.mqtt.client as mqtt
import pandas as pd

#queue for decoupling the MQTT thread
messageQueue = queue.Queue()
client = mqtt.Client()
streammanager = StreamManagerClient()

def feederListener(topic, message):
    payload = {
        "topic" : topic,
        "payload" : message,
    }
    messageQueue.put_nowait(payload)

def on_connect(client_instance, userdata, flags, rc):
    client.subscribe("#",qos=0)

def on_message(client, userdata, message):
    feederListener(topic=str(message.topic), message=str(message.payload.decode("utf-8")))


filename = "tempfile.parquet"
streamname = "mystream"
destination_bucket= "amzn-s3-demo-bucket"
keyname="mykey"
period= 60

client.on_connect = on_connect
client.on_message = on_message
streammanager.create_message_stream(
            MessageStreamDefinition(name=streamname, strategy_on_full=StrategyOnFull.OverwriteOldestData)
        )


while True:
   try:
       message = messageQueue.get(timeout=myArgs.mqtt_timeout)
   except (queue.Empty):
       logger.warning("MQTT message reception timed out")

   currentTimestamp = getCurrentTime()
   if currentTimestamp >= nextUploadTimestamp:
       df = pd.DataFrame.from_dict(accumulator)
       df.to_parquet(filename)
       s3_export_task_definition = S3ExportTaskDefinition(input_url=filename, bucket=destination_bucket, key=key_name)
       streammanager.append_message(streamname, Util.validate_and_serialize_to_json_bytes(s3_export_task_definition))
       accumulator = {}
       nextUploadTimestamp += period
   else:
        accumulator.append(message)
```

# Lambda 함수를 사용하여 임시 EMR 클러스터에서 Spark 작업 시작
<a name="launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function"></a>

*Dhrubajyoti Mukherjee, Amazon Web Services*

## 요약
<a name="launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function-summary"></a>

이 패턴은 Amazon EMR RunJobFlow API 작업을 사용하여, Lambda 함수에서 Spark 작업을 실행하는 임시 클러스터를 시작합니다. 임시 EMR 클러스터는 작업이 완료되거나 오류가 발생하는 즉시 종료되도록 설계되었습니다. 임시 클러스터는 계산 시간에만 실행되므로 비용을 절감할 수 있으며 클라우드 환경에서 확장성과 유연성을 제공합니다.

임시 EMR 클러스터는 Lambda 함수에서 Boto3 API와 Python 프로그래밍 언어를 사용하여 시작됩니다. Python으로 작성된 Lambda 함수는 필요할 때 클러스터를 시작하는 추가 유연성을 제공합니다.

샘플 배치 계산 및 출력을 시연하기 위해 이 패턴은 Lambda 함수의 EMR 클러스터에서 Spark 작업을 시작하고 가상 회사의 예제 판매 데이터에 대해 배치 계산을 실행합니다. Spark 작업의 출력은 Amazon Simple Storage Service(S3)에서 쉼표로 구분된 값(CSV) 파일입니다. 계산을 실행하기 위한 Virtual Private Cloud(VPC) 및 Identity and Access Management(IAM) 역할에 관한 입력 데이터 파일, Spark .jar 파일, 코드 스피넷, CloudFormation 템플릿이 첨부 파일로 제공됩니다.

## 사전 조건 및 제한 사항
<a name="launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function-prereqs"></a>

**사전 조건 **
+ 활성 상태의 AWS 계정

**제한 사항 **
+ 코드에서는 한 번에 하나의 Spark 작업만 시작할 수 있습니다. 

**제품 버전**
+ Amazon EMR 6.0.0에서 테스트됨

## 아키텍처
<a name="launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function-architecture"></a>

**대상 기술 스택  **
+ Amazon EMR 
+ AWS Lambda
+ Amazon S3
+ Apache Spark

**대상 아키텍처 **

![\[Lambda 대 Amazon EMR 그리고 Spark 대 Amazon S3\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/6c999fa7-9550-4929-a5c1-60394142175d/images/eb4fbb3f-2114-44d2-b9da-3fdcb9ca456e.png)


**자동화 및 규모 조정**

Spark-EMR 배치 계산을 자동화하려면 다음 옵션 중 하나를 사용할 수 있습니다.
+ Cron 스케줄에서 Lambda 함수를 시작할 수 있는 Amazon EventBridge 규칙을 구현합니다. 자세한 내용은 [자습서: EventBridge를 사용한 AWS Lambda 함수 예약](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-run-lambda-schedule.html)을 참조하십시오.
+ 파일 도착 시 Lambda 함수를 시작하도록 [Amazon S3 이벤트 알림](https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html)을 구성합니다.
+ 이벤트 본문과 Lambda 환경 변수를 통해 입력 파라미터를 AWS Lambda 함수로 전달합니다.

## 도구
<a name="launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function-tools"></a>

**서비스**
+ [Amazon EMR](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-what-is-emr.html) 은 AWS에서 빅 데이터 프레임워크 실행을 간소화하여 방대한 양의 데이터를 처리하고 분석하는 관리형 클러스터 플랫폼입니다.
+ [Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행할 수 있도록 도와주는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.
+ [Amazon Simple Storage Service(S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)는 원하는 양의 데이터를 저장, 보호 및 검색하는 데 도움이 되는 클라우드 기반 객체 스토리지 서비스입니다.

**기타 도구**
+ [Apache Spark](https://spark.apache.org/docs/latest/)는 대규모 데이터 처리를 위한 다중 언어 분석 엔진입니다.

## 에픽
<a name="launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function-epics"></a>

### Amazon EMR 및 Lambda IAM 역할과 VPC 생성
<a name="create-the-amazon-emr-and-lambda-iam-roles-and-the-vpc"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| IAM 역할과 VPC를 생성합니다. | 이미 AWS Lambda 및 Amazon EMR IAM 역할과 VPC가 있는 경우 이 단계를 건너뛸 수 있습니다. 코드를 실행하려면 EMR 클러스터와 Lambda 함수 모두에 IAM 역할이 필요합니다. 또한 EMR 클러스터에는 NAT 게이트웨이와 함께 퍼블릭 서브넷이나 프라이빗 서브넷이 있는 VPC도 필요합니다. 모든 IAM 역할과 VPC를 자동으로 생성하려면 연결된 AWS CloudFormation 템플릿을 그대로 배포하거나 *추가 정보* 섹션에 지정된 대로 역할과 VPC를 수동으로 생성할 수 있습니다. | 클라우드 아키텍트 | 
| AWS CloudFormation 템플릿 출력 키를 유념합니다. | AWS CloudFormation 템플릿을 성공적으로 배포한 후 CloudFormation 콘솔의 **출력** 탭으로 이동합니다. 다섯 가지 출력 키를 유념합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function.html)Lambda 함수를 생성할 때 이러한 키의 값을 사용합니다. | 클라우드 아키텍트 | 

### Spark .jar 파일 업로드
<a name="upload-the-spark-jar-file"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Spark .jar 파일을 업로드합니다. | Spark .jar 파일을 AWS CloudFormation 스택이 생성한 S3 버킷에 업로드합니다. 버킷 이름은 `S3Bucket` 출력 키와 동일합니다. | 일반 AWS | 

### Lambda 함수를 생성하여 EMR 클러스터를 시작합니다.
<a name="create-the-lambda-function-to-launch-the-emr-cluster"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Lambda 함수를 생성합니다. | Lambda 콘솔에서 실행 역할을 가진 Python 3.9\$1 Lambda 함수를 생성합니다. 실행 역할 정책은 Lambda가 EMR 클러스터를 시작할 수 있도록 허용해야 합니다. (연결된 AWS CloudFormation 템플릿을 참조하십시오.) | 데이터 엔지니어, 클라우드 엔지니어 | 
| 코드를 복사하여 붙여넣습니다. | `lambda_function.py` 파일의 코드를 이 패턴의 *추가 정보* 섹션에 나와 있는 코드로 바꿉니다. | 데이터 엔지니어, 클라우드 엔지니어 | 
| 코드의 파라미터를 변경합니다. | 코드의 설명에 따라 파라미터 값을 AWS 계정에 맞게 변경합니다. | 데이터 엔지니어, 클라우드 엔지니어 | 
| 클러스터를 시작하는 함수를 실행합니다. | 제공된 Spark .jar 파일을 사용하여 임시 EMR 클러스터 생성을 시작하는 함수를 실행합니다. 작업이 완료되면 Spark 작업과 템플릿이 자동으로 실행됩니다. | 데이터 엔지니어, 클라우드 엔지니어 | 
| EMR 클러스터 상태를 확인합니다. | EMR 클러스터가 시작되면 Amazon EMR 콘솔의 **클러스터** 탭에 나타납니다. 클러스터를 시작하거나 작업을 실행하는 동안 발생하는 모든 오류를 적절히 확인할 수 있습니다. | 데이터 엔지니어, 클라우드 엔지니어 | 

### 샘플 데모 설정 및 실행
<a name="set-up-and-run-the-sample-demo"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Spark .jar 파일을 업로드합니다. | *첨부 파일* 섹션에서 Spark .jar 파일을 다운로드하여 S3 버킷에 업로드합니다. | 데이터 엔지니어, 클라우드 엔지니어 | 
| 입력 데이터를 업로드합니다. | 첨부된 `fake_sales_data.csv` 파일을 S3 버킷에 업로드합니다. | 데이터 엔지니어, 클라우드 엔지니어 | 
| Lambda 코드를 붙여넣고 파라미터를 변경합니다. | **도구** 섹션에서 코드를 복사하고 Lambda 함수에 코드를 붙여넣어 코드 `lambda_function.py` 파일을 바꿉니다. 계정에 맞게 파라미터 값을 변경합니다. | 데이터 엔지니어, 클라우드 엔지니어 | 
| 함수를 시작하고 출력을 확인합니다. | Lambda 함수는 제공된 Spark 작업으로 클러스터를 시작한 후 S3 버킷에 .csv 파일을 생성합니다. | 데이터 엔지니어, 클라우드 엔지니어 | 

## 관련 리소스
<a name="launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function-resources"></a>
+ [Building Spark](https://spark.apache.org/docs/latest/building-spark.html)
+ [Apache Spark 및 Amazon EMR](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark.html)
+ [Boto3 Docs run\$1job\$1flow 설명서](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/emr.html#EMR.Client.run_job_flow)
+ [Apache Spark 정보 및 설명서](https://spark.apache.org/)

## 추가 정보
<a name="launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function-additional"></a>

**코드**

```
"""
Copy paste the following code in your Lambda function. Make sure to change the following key parameters for the API as per your account

-Name (Name of Spark cluster)
-LogUri (S3 bucket to store EMR logs)
-Ec2SubnetId (The subnet to launch the cluster into)
-JobFlowRole (Service role for EC2)
-ServiceRole (Service role for Amazon EMR)

The following parameters are additional parameters for the Spark job itself. Change the bucket name and prefix for the Spark job (located at the bottom).

-s3://your-bucket-name/prefix/lambda-emr/SparkProfitCalc.jar (Spark jar file)
-s3://your-bucket-name/prefix/fake_sales_data.csv (Input data file in S3)
-s3://your-bucket-name/prefix/outputs/report_1/ (Output location in S3)
"""
import boto3

client = boto3.client('emr')


def lambda_handler(event, context):
    response = client.run_job_flow(
        Name='spark_job_cluster',
        LogUri='s3://your-bucket-name/prefix/logs',
        ReleaseLabel='emr-6.0.0',
        Instances={
            'MasterInstanceType': 'm5.xlarge',
            'SlaveInstanceType': 'm5.large',
            'InstanceCount': 1,
            'KeepJobFlowAliveWhenNoSteps': False,
            'TerminationProtected': False,
            'Ec2SubnetId': 'subnet-XXXXXXXXXXXXXX'
        },
        Applications=[{'Name': 'Spark'}],
        Configurations=[
            {'Classification': 'spark-hive-site',
             'Properties': {
                 'hive.metastore.client.factory.class': 'com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory'}
             }
        ],
        VisibleToAllUsers=True,
        JobFlowRole='EMRLambda-EMREC2InstanceProfile-XXXXXXXXX',
        ServiceRole='EMRLambda-EMRRole-XXXXXXXXX',
        Steps=[
            {
                'Name': 'flow-log-analysis',
                'ActionOnFailure': 'TERMINATE_CLUSTER',
                'HadoopJarStep': {
                    'Jar': 'command-runner.jar',
                    'Args': [
                        'spark-submit',
                        '--deploy-mode', 'cluster',
                        '--executor-memory', '6G',
                        '--num-executors', '1',
                        '--executor-cores', '2',
                        '--class', 'com.aws.emr.ProfitCalc',
                        's3://your-bucket-name/prefix/lambda-emr/SparkProfitCalc.jar',
                        's3://your-bucket-name/prefix/fake_sales_data.csv',
                        's3://your-bucket-name/prefix/outputs/report_1/'
                    ]
                }
            }
        ]
    )
```

**IAM 역할 및 VPC 생성**

Lambda 함수에서 EMR 클러스터를 시작하려면 VPC 및 IAM 역할이 필요합니다. 이 패턴의 첨부 파일 섹션에서 AWS CloudFormation 템플릿을 사용하여 VPC 및 IAM 역할을 설정하거나 다음 링크를 사용하여 수동으로 생성할 수 있습니다. 

Lambda 및 Amazon EMR을 실행하려면 다음과 같은 IAM 역할이 필요합니다. 

*Lambda 실행 역할*

Lambda 함수의 [실행 역할](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)은 AWS 서비스 및 리소스에 대한 액세스 권한을 부여합니다.

*Amazon EMR의 서비스 역할*

[Amazon EMR 역할](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-iam-role.html)은 리소스를 프로비저닝하고 클러스터 내에서 실행 중인 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스의 맥락에서 수행되지 않는 서비스 수준 작업을 수행할 때 Amazon EMR에 대해 허용되는 작업을 정의합니다. 예를 들어, 서비스 역할은 클러스터를 시작할 때 EC2 인스턴스를 프로비저닝하는 데 사용됩니다.

*EC2 인스턴스의 서비스 역할*

[클러스터 EC2 인스턴스의 서비스 역할](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-iam-role-for-ec2.html)(Amazon EMR에 대한 EC2 인스턴스 프로파일이라고도 함)은 인스턴스를 시작할 때 Amazon EMR 클러스터의 모든 EC2 인스턴스에 할당되는 특별한 유형의 서비스 역할입니다. Apache Hadoop의 상단에서 실행되는 애플리케이션 프로세스는 다른 AWS 서비스와 상호 작용하기 위한 권한에 대해 이 역할을 맡습니다.

*VPC 및 서브넷 생성*

VPC 콘솔에서 [VPC](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-vpcs.html#create-vpc-and-other-resources)를 생성할 수 있습니다. 

## 첨부
<a name="attachments-6c999fa7-9550-4929-a5c1-60394142175d"></a>

이 문서와 관련된 추가 콘텐츠에 액세스하려면 [attachment.zip](samples/p-attach/6c999fa7-9550-4929-a5c1-60394142175d/attachments/attachment.zip) 파일의 압축을 풉니다.

# AWS Glue를 사용하여 Apache Cassandra 워크로드를 Amazon Keyspaces으로 마이그레이션
<a name="migrate-apache-cassandra-workloads-to-amazon-keyspaces-by-using-aws-glue"></a>

*Nikolai Kolesnikov, Karthiga Priya Chandran, Samir Patel, Amazon Web Services*

## 요약
<a name="migrate-apache-cassandra-workloads-to-amazon-keyspaces-by-using-aws-glue-summary"></a>

이 패턴은 AWS Glue에서 CQLReplicator를 사용하여 기존 Apache Cassandra 워크로드를 Amazon Keyspaces(Apache Cassandra용)로 마이그레이션하는 방법을 보여줍니다. AWS Glue에서 CQLReplicator를 사용하여 워크로드를 마이그레이션하는 데 따른 복제 지연을 몇 분으로 줄일 수 있습니다. 또한, Amazon Simple Storage Service(Amazon S3) 버킷을 사용하여 [Apache Parquet](https://parquet.apache.org/) 파일, 구성 파일, 스크립트 등 마이그레이션에 필요한 데이터를 저장하는 방법도 알아봅니다. 이 패턴은 Cassandra 워크로드가 가상 사설 클라우드(VPC)의 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에서 호스팅된다고 가정합니다.

## 사전 조건 및 제한 사항
<a name="migrate-apache-cassandra-workloads-to-amazon-keyspaces-by-using-aws-glue-prereqs"></a>

**사전 조건 **
+ 소스 테이블이 있는 Cassandra 클러스터
+ 워크로드 복제를 위한 Amazon Keyspace의 대상 테이블
+ 점진적 데이터 변경이 포함된 중간 Parquet 파일을 저장할 S3 버킷
+ 작업 구성 파일 및 스크립트를 저장할 S3 버킷

**제한 사항 **
+ AWS Glue의 CQLReplicator는 Cassandra 워크로드에 대해 데이터 프로세싱 장치(DPU)를 프로비저닝하는 데 시간이 걸립니다. Cassandra 클러스터와 Amazon Keyspaces의 대상 키스페이스 및 테이블 사이의 복제 지연은 단 몇 분 동안만 지속될 가능성이 높습니다.

## 아키텍처
<a name="migrate-apache-cassandra-workloads-to-amazon-keyspaces-by-using-aws-glue-architecture"></a>

**소스 기술 스택  **
+ Apache Cassandra
+ DataStax 서버
+ ScyllaDB

**대상 기술 스택  **
+ Amazon Keyspaces

**마이그레이션 아키텍처**

아래의 다이어그램은 Cassandra 클러스터가 EC2 인스턴스에 호스팅되고 세 개의 가용 영역에 분산되어 있는 예제 아키텍처를 보여줍니다. Cassandra 노드는 개인 서브넷에서 호스팅됩니다.

![\[AWS Glue가 노드 VPC에 연결되는 사용자 지정 서비스 역할, Amazon Keyspaces 및 Amazon S3.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/e08048da-8996-4f2c-b8ed-da49fe9e693b/images/76256ab3-a1e6-4c9e-9c40-dc78f51edf0f.png)


이 다이어그램은 다음 워크플로를 보여줍니다.

1. 사용자 지정 서비스 역할은 Amazon Keyspaces 및 S3 버킷에 대한 액세스를 제공합니다.

1. AWS Glue 작업은 S3 버킷의 작업 구성과 스크립트를 읽습니다.

1. AWS Glue 작업은 포트 9042를 통해 연결되어 Cassandra 클러스터에서 데이터를 읽습니다.

1. AWS Glue 작업은 포트 9142를 통해 연결하여 Amazon Keyspaces에 데이터를 씁니다.

## 도구
<a name="migrate-apache-cassandra-workloads-to-amazon-keyspaces-by-using-aws-glue-tools"></a>

**AWS 서비스 및 도구**
+ [AWS Command Line Interface(AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)는 명령줄 쉘에서 명령을 사용하여 AWS 서비스와 상호 작용할 수 있는 오픈 소스 도구입니다.
+ [AWS CloudShell](https://docs.aws.amazon.com/cloudshell/latest/userguide/welcome.html)은 AWS Command Line Interface(AWS CLI) 및 사전 설치된 다양한 개발 도구를 사용하여 AWS 서비스를 관리하는 데 사용할 수 있는 브라우저 기반 쉘입니다.
+ [AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/what-is-glue.html)는 데이터 스토어와 데이터 스트림 간에 데이터를 안정적으로 분류, 정리, 보강, 이동할 수 있는 완전 관리형 ETL 서비스입니다.
+ [Amazon Keyspaces(Apache Cassandra용)](https://docs.aws.amazon.com/keyspaces/latest/devguide/what-is-keyspaces.html)는 AWS 클라우드에서 Cassandra 워크로드를 마이그레이션, 실행, 확장할 수 있도록 지원하는 관리형 데이터베이스 서비스입니다.

**코드**

이 패턴의 코드는 GitHub [CQLReplicator](https://github.com/aws-samples/cql-replicator/tree/main/glue) 리포지토리에서 확인할 수 있습니다.

## 모범 사례
<a name="migrate-apache-cassandra-workloads-to-amazon-keyspaces-by-using-aws-glue-best-practices"></a>
+ 마이그레이션에 필요한 AWS Glue 리소스를 확인하려면 소스 Cassandra 테이블의 행 수를 추정합니다. 예를 들어 84GB 디스크가 있는 0.25 DPU당 250K 행(vCPUs, 메모리 4GB).
+ CQLReplicator를 실행하기 전에 Amazon Keyspaces 테이블을 사전 워밍합니다. 예를 들어 8개의 CQLReplicator 타일(AWS Glue 작업)은 초당 최대 22K WCUs를 쓸 수 있으므로 대상은 초당 최대 25\$130K WCUs까지 사전 워밍되어야 합니다.
+ AWS Glue 구성 요소 간에 통신하려면 보안 그룹의 모든 TCP 포트에 자기 참조 인바운드 규칙을 사용합니다.
+ 증분 트래픽 전략을 사용하여 시간이 지남에 따라 마이그레이션 워크로드를 분산합니다.

## 에픽
<a name="migrate-apache-cassandra-workloads-to-amazon-keyspaces-by-using-aws-glue-epics"></a>

### CQLReplicator 배포
<a name="deploy-cqlreplicator"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 대상 키스페이스와 테이블을 생성합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/migrate-apache-cassandra-workloads-to-amazon-keyspaces-by-using-aws-glue.html) | 앱 소유자, AWS 관리자, DBA, 앱 개발자 | 
| Cassandra에 연결하도록 Cassandra 드라이버를 구성합니다. | 다음 구성 스크립트를 사용합니다.<pre>Datastax-java-driver {<br />  basic.request.consistency = "LOCAL_QUORUM"<br />  basic.contact-points = ["127.0.0.1:9042"]<br />   advanced.reconnect-on-init = true<br />   basic.load-balancing-policy {<br />        local-datacenter = "datacenter1"<br />}<br />advanced.auth-provider = {<br />       class = PlainTextAuthProvider<br />       username = "user-at-sample"<br />       password = "S@MPLE=PASSWORD="<br />}<br />}</pre>위 스크립트는 Spark Cassandra Connector를 사용합니다. 자세한 내용은 [Cassandra](https://docs.datastax.com/en/developer/java-driver/4.17/manual/core/configuration/reference/)에 대한 참조 구성을 참조하세요. | DBA | 
| Amazon Keyspaces에 연결하도록 Cassandra 드라이버를 구성합니다. | 다음과 같은 구성 스트립트를 사용합니다.<pre>datastax-java-driver {<br />basic {<br />  load-balancing-policy {<br />    local-datacenter = us-west-2<br />        }<br />  contact-points = [<br />            "cassandra.us-west-2.amazonaws.com:9142"<br />        ]<br />  request {<br />  page-size = 2500<br />  timeout = 360 seconds<br />  consistency = LOCAL_QUORUM<br />        }<br />    }<br />advanced {<br /> control-connection {<br />  timeout = 360 seconds<br />        }<br /> session-leak.threshold = 6<br /> connection {<br /> connect-timeout = 360 seconds<br /> init-query-timeout = 360 seconds<br /> warn-on-init-error = false<br />        }<br /> auth-provider = {<br />  class = software.aws.mcs.auth.SigV4AuthProvider<br />  aws-region = us-west-2<br /> }<br /><br /> ssl-engine-factory {<br />  class = DefaultSslEngineFactory<br />        }<br />    }<br />}</pre>위 스크립트는 Spark Cassandra Connector를 사용합니다. 자세한 내용은 [Cassandra](https://docs.datastax.com/en/developer/java-driver/4.17/manual/core/configuration/reference/)에 대한 참조 구성을 참조하세요. | DBA | 
| AWS Glue 작업에 대한 IAM 역할을 생성합니다. | AWS Glue를 신뢰할 수 있는 엔터티로 사용하여 `glue-cassandra-migration`라는 새 AWS 서비스 역할을 생성합니다.는 S3 버킷 및 Amazon Keyspaces에 대한 읽기 및 쓰기 액세스 권한을 제공해야 `glue-cassandra-migration` 합니다. S3 버킷에는 .jar 파일, Amazon Keyspaces 및 Cassandra에 대한 구성 파일, 중간 Parquet 파일이 포함되어 있습니다. 예를 들어 , `AWSGlueServiceRole` `AmazonS3FullAccess`및 `AmazonKeyspacesFullAccess` 관리형 정책이 포함되어 있습니다. | DevOps | 
| AWS CloudShell에서 CQLReplicator를 다운로드합니다. | 다음 명령을 실행하여 프로젝트를 홈 폴더에 다운로드합니다.<pre>git clone https://github.com/aws-samples/cql-replicator.git<br />cd cql-replicator/glue<br /># Only for AWS CloudShell, the bc package includes bc and dc. Bc is an arbitrary precision numeric processing arithmetic language<br />sudo yum install bc -y</pre> |  | 
| 참조 구성 파일을 수정합니다. | 프로젝트 폴더의 `../glue/conf` 디렉터리에 `CassandraConnector.conf` 및 `KeyspacesConnector.conf`를 복사합니다. | DevOps | 
| 마이그레이션 프로세스를 시작합니다. | 다음 명령은 CQLReplicator 환경을 초기화합니다. 초기화에는 .jar 아티팩트를 복사하고 AWS Glue 커넥터, S3 버킷, AWS Glue 작업, `migration` 키스페이스 및 `ledger` 테이블을 생성하는 작업이 포함됩니다.<pre>cd cql-replicator/glue/bin<br />./cqlreplicator --state init --sg '"sg-1","sg-2"' \ <br />                --subnet "subnet-XXXXXXXXXXXX" \ <br />                --az us-west-2a --region us-west-2 \ <br />                --glue-iam-role glue-cassandra-migration \ <br />                --landing-zone s3://cql-replicator-1234567890-us-west-2<br /></pre>이 스크립트에는 다음 파라미터가 포함되어 있습니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/migrate-apache-cassandra-workloads-to-amazon-keyspaces-by-using-aws-glue.html) | DevOps | 
| 배포를 검증합니다. | 이전 명령을 실행한 후 AWS 계정에는 다음이 포함되어야 합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/migrate-apache-cassandra-workloads-to-amazon-keyspaces-by-using-aws-glue.html) | DevOps | 

### CQLReplicator 실행
<a name="run-cqlreplicator"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 마이그레이션 프로세스를 시작합니다. | AWS Glue에서 CQLReplicator를 작동하려면 `--state run` 명령을 사용한 다음 일련의 파라미터를 사용해야 합니다. 이러한 파라미터의 정확한 구성은 주로 고유한 마이그레이션 요구 사항에 따라 결정됩니다. 예를 들어 TTL(Time to Live) 값 및 업데이트를 복제하도록 선택하거나 1MB를 초과하는 객체를 Amazon S3로 오프로드하는 경우 이러한 설정이 달라질 수 있습니다.Cassandra 클러스터에서 Amazon Keyspaces로 워크로드를 복제하려면 다음 명령을 실행합니다.<pre>./cqlreplicator --state run --tiles 8  \<br />                --landing-zone s3://cql-replicator-1234567890-us-west-2 \ <br />                --region us-west-2 \                              <br />                --src-keyspace source_keyspace \ <br />                --src-table source_table \  <br />                --trg-keyspace taget_keyspace \<br />                --writetime-column column_name \<br />                --trg-table target_table --inc-traffic</pre>소스 키스페이스와 테이블은 Cassandra 클러스터`source_keyspace.source_table`에 있습니다. 대상 키스페이스과 테이블은 Amazon Keyspaces의 `target_keyspace.target_table`에 있습니다. 파라미터는 증분 트래픽이 많은 요청으로 Cassandra 클러스터 및 Amazon Keyspaces에 과부하를 가하는 것을 방지하는 `--inc-traffic` 데 도움이 됩니다.업데이트를 복제하려면 명령줄`--writetime-column regular_column_name`에를 추가합니다. 일반 열은 쓰기 타임스탬프의 소스로 사용됩니다. | DevOps | 

### 마이그레이션 프로세스 모니터링
<a name="monitor-the-migration-process"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 이전 마이그레이션 단계에서 마이그레이션된 Cassandra 행을 검증합니다. | 채우기 단계에서 복제된 행 수를 얻으려면 다음 명령을 실행합니다.<pre>./cqlreplicator --state stats \<br />                --landing-zone s3://cql-replicator-1234567890-us-west-2 \  <br />                --src-keyspace source_keyspace --src-table source_table --region us-west-2</pre> | DevOps | 

### 마이그레이션 프로세스 중지
<a name="stop-the-migration-process"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| `cqlreplicator` 명령 또는 AWS Glue 콘솔을 사용합니다. | 마이그레이션 프로세스를 정상적으로 중지하려면 다음 명령을 실행합니다.<pre>./cqlreplicator --state request-stop --tiles 8 \                         <br />                --landing-zone s3://cql-replicator-1234567890-us-west-2 \     <br />                --region us-west-2 \                     <br />                --src-keyspace source_keyspace --src-table source_table</pre>마이그레이션 프로세스를 즉시 중지하려면 AWS Glue 콘솔을 사용합니다. | DevOps | 

### 정리
<a name="clean-up"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 배포된 리소스를 삭제합니다. | 다음 명령은 AWS Glue 작업, 커넥터, S3 버킷 및 Keyspaces 테이블을 삭제합니다. `ledger` <pre>./cqlreplicator --state cleanup --landing-zone s3://cql-replicator-1234567890-us-west-2</pre> | DevOps | 

## 문제 해결
<a name="migrate-apache-cassandra-workloads-to-amazon-keyspaces-by-using-aws-glue-troubleshooting"></a>


| 문제 | Solution | 
| --- | --- | 
| AWS Glue 작업이 실패하여 메모리 부족(OOM) 오류를 반환했습니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/migrate-apache-cassandra-workloads-to-amazon-keyspaces-by-using-aws-glue.html) | 

## 관련 리소스
<a name="migrate-apache-cassandra-workloads-to-amazon-keyspaces-by-using-aws-glue-resources"></a>
+ [AWS Glue를 사용하는 CQLReplicator README.MD](https://github.com/aws-samples/cql-replicator/blob/main/glue/README.MD)
+ [AWS Glue 설명서](https://docs.aws.amazon.com/glue/latest/dg/what-is-glue.html)
+ [Amazon Keyspaces 설명서](https://docs.aws.amazon.com/keyspaces/latest/devguide/what-is-keyspaces.html)
+ [Apache Cassandra](https://cassandra.apache.org/_/index.html)

## 추가 정보
<a name="migrate-apache-cassandra-workloads-to-amazon-keyspaces-by-using-aws-glue-additional"></a>

**마이그레이션 고려 사항**

AWS Glue를 사용하여 Cassandra 워크로드를 Amazon Keyspace로 마이그레이션하는 동시에 마이그레이션 프로세스 중에 Cassandra 소스 데이터베이스가 완전히 기능하도록 유지할 수 있습니다. 복제가 완료되면 Cassandra 클러스터와 Amazon Keyspaces 간의 복제 지연 시간(몇 분 미만)을 최소화하면서 애플리케이션을 Amazon Keyspaces로 전환하도록 선택할 수 있습니다. 데이터 일관성을 유지하기 위해 유사한 파이프라인을 사용하여 Amazon Keyspaces에서 데이터를 Cassandra 클러스터로 다시 복제할 수도 있습니다.

**쓰기 단위 계산**

한 시간 동안 행 크기가 1KiB인 500,000,000을 쓰는 경우를 예로 들어 보겠습니다. 필요한 Amazon Keyspaces 쓰기 단위(WCU)의 총 수는 다음 계산을 기반으로 합니다.

`(number of rows/60 mins 60s) 1 WCU per row = (500,000,000/(60*60s) * 1 WCU) = 69,444 WCUs required`

초당 69,444WCU는 1시간 요금이지만, 오버헤드에 대비하여 약간의 여유를 추가할 수 있습니다.  예를 들어, `69,444 * 1.10 = 76,388 WCUs`는 오버헤드가 10% 입니다.

**CQL을 사용하여 키스페이스 생성**

CQL을 사용하여 키스페이스를 생성하려면 다음 명령을 실행합니다.

```
CREATE KEYSPACE target_keyspace WITH replication = {'class': 'SingleRegionStrategy'}
CREATE TABLE target_keyspace.target_table ( userid uuid, level text, gameid int, description text, nickname text, zip text, email text, updatetime text, PRIMARY KEY (userid, level, gameid) ) WITH default_time_to_live = 0 AND CUSTOM_PROPERTIES = {'capacity_mode':{ 'throughput_mode':'PROVISIONED', 'write_capacity_units':76388, 'read_capacity_units':3612 }} AND CLUSTERING ORDER BY (level ASC, gameid ASC)
```

# 온프레미스 서버에서 Oracle Business Intelligence 12c를 AWS 클라우드로 마이그레이션
<a name="migrate-oracle-business-intelligence-12c-to-the-aws-cloud-from-on-premises-servers"></a>

*Lanre (Lan-Ray) showunmi, Patrick Huang, Amazon Web Services*

## 요약
<a name="migrate-oracle-business-intelligence-12c-to-the-aws-cloud-from-on-premises-servers-summary"></a>

이 패턴은 AWS CloudFormation을 사용하여 [Oracle Business Intelligence Enterprise Edition 12c](https://www.oracle.com/business-analytics/business-intelligence/technologies/bi-enterprise-edition.html)를 온프레미스 서버에서 AWS 클라우드로 마이그레이션하는 방법을 보여줍니다. 또한 다른 AWS 서비스를 사용하여 고가용성, 보안, 유연성 및 동적 규모 조정 기능을 제공하는 Oracle BI 12c 구성 요소를 구현하는 방법도 설명합니다.

Oracle BI 12c를 AWS 클라우드로 마이그레이션하는 것과 관련된 모범 사례 목록은 이 패턴의 **추가 정보** 섹션을 참조하세요.

**참고**  
기존 Oracle BI 12c 데이터를 클라우드로 전송하기 전에 여러 테스트 마이그레이션을 실행하는 것이 가장 좋습니다. 이러한 테스트를 통해 마이그레이션 접근 방식을 미세 조정하고, 잠재적 문제를 식별 및 수정하고, 가동 중지 시간 요구 사항을 보다 정확하게 예측할 수 있습니다.

## 사전 조건 및 제한 사항
<a name="migrate-oracle-business-intelligence-12c-to-the-aws-cloud-from-on-premises-servers-prereqs"></a>

**사전 조건 **
+ 활성 상태의 AWS 계정
+ [AWS Virtual Private Network(AWS VPN)](https://aws.amazon.com/vpn/) 서비스 또는 [AWS Direct Connect](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html)를 통해 온프레미스 서버와 AWS 간의 네트워크 연결 보호
+ Oracle 운영 체제, Oracle BI 12c, Oracle Database, Oracle WebLogic Server, Oracle HTTP Server용 소프트웨어 라이선스

**제한 사항 **

스토리지 크기 제한에 대한 자세한 내용은 [Oracle용 Amazon Relational Database Service(Amazon RDS)](https://aws.amazon.com/rds/oracle/features/) 설명서를 참조하세요.

**제품 버전**
+ Oracle Business Intelligence Enterprise Edition 12c
+ Oracle WebLogic 서버 12c
+ Oracle HTTP Server 12c
+ Oracle Database 12c(또는 그 이상)
+ Oracle Java SE 8

## 아키텍처
<a name="migrate-oracle-business-intelligence-12c-to-the-aws-cloud-from-on-premises-servers-architecture"></a>

다음 다이어그램은 AWS 클라우드에서 Oracle BI 12c 구성 요소를 실행하기 위한 예제 아키텍처를 보여줍니다.

![\[AWS 클라우드에서 Oracle BI 12c 구성 요소를 실행하기 위한 예제 아키텍처를 보여주는 예입니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/8bb72df1-7546-4208-bc70-5789767e3600/images/aae8f8f3-8125-4868-a8e5-eac1cc42812f.png)


 

이 다이어그램은 다음 아키텍처를 보여줍니다.

1. Amazon Route 53은 도메인 이름 서비스(DNS) 구성을 제공합니다.

1. Elastic Load Balancing(ELB)은 네트워크 트래픽을 분산하여 여러 가용 영역에 걸쳐 Oracle BI 12c 구성 요소의 확장성과 가용성을 개선합니다.

1. Amazon Elastic Compute Cloud(Amazon EC2) Auto Scaling 그룹은 여러 가용 영역에 걸쳐 Oracle HTTP Server, Weblogic Admin 서버, 관리형 BI 서버를 호스팅합니다.

1. Oracle 데이터베이스용 Amazon Relational Database Service(Amazon RDS)는 여러 가용 영역에 걸쳐 BI Server 메타데이터를 저장합니다.

1. Amazon Elastic File System(Amazon EFS)은 공유 파일 스토리지의 모든 Oracle BI 12c 구성 요소에 탑재됩니다.

**기술 스택**
+ Amazon Elastic Block Store(Amazon EBS)
+ Amazon Elastic Compute Cloud(Amazon EC2)
+ Amazon Elastic File System(Amazon EFS)
+ Amazon RDS for Oracle
+ AWS Certificate Manager (ACM)
+ Elastic Load Balancing(ELB)
+ Oracle BI 12c
+ Oracle WebLogic 서버 12c
+ Oracle HTTP Server(OHS)

## 도구
<a name="migrate-oracle-business-intelligence-12c-to-the-aws-cloud-from-on-premises-servers-tools"></a>
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)을 사용하면 AWS 리소스를 설정하고, 빠르고 일관되게 프로비저닝하고, 전체 AWS 계정 및 리전에서 수명 주기 전반에 걸쳐 관리할 수 있습니다.
+ [AWS Certificate Manager(ACM)](https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html)는 AWS 웹사이트와 애플리케이션을 보호하는 퍼블릭 및 프라이빗 SSL/TLS X.509 인증서와 키를 만들고, 저장하고, 갱신하는 데 도움을 줍니다.
+ [AWS Database Migration Service(AWS DMS)](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html)를 사용하면 데이터 스토어를 AWS 클라우드로 마이그레이션하거나 클라우드와 온프레미스 설정 간에 데이터 스토어를 마이그레이션할 수 있습니다.
+ [Amazon Elastic Compute Cloud(Amazon EC2)](https://docs.aws.amazon.com/ec2/?id=docs_gateway)는 AWS 클라우드에서 규모를 조정할 수 있는 컴퓨팅 용량을 제공합니다. 필요한 만큼 가상 서버를 시작하고 빠르게 규모를 조정할 수 있습니다.
+ [Amazon EC2 Auto Scaling](https://aws.amazon.com/ec2/autoscaling/)을 사용하면 애플리케이션 가용성을 유지하고 정의된 조건에 따라 Amazon EC2 인스턴스를 자동으로 추가하거나 제거할 수 있습니다. 
+ [Amazon Elastic File System(Amazon EFS)](https://docs.aws.amazon.com/efs/latest/ug/whatisefs.html)은 AWS 클라우드에서 공유 파일 시스템을 생성하고 구성하는 데 도움이 됩니다.
+ [Elastic Load Balancing(ELB)](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html)은 들어오는 애플리케이션 또는 네트워크 트래픽을 여러 대상에 분산합니다. 예를 들어 하나 이상의 가용 영역에 있는 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스, 컨테이너, IP 주소 전반에 걸쳐 트래픽을 분산할 수 있습니다.
+ [Amazon Relational Database Service(Amazon RDS)](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html)는 AWS 클라우드에서 관계형 데이터베이스를 설정, 운영 및 조정하는 데 도움이 됩니다.
+ [Amazon Simple Storage Service(S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)는 원하는 양의 데이터를 저장, 보호 및 검색하는 데 도움이 되는 클라우드 기반 객체 스토리지 서비스입니다.
+ [Amazon Virtual Private Cloud(VPC)](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html)를 사용하면 사용자가 정의한 가상 네트워크로 AWS 리소스를 시작할 수 있습니다. 이 가상 네트워크는 사용자의 자체 데이터 센터에서 운영하는 기존 네트워크와 유사하며 AWS의 확장 가능한 인프라를 사용한다는 이점이 있습니다.
+ [Oracle Data Pump](https://docs.oracle.com/cd/B19306_01/server.102/b14215/dp_overview.htm)를 사용하면 한 데이터베이스에서 다른 데이터베이스로 데이터와 메타데이터를 빠른 속도로 이동할 수 있습니다.
+ [Oracle Fusion Middleware](https://www.oracle.com/middleware/technologies/business-intelligence-v12214-downloads.html)는 ID 관리, 협업 및 비즈니스 인텔리전스 보고를 위한 애플리케이션 개발 도구 및 통합 솔루션 제품군입니다.
+ [Oracle GoldenGate](https://www.oracle.com/integration/goldengate/#:~:text=OCI%20GoldenGate%20is%20a%20real,in%20the%20Oracle%20Cloud%20Infrastructure.)를 사용하면 Oracle Cloud Infrastructure에서 데이터 복제 및 스트리밍 데이터 처리 솔루션을 설계, 실행, 오케스트레이션 및 모니터링할 수 있습니다.
+ [Oracle WebLogic Scripting Tool(WLST)](https://docs.oracle.com/middleware/12213/cross/wlsttasks.htm)은 WebLogic 클러스터를 수평적으로 조정할 수 있는 명령줄 인터페이스를 제공합니다.

## 에픽
<a name="migrate-oracle-business-intelligence-12c-to-the-aws-cloud-from-on-premises-servers-epics"></a>

### 소스 환경 평가
<a name="assess-the-source-environment"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 소프트웨어 인벤토리 정보를 수집합니다. | 다음을 포함하여 각 소스 기술 스택의 소프트웨어 구성 요소에 대한 버전 및 패치 수준을 식별합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/migrate-oracle-business-intelligence-12c-to-the-aws-cloud-from-on-premises-servers.html) | 마이그레이션 아키텍트, 솔루션 아키텍트, 애플리케이션 소유자, Oracle BI 관리자 | 
| 컴퓨팅 및 스토리지 인벤토리 정보를 수집합니다. | 소스 환경에서 다음과 같은 현재 및 과거 사용률 지표를 검토합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/migrate-oracle-business-intelligence-12c-to-the-aws-cloud-from-on-premises-servers.html)과거 사용량 급증을 고려해야 합니다. | 마이그레이션 아키텍트, 솔루션 아키텍트, 애플리케이션 소유자, Oracle BI 관리자, 시스템 관리자 | 
| 소스 환경의 아키텍처 및 요구 사항에 대한 정보를 수집합니다. | 다음에 대한 지식을 포함하여 소스 환경의 아키텍처 및 요구 사항을 완전히 이해합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/migrate-oracle-business-intelligence-12c-to-the-aws-cloud-from-on-premises-servers.html) | 마이그레이션 아키텍트, 솔루션 아키텍트, 애플리케이션 소유자, Oracle BI 관리자 | 
| Java Database Connectivity(JDBC) 데이터 소스를 식별합니다. | 소스 환경의 JDBC 데이터 소스 및 사용하는 각 데이터베이스 엔진에 대한 드라이버 정보를 수집합니다. | 마이그레이션 아키텍트, 애플리케이션 소유자, Oracle BI 관리자, 데이터베이스 엔지니어 또는 관리자 | 
| 환경별 설정에 대한 정보를 수집합니다. | 다음을 포함하여 소스 환경과 관련된 설정 및 구성에 대한 정보를 수집합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/migrate-oracle-business-intelligence-12c-to-the-aws-cloud-from-on-premises-servers.html) | 마이그레이션 아키텍트, 솔루션 아키텍트, 애플리케이션 소유자, Oracle BI 관리자 | 
| 다른 애플리케이션에 대한 종속성을 식별합니다. | 다른 애플리케이션과의 종속성을 유발하는 소스 환경에서의 통합에 대한 정보를 수집합니다.경량 디렉터리 액세스 프로토콜(LDAP) 통합 및 기타 네트워킹 요구 사항을 반드시 확인합니다. | 마이그레이션 아키텍트, 솔루션 아키텍트, 애플리케이션 소유자, Oracle BI 관리자 | 

### 대상 환경 설계
<a name="design-your-target-environment"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 상위 수준 설계 문서를 작성합니다. | 대상 아키텍처 설계 문서를 작성합니다. 소스 환경을 평가할 때 수집한 정보를 설계 문서에 반영해야 합니다. | 솔루션스 아키텍트, 애플리케이션 아키텍트, 데이터베이스 엔지니어, 마이그레이션 아키텍트 | 
| 설계 문서에 대한 승인을 얻습니다. | 이해 관계자와 함께 설계 문서를 검토하고 필요한 승인을 받습니다. | 애플리케이션 또는 서비스 소유자, 솔루션 아키텍트, 애플리케이션 아키텍트 | 

### 인프라 배포
<a name="deploy-the-infrastructure"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| CloudFormation에서 인프라 코드를 준비합니다. | CloudFormation 템플릿을 생성하여 AWS 클라우드에서 Oracle BI 12c 인프라를 프로비저닝합니다.자세한 내용은 *AWS CloudFormation 사용 설명서*의 [AWS CloudFormation 템플릿 사용](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-guide.html)을 참조하세요.모든 리소스에 대해 하나의 큰 템플릿을 생성하는 대신 각 Oracle BI 12c 계층에 대해 모듈식 CloudFormation 템플릿을 생성하는 것이 가장 좋습니다. Cloudformation 모범 사례에 대한 자세한 내용은 AWS Blog에서 [AWS CloudFormation으로 배포를 자동화하는 8가지 모범 사례](https://aws.amazon.com/blogs/infrastructure-and-automation/best-practices-automating-deployments-with-aws-cloudformation/)를 참조하세요. | 클라우드 인프라 아키텍트, 솔루션 아키텍트, 애플리케이션 아키텍트 | 
| 필수 소프트웨어를 다운로드합니다. | [Oracle 웹사이트](https://www.oracle.com/)에서 필요한 버전 및 패치와 함께 다음 소프트웨어를 다운로드합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/migrate-oracle-business-intelligence-12c-to-the-aws-cloud-from-on-premises-servers.html) | 마이그레이션 아키텍트, 데이터베이스 엔지니어, 애플리케이션 아키텍트 | 
| 설치 스크립트를 준비합니다. | 자동 설치를 실행하는 소프트웨어 설치 스크립트를 생성합니다. 이 스크립트는 배포 자동화를 단순화합니다.자세한 내용은 Oracle Support 사이트에서 [OBIEE 12c: 자동 설치 수행 방법](https://support.oracle.com/knowledge/Enterprise%20Performance%20Management%20and%20Business%20Intelligence/2267490_1.html)을 참조하세요. 설명서를 보려면 Oracle Support 계정이 필요합니다. | 마이그레이션 아키텍트, 데이터베이스 엔지니어, 애플리케이션 아키텍트 | 
| 웹 및 애플리케이션 티어를 위한 Amazon EBS 기반 Linux AMI를 생성합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/migrate-oracle-business-intelligence-12c-to-the-aws-cloud-from-on-premises-servers.html) | 마이그레이션 아키텍트, 데이터베이스 엔지니어, 애플리케이션 아키텍트 | 
| CloudFormation을 사용하여 AWS 인프라를 시작합니다. | 생성한 CloudFormation 템플릿을 사용하여 Oracle BI 12c 웹 및 애플리케이션 티어를 모듈로 배포합니다.자세한 내용은 *AWS CloudFormation 사용 설명서*의 [AWS CloudFormation 시작하기](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/GettingStarted.html)를 참조하세요. | 클라우드 인프라 아키텍트, 솔루션 아키텍트, 애플리케이션 아키텍트 | 

### 새로운 설치로 Oracle BI 12c를 AWS로 마이그레이션하기
<a name="migrate-oracle-bi-12c-to-aws-by-using-a-fresh-installation"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 필수 소프트웨어를 스테이징합니다. | Amazon EC2 인스턴스에 액세스할 수 있는 위치에 필수 소프트웨어를 스테이징합니다. 예를 들어, Amazon S3 또는 웹 및 애플리케이션 서버에 액세스할 수 있는 다른 Amazon EC2 인스턴스에 소프트웨어를 스테이징합니다. | 마이그레이션 아키텍트, Oracle BI 아키텍트, 클라우드 인프라 아키텍트, 솔루션 아키텍트, 애플리케이션 아키텍트 | 
| Oracle BI 12c 설치를 위한 리포지토리 데이터베이스를 준비합니다. | [Amazon RDS for Oracle](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Oracle.html) 데이터베이스 인스턴스에 대해 [Oracle 리포지토리 생성 유틸리티(RCU)](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Oracle.Resources.RCU.html#Oracle.Resources.RCU.Installing)를 실행하여 Oracle BI 12c 스키마를 생성합니다. | 클라우드 인프라 아키텍트, 솔루션 아키텍트, 애플리케이션 아키텍트, 마이그레이션 아키텍트, Oracle BI 아키텍트 | 
| Oracle Fusion Middleware 12c 및 Oracle BI 12c를 설치합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/migrate-oracle-business-intelligence-12c-to-the-aws-cloud-from-on-premises-servers.html) | 마이그레이션 아키텍트, Oracle BI 아키텍트 | 
| Oracle BI 12c에 맞게 Oracle WebLogic 서버 도메인을 구성합니다. | Oracle BI 12c 도메인을 비클러스터형 배포로 구성합니다.자세한 내용은 *Oracle Business Intelligence용 Oracle Fusion Middleware Enterprise 배포 가이드*의 [BI 도메인 구성](https://docs.oracle.com/middleware/bi12214/lcm/BIEDG/GUID-FD80C4C4-A2E9-4190-8B6A-7AD659D8FBE2.htm#BIEDG-GUID-D4FC2F0A-88B0-453C-BF14-17D365018252)을 참조하세요. | 마이그레이션 아키텍트, Oracle BI 아키텍트 | 
| Oracle BI 12c에서 수평적 스케일 아웃을 수행합니다. | 단일 노드를 원하는 노드 수까지 수평으로 스케일 아웃합니다.자세한 내용은 *Oracle Business Intelligence용 Oracle Fusion Middleware Enterprise 배포 가이드*의 [Oracle Business Intelligence 스케일 아웃](https://docs.oracle.com/middleware/bi12214/lcm/BIEDG/GUID-B7BEA45C-A8C0-4591-B748-FC35C587DAE0.htm#BIEDG-GUID-B7BEA45C-A8C0-4591-B748-FC35C587DAE0)을 참조하세요. | 마이그레이션 아키텍트, Oracle BI 아키텍트 | 
| Oracle HTTP Server 12c를 설치합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/migrate-oracle-business-intelligence-12c-to-the-aws-cloud-from-on-premises-servers.html) | 마이그레이션 아키텍트, Oracle BI 아키텍트 | 
| SSL 종료를 위한 로드 밸런서를 구성합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/migrate-oracle-business-intelligence-12c-to-the-aws-cloud-from-on-premises-servers.html) | 클라우드 인프라 아키텍트, 마이그레이션 아키텍트 | 
| 비즈니스 인텔리전스 메타데이터 아티팩트를 AWS로 마이그레이션합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/migrate-oracle-business-intelligence-12c-to-the-aws-cloud-from-on-premises-servers.html) | 마이그레이션 아키텍트, Oracle BI 아키텍트 | 
| 마이그레이션 후 작업을 수행합니다. | BAR 파일을 가져온 후 다음을 수행합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/migrate-oracle-business-intelligence-12c-to-the-aws-cloud-from-on-premises-servers.html) | 마이그레이션 아키텍트, Oracle BI 아키텍트 | 

### 새 환경 테스트
<a name="test-the-new-environment"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 새로운 Oracle BI 12c 환경을 테스트합니다. | 새로운 Oracle BI 12c 환경에서 엔드 투 엔드 테스트를 수행합니다. 자동화를 최대한 많이 사용합니다.테스트 활동의 예는 다음과 같습니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/migrate-oracle-business-intelligence-12c-to-the-aws-cloud-from-on-premises-servers.html)필요에 따라 추가 테스트 및 검증을 수행합니다. | 마이그레이션 아키텍트, 솔루션 아키텍트, 애플리케이션 소유자, Oracle BI 관리자 | 

### 새 환경으로 전환
<a name="cut-over-to-the-new-environment"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 온프레미스 Oracle BI 12c 환경으로의 트래픽을 끊습니다. | 지정된 전환 기간에 온프레미스 Oracle BI 12c 환경으로 향하는 모든 트래픽을 중지합니다. | 마이그레이션 아키텍트, 솔루션 아키텍트, 애플리케이션 소유자, Oracle BI 관리자 | 
| 새 Oracle BI 12c 리포지토리 데이터베이스를 소스 데이터베이스와 재동기화합니다. | Amazon RDS Oracle Oracle BI 12c 리포지토리 데이터베이스를 온프레미스 데이터베이스와 재동기화합니다.데이터베이스를 동기화하려면 [Oracle Data Pump 새로 고침](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Oracle.Procedural.Importing.DataPump.html) 또는 [AWS DMS 변경 데이터 캡처(CDC)](https://aws.amazon.com/blogs/database/migrating-oracle-databases-with-near-zero-downtime-using-aws-dms/)를 사용할 수 있습니다. | Oracle BI 관리자, 데이터베이스 엔지니어 및 관리자 | 
| 새로운 AWS 환경을 가리키도록 Oracle BI 12c URL을 전환합니다. | 새로운 AWS 설치를 가리키도록 내부 DNS 서버의 Oracle BI 12c URL을 업데이트합니다. | 마이그레이션 아키텍트, 솔루션 아키텍트, 애플리케이션 소유자, Oracle BI 관리자 | 
| 새 환경을 모니터링합니다. | 다음 도구 중 하나를 사용하여 새로운 Oracle BI 12c 환경을 모니터링합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/migrate-oracle-business-intelligence-12c-to-the-aws-cloud-from-on-premises-servers.html) | Oracle BI 관리자, 데이터베이스 엔지니어 및 관리자, 애플리케이션 관리자 | 
| 프로젝트를 승인 받습니다. | 이해 관계자와 함께 테스트 결과를 검토하고 마이그레이션을 마무리하는 데 필요한 승인을 받습니다. | 애플리케이션 소유자, 서비스 소유자, 클라우드 인프라 아키텍트, 마이그레이션 아키텍트, Oracle BI 아키텍트 | 

## 관련 리소스
<a name="migrate-oracle-business-intelligence-12c-to-the-aws-cloud-from-on-premises-servers-resources"></a>
+ [Oracle용 RDS에서 Oracle 리포지토리 생성 유틸리티 사용](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Oracle.Resources.RCU.html)(*Amazon RDS 사용 설명서*)
+ [Amazon RDS 기반 Oracle](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Oracle.html)(*Amazon RDS 사용 설명서*)
+ [AWS 기반 Oracle WebLogic 서버 12c](https://d1.awsstatic.com/whitepapers/Oracle-WebLogic-12c-on-AWS.pdf)(AWS 백서)
+ [고가용성을 위한 Oracle Business Intelligence 배포](https://docs.oracle.com/middleware/1221/biee/BIESG/highavail.htm#BIESG1584)(Oracle 도움말 센터)
+ [Oracle Business Intelligence 애플리케이션 아카이브(BAR) 파일](https://docs.oracle.com/middleware/bi12214/biee/BIESG/GUID-7FCD90A3-E005-49BF-902F-30FBF9B41B07.htm#BIESG2889)(Oracle 도움말 센터)
+ [환경 간에 OBI 12c를 마이그레이션하는 방법](https://support.oracle.com/knowledge/Enterprise%20Performance%20Management%20and%20Business%20Intelligence/2203360_1.html)(Oracle Support) 

## 추가 정보
<a name="migrate-oracle-business-intelligence-12c-to-the-aws-cloud-from-on-premises-servers-additional"></a>

다음은 Oracle BI 12c를 AWS 클라우드로 마이그레이션하는 것과 관련된 모범 사례 목록입니다.

**리포지토리 데이터베이스**

Oracle BI 12c 데이터베이스 스키마를 Amazon RDS for Oracle 인스턴스에서 호스팅하는 것이 가장 좋습니다. 이 인스턴스 유형은 하드웨어 프로비저닝, 데이터베이스 설정, 패치 및 백업과 같은 관리 작업을 자동화하는 동시에 비용 효율적이고 크기 조정 가능한 용량을 제공합니다.

자세한 내용은 *Amazon RDS 사용 설명서*의 [Oracle용 RDS에서 Oracle 리포지토리 생성 유틸리티 사용](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Oracle.Resources.RCU.html)을 참조하세요.

**웹 및 애플리케이션 티어**

[메모리 최적화 Amazon EC2 인스턴스](https://aws.amazon.com/ec2/instance-types/)는 대개 Oracle BI 12c 서버에 적합합니다. 어떤 인스턴스 유형을 선택하든 프로비저닝하는 인스턴스가 시스템의 메모리 사용 요구 사항을 충족하는지 확인합니다. 또한 Amazon EC2 인스턴스의 사용 가능한 메모리를 기반으로 [충분한 WebLogic Java 가상 머신(JVM) 힙 크기를 구성](https://docs.oracle.com/cd/E49933_01/server.770/es_install/src/tins_postinstall_jvm_heap.html#:~:text=The%20default%20JVM%20heap%20size%20for%20WebLogic%20is%203GB.,file%20for%20Linux%20or%20setDomainEnv.)해야 합니다.

**로컬 스토리지**

I/O는 Oracle BI 12c 애플리케이션의 전체 성능에서 중요한 역할을 합니다. Amazon Elastic Block Store(Amazon EBS)는 다양한 워크로드 패턴에 최적화된 다양한 스토리지 클래스를 제공합니다. 사용 사례에 맞는 Amazon EBS 볼륨 유형을 선택해야 합니다.

자세한 내용은 Amazon EBS 설명서의 [Amazon EBS 기능](https://aws.amazon.com/ebs/features/)을 참조하세요.

**공유 스토리지**

클러스터링된 Oracle BI 12c 도메인에는 다음 리소스에 대한 공유 스토리지가 필요합니다.
+ 구성 파일
+ Oracle BI 12c 싱글톤 데이터 디렉터리(SDD)
+ Oracle 글로벌 캐시
+ Oracle BI 스케줄러 스크립트
+ Oracle WebLogic 서버 바이너리

확장 가능한 완전 관리형 탄력적 네트워크 파일 시스템(NFS)을 제공하는 [Amazon EFS](https://aws.amazon.com/efs/)를 사용하면 이러한 공유 스토리지 요구 사항을 충족할 수 있습니다.

*공유 스토리지 성능 미세 조정*

Amazon EFS에는 **프로비저닝**과 **버스팅**이라는 두 가지 [처리량 모드](https://docs.aws.amazon.com/efs/latest/ug/performance.html#throughput-modes)가 있습니다. 또한 이 서비스에는 **범용** 및 **최대 I/O**라는 두 가지 [성능 모드](https://docs.aws.amazon.com/efs/latest/ug/performance.html#performancemodes)가 있습니다.

성능을 미세 조정하려면 먼저 **범용** 성능 모드와 **프로비저닝** 처리량 모드에서 워크로드를 테스트합니다. 이러한 테스트를 수행하면 해당 기본 모드가 원하는 서비스 수준을 충족하기에 충분한지 판단하는 데 도움이 됩니다.

자세한 내용은 *Amazon EFS 사용 설명서*의 [Amazon EFS 성능](https://docs.aws.amazon.com/efs/latest/ug/performance.html)을 참조하세요.

**가용성 및 재해 복구**

가용 영역 장애 발생 시 리소스를 보호하기 위해서 여러 가용 영역에 걸쳐 Oracle BI 12c 구성 요소를 배포하는 것이 가장 좋습니다. 다음은 AWS 클라우드에서 호스팅되는 특정 Oracle BI 12c 리소스의 가용성 및 재해 복구 모범 사례 목록입니다.
+ **Oracle BI 12c 리포지토리 데이터베이스**: 다중 AZ Amazon RDS 데이터베이스 인스턴스를 Oracle BI 12 리포지토리 데이터베이스에 배포합니다. 다중 AZ 배포에서 Amazon RDS는 자동으로 서로 다른 AZ에 동기식 예비 복제본을 프로비저닝하고 유지합니다. Oracle BI 12c 리포지토리 데이터베이스를 여러 가용 영역에 걸쳐 실행하면 계획된 시스템 유지 관리 중 가용성을 향상시킬 수 있으며, 인스턴스 및 가용 영역 중단으로부터 데이터베이스를 보호할 수 있습니다.
+ **Oracle BI 12c 관리 대상 서버**: 내결함성을 확보하려면 여러 가용 영역에 걸쳐 구성된 Amazon EC2 Auto Scaling 그룹의 관리 대상 서버에 Oracle BI 12c 시스템 구성 요소를 배포하는 것이 가장 좋습니다. Auto Scaling은 [Amazon EC2 상태 확인](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-health-checks.html)을 기반으로 결함이 있는 인스턴스를 대체합니다. 가용 영역에 장애가 발생하는 경우 Oracle HTTP Server는 계속해서 작동하는 가용 영역의 관리 대상 서버로 트래픽을 전달합니다. 그런 다음 Auto Scaling에서 호스트 수 요구 사항을 충족하기 위해 인스턴스를 시작합니다. 기존 세션이 정상적으로 작동하는 관리 대상 서버로 원활하게 장애 조치되도록 하려면 HTTP 세션 상태 복제를 활성화하는 것이 좋습니다.
+ **Oracle BI 12c 관리 서버:** 관리 서버의 가용성을 높을 수준으로 유지하려면 여러 가용 영역에 걸쳐 있도록 구성된 Amazon EC2 Auto Scaling 그룹에서 관리 서버를 호스팅합니다. 그런 다음, 그룹의 최소 및 최대 크기를 **1**로 설정합니다. 가용 영역에 장애가 발생하는 경우 Amazon EC2 Auto Scaling은 대체 가용 영역에서 대체 관리 서버를 시작합니다. 동일한 가용 영역 내에서 장애가 발생한 기본 호스트를 복구하려면 [Amazon EC2 Auto Recovery](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-recover.html)를 활성화합니다.
+ **Oracle 웹 티어 서버:** Oracle HTTP Server를 Oracle WebLogic Server 도메인과 연결하는 것이 가장 좋습니다. 고가용성을 위해 Oracle HTTP Server를 여러 가용 영역을 포함하도록 구성된 Amazon EC2 Auto Scaling 그룹에 배포합니다. 그런 다음 서버를 탄력적 로드 밸런서(ELB) 뒤에 배치합니다. 호스트 장애에 대한 추가 보호를 제공하려면 Amazon EC2 Auto Recovery를 활성화합니다.

**확장성**

AWS 클라우드의 탄력성은 워크로드 요구 사항에 따라 애플리케이션을 수평 또는 수직으로 확장할 수 있도록 도와줍니다.

*수직 크기 조정*

애플리케이션을 수직으로 확장하려면 Oracle BI 12c 구성 요소를 실행하는 Amazon EC2 인스턴스의 크기와 유형을 변경합니다. 배포 초기에 인스턴스를 오버프로비저닝하여 불필요한 비용을 발생시킬 필요가 없습니다. 

*수평 크기 조정*

Amazon EC2 Auto Scaling을 사용하면 워크로드 요구 사항에 따라 관리 대상 서버를 자동으로 추가 또는 제거하여 애플리케이션을 수평적으로 확장할 수 있습니다.

**참고**  
Amazon EC2 Auto Scaling을 사용한 수평적 규모 조정을 구현하려면 스크립팅 기술과 철저한 테스트를 실행해야 합니다.

**백업 및 복구**

다음은 AWS 클라우드에서 호스팅되는 특정 Oracle BI 12c 리소스에 대한 백업 및 복구 모범 사례 목록입니다.
+ **Oracle Business Intelligence 메타데이터 리포지토리:** Amazon RDS는 데이터베이스 인스턴스의 백업을 자동으로 생성하고 저장합니다. 이러한 백업은 지정된 기간 동안 보존됩니다. 데이터 보호 요구 사항에 따라 Amazon RDS 백업 기간 및 보존 설정을 구성해야 합니다. 자세한 내용은 [Amazon RDS 백업 및 복원](https://aws.amazon.com/rds/features/backup/)을 참조하세요.
+ **관리 대상 서버, 관리 서버 및 웹 티어 서버:** 데이터 보호 및 보존 요구 사항에 따라 [Amazon EBS 스냅샷](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSSnapshots.html)을 구성해야 합니다.
+ **공유 스토리지:** [AWS Backup](https://docs.aws.amazon.com/efs/latest/ug/awsbackup.html)을 사용하여 Amazon EFS에 저장된 파일의 백업 및 복구를 관리할 수 있습니다. 또한 AWS Backup 서비스를 배포하여 Amazon EC2, Amazon EBS 및 Amazon RDS를 비롯한 다른 서비스의 백업 및 복구를 중앙에서 관리할 수 있습니다. 자세한 내용은 [AWS Backup이란?](https://docs.aws.amazon.com/aws-backup/latest/devguide/whatisbackup.html)을 *AWS Backup 개발자 가이드*에서.

**보안 및 규정 준수**

다음은 AWS 클라우드에서 Oracle BI 12c 애플리케이션을 보호하는 데 도움이 되는 보안 모범 사례 및 AWS 서비스 목록입니다.
+ **저장 중 암호화:** Amazon RDS, Amazon EFS 및 Amazon EBS는 모두 업계 표준 암호화 알고리즘을 지원합니다. [AWS Key Management Service(AWS KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)를 사용하여 암호화 키를 생성 및 관리하고, AWS 서비스 및 애플리케이션 전반에서 암호화 키 사용을 제어할 수 있습니다. 또한 Oracle BI 12c 리포지토리 데이터베이스를 호스팅하는 Amazon RDS for Oracle 데이터베이스 인스턴스에서 [Oracle 투명 데이터 암호화(TDE)](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.Oracle.Options.AdvSecurity.html)를 구성할 수 있습니다.
+ **전송 중 암호화:** SSL 또는 TLS 프로토콜을 활성화하여 Oracle BI 12c 설치의 다양한 계층 간에 전송되는 데이터를 보호하는 것이 가장 좋습니다. [AWS Certificate Manager(ACM)](https://aws.amazon.com/certificate-manager/)를 사용하여 Oracle BI 12c 리소스를 위한 퍼블릭 및 프라이빗 SSL 및 TLS 인증서를 프로비저닝, 관리, 배포할 수 있습니다.
+ **네트워크 보안**: 사용 사례에 맞게 적절한 액세스 제어가 구성된 Amazon VPC에 Oracle BI 12c 리소스를 배포해야 합니다. 설치를 실행하는 Amazon EC2 인스턴스의 인바운드 및 아웃바운드 트래픽을 필터링하도록 보안 그룹을 구성합니다. 또한 정의된 규칙에 따라 트래픽을 허용하거나 거부하는 [네트워크 액세스 제어 목록(NACL)](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html)을 구성해야 합니다.
+ **모니터링 및 로깅**: [AWS CloudTrail](https://aws.amazon.com/cloudtrail/)을 사용하여 Oracle BI 12c 리소스를 포함한 AWS 인프라에 대한 API 호출을 추적할 수 있습니다. 이 기능은 인프라 변경 사항을 추적하거나 보안 분석을 수행할 때 유용합니다. 또한 [Amazon CloudWatch](https://aws.amazon.com/cloudwatch/)를 사용하여 Oracle BI 12c 애플리케이션의 성능 및 상태에 대한 실행 가능한 통찰력을 제공하는 운영 데이터를 볼 수 있습니다. 경보를 구성하고 해당 경보를 기반으로 자동화된 조치를 취할 수도 있습니다. Amazon RDS는 [확장 모니터링](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Monitoring.OS.html) 및 [성능 개선 도우미](https://aws.amazon.com/rds/performance-insights/)를 비롯한 추가 모니터링 도구를 제공합니다.

# ELK 스택을 AWS 기반 Elastic 클라우드로 마이그레이션
<a name="migrate-an-elk-stack-to-elastic-cloud-on-aws"></a>

*Battulga Purevragchaa, Antony Prasad Thevaraj, Amazon Web Services*

*uday reddy, None*

## 요약
<a name="migrate-an-elk-stack-to-elastic-cloud-on-aws-summary"></a>

[Elastic](https://www.elastic.co/)은 수년 동안 서비스를 제공해 왔으며, 사용자와 고객은 일반적으로 온프레미스에서 Elastic을 직접 관리합니다. 관리형 [Elasticsearch 서비스](https://www.elastic.co/elasticsearch/service)인 [Elastic Cloud는](https://www.elastic.co/cloud) [엔터프라이즈 검색](https://www.elastic.co/enterprise-search), [관찰성](https://www.elastic.co/observability) 및 [보안](https://www.elastic.co/security)을 위한 Elastic 스택(ELK 스택)과 솔루션을 사용하는 방법을 제공합니다. 로그, 메트릭, APM(애플리케이션 성능 모니터링), SIEM(보안 정보 및 이벤트 관리)과 같은 앱을 통해 Elastic 솔루션에 액세스할 수 있습니다. 기계 학습, 인덱스 수명 주기 관리, Kibana 렌즈(드래그 앤 드롭 시각화용)와 같은 통합 기능을 사용할 수 있습니다.

자체 관리형 Elasticsearch에서 Elastic 클라우드로 전환하면 Elasticsearch 서비스가 다음 작업을 처리합니다.
+ 기본 인프라 프로비저닝 및 관리
+ Elasticsearch 클러스터 생성 및 관리
+ 클러스터 확장 및 축소
+ 업그레이드, 패치 적용, 스냅샷 촬영

이를 통해 다른 문제를 해결하는 데 더 많은 시간을 할애할 수 있습니다.

이 패턴은 온프레미스 Elasticsearch 7.13을 Amazon Web Services(AWS)의 Elastic 클라우드에서 Elasticsearch로 마이그레이션하는 방법을 정의합니다. 다른 버전에서는 이 패턴에 설명된 프로세스를 약간 수정해야 할 수 있습니다. 자세한 내용은 Elastic 담당자에게 문의하십시오.

## 사전 조건 및 제한 사항
<a name="migrate-an-elk-stack-to-elastic-cloud-on-aws-prereqs"></a>

**사전 조건 **
+ 스냅샷을 위해 [Amazon Simple Storage Service(S3)](https://aws.amazon.com/s3/)에 액세스할 수 있는 활성 [AWS 계정](https://aws.amazon.com/account/)
+ 스냅샷 데이터 파일을 Amazon S3로 복사하기 위한 안전하고 충분히 높은 대역폭의 [프라이빗 링크](https://docs.aws.amazon.com/vpc/latest/userguide/vpn-connections.html)
+ [Amazon S3 전송 가속화](https://aws.amazon.com/s3/transfer-acceleration/)
+ 데이터 모으기가 충분히 큰 로컬 데이터 스토어 또는 원격 스토리지(Amazon S3)에 정기적으로 보관되도록 하는 [Elastic 스냅샷 정책](https://www.elastic.co/guide/en/elasticsearch/reference/7.10/getting-started-snapshot-lifecycle-management.html)

마이그레이션을 시작하기 전에 스냅샷의 크기와 함께 제공되는 인덱스의 [수명 주기 정책이](https://www.elastic.co/guide/en/elasticsearch/reference/current/index-lifecycle-management.html) 온프레미스에 얼마나 큰지 이해해야 합니다. 자세한 내용은 [Elastic에 문의하십시오](https://www.elastic.co/contact).

**역할 및 기술**

마이그레이션 프로세스에는 다음 표에 설명된 역할과 전문 지식도 필요합니다.


| 
| 
| Role | 전문성 | 책임 | 
| --- |--- |--- |
| 앱 지원 | Elastic 클라우드 및 Elastic 온프레미스에 대한 지식 | 모든 Elastic 관련 작업 | 
| 시스템 관리자 또는 DBA | 온프레미스 Elastic 환경 및 해당 구성에 대한 심층 지식 | 스토리지를 프로비저닝하고 AWS Command Line Interface(AWS CLI)를 설치 및 사용하고 온프레미스에서 Elastic을 지원하는 모든 데이터 소스를 식별하는 기능 | 
| 네트워크 관리자 | 온프레미스에서 AWS로의 네트워크 연결, 보안 및 성능에 대한 지식 | 연결 대역폭에 대한 이해를 바탕으로 온프레미스에서 Amazon S3로 네트워크 링크 설정 | 

**제한 사항 **
+ Elastic 클라우드 기반 Elasticsearch는 [지원되는 AWS 리전](https://www.elastic.co/guide/en/cloud/current/ec-regions-templates-instances.html#ec-aws_regions)에서만 사용할 수 있습니다(2021년 9월).

**제품 버전**
+ Elasticsearch 7.13

## 아키텍처
<a name="migrate-an-elk-stack-to-elastic-cloud-on-aws-architecture"></a>

**소스 기술 스택  **

온프레미스 Elasticsearch 7.13 이상:
+ 클러스터 스냅샷
+ 인덱스 스냅샷
+ [Beats](https://www.elastic.co/beats/) 구성

**소스 기술 아키텍처**

다음 다이어그램은 다양한 수집 방법, 노드 유형 및 Kibana를 사용하는 일반적인 온프레미스 아키텍처를 보여줍니다. 다양한 노드 유형은 Elasticsearch 클러스터, 인증 및 시각화 역할을 반영합니다.

![\[Beats, Logstash, Elasticsearch 및 Kibana를 포함한 8단계 프로세스.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/23d1b437-22ff-420e-80ac-834f1116d234/images/937c4d22-429f-4673-86df-ae491d68389c.png)


1. Beats에서 Logstash로 수집

1. Beats에서 Apache Kafka 메시지 대기열로 수집

1. Filebeat에서 Logstash로 수집

1. Apache Kafka 메시지 대기열에서 Logstash로 수집

1. Logstash에서 Elasticsearch 클러스터로 수집

1. Elasticsearch 클러스터

1. 인증 및 알림 노드

1. Kibana 및 블럽 노드

**대상 기술 스택 **

Elastic 클라우드는 클러스터 간 복제를 통해 여러 AWS 리전의 서비스형 소프트웨어(SaaS) 계정에 배포됩니다.
+ 클러스터 스냅샷
+ 인덱스 스냅샷
+ Beats 구성
+ Elastic 클라우드
+ Network Load Balancer
+ Amazon Route 53
+ Amazon S3

**대상 아키텍처 **

![\[Route 53 엔드포인트는 서로 다른 두 리전의 다중 AZ 환경으로 트래픽을 라우팅합니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/23d1b437-22ff-420e-80ac-834f1116d234/images/16cbac49-0adb-4469-b546-ae4b1ca35357.png)


 

관리형 Elastic 클라우드 인프라는 다음과 같습니다.
+ 여러 [가용 영역](https://aws.amazon.com/about-aws/global-infrastructure/regions_az/) 및 여러 AWS 리전에 존재하므로 가용성이 높습니다.
+ Elastic 클라우드 [클러스터 간 복제 (CCR)](https://www.elastic.co/guide/en/elasticsearch/reference/7.14/xpack-ccr.html)를 사용하여 데이터(인덱스 및 스냅샷)가 복제되므로 리전 내결함성이 있습니다.
+ 아카이브, 스냅샷이 [Amazon S3](https://aws.amazon.com/s3/?p=pm&c=s3&z=4)에 보관되기 때문
+ [Network Load Balancers](https://aws.amazon.com/elasticloadbalancing/network-load-balancer/) 및 [Route 53](https://aws.amazon.com/route53/)의 조합을 통한 네트워크 파티션 내성
+ [Elastic APM](https://www.elastic.co/apm/), [Beats](https://www.elastic.co/beats/), [Logstash](https://www.elastic.co/guide/en/logstash/current/index.html)에서 시작되지만 이에 국한되지는 않는 데이터 모으기

**상위 수준 마이그레이션 단계**

Elastic은 온프레미스 Elastic 클러스터를 Elastic 클라우드로 마이그레이션하기 위한 자체 규범적 방법론을 개발했습니다. Elastic 방법론은 [Well-Architected Framework](https://aws.amazon.com/architecture/well-architected/?wa-lens-whitepapers.sort-by=item.additionalFields.sortDate&wa-lens-whitepapers.sort-order=desc) 및 [AWS Migration Acceleration Program](https://aws.amazon.com/migration-acceleration-program/)(MAP)을 비롯한 AWS 마이그레이션 지침 및 모범 사례와 직접 연계되고 보완됩니다. 일반적으로 세 가지 AWS 마이그레이션 단계는 다음과 같습니다.
+ 평가
+ 동원
+ 마이그레이션 및 현대화

Elastic은 유사한 마이그레이션 단계를 따르며 상호 보완적인 용어를 사용합니다.
+ 시작
+ 계획
+ 구현
+ 전송
+ Close

Elastic은 Elastic 구현 방법론을 사용하여 프로젝트 결과 전송을 촉진합니다. 이는 Elastic, 컨설팅 팀, 고객 팀이 명확하게 협력하여 의도한 결과를 공동으로 제공할 수 있도록 설계된 것입니다.

Elastic 방법론은 구현 단계 내에서 기존의 워터폴 단계를 스크럼과 결합합니다. 기술 요구 사항 구성은 위험을 최소화하면서 협업 방식으로 반복적으로 제공됩니다.

![\[Elastic 구현 방법론의 5단계를 보여주는 다이어그램.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/23d1b437-22ff-420e-80ac-834f1116d234/images/b041c61d-980e-49a0-a721-791c20edde64.png)


 

## 도구
<a name="migrate-an-elk-stack-to-elastic-cloud-on-aws-tools"></a>

**서비스**
+ [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) - Amazon Route 53은 가용성과 확장성이 뛰어난 도메인 이름 시스템(DNS) 웹 서비스입니다. Route 53를 사용하여 세 가지 주요 기능, 즉 도메인 등록, DNS 라우팅, 상태 확인을 조합하여 실행할 수 있습니다.
+ [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)-Amazon Simple Storage Service(S3)는 객체 스토리지 서비스입니다. Amazon S3를 사용하면 인터넷을 통해 언제 어디서든 원하는 양의 데이터를 저장하고 검색할 수 있습니다. 이 패턴은 S3 버킷과 [Amazon S3 전송 가속화](https://docs.aws.amazon.com/AmazonS3/latest/userguide/transfer-acceleration-examples.html)를 사용합니다.
+ [Elastic Load Balancing](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) - Elastic Load Balancing은 둘 이상의 가용 영역에서 EC2 인스턴스, 컨테이너, IP 주소 등 여러 대상에 걸쳐 수신되는 트래픽을 자동으로 분산합니다.

**기타 도구**
+ [Beats](https://www.elastic.co/beats/) - Beats는 Logstash 또는 Elasticsearch의 데이터를 전송합니다.
+ [Elastic 클라우드](https://www.elastic.co/cloud/) - Elastic 클라우드는 Elasticsearch를 호스팅하기 위한 관리형 서비스입니다.
+ [Elasticsearch](https://www.elastic.co/elasticsearch/) - Elasticsearch는 Elastic 스택을 사용하여 규모 조정 가능한 검색 및 분석을 위해 데이터를 중앙에 저장하는 검색 및 분석 엔진입니다. 또한 이 패턴은 스냅샷 생성과 클러스터 간 복제를 사용합니다.
+ [Logstash](https://www.elastic.co/logstash/) — Logstash는 여러 소스에서 데이터를 수집하고 변환한 다음 데이터 스토리지로 전송하는 서버 측 데이터 처리 파이프라인입니다.

## 에픽
<a name="migrate-an-elk-stack-to-elastic-cloud-on-aws-epics"></a>

### 마이그레이션 준비
<a name="prepare-the-migration"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 온프레미스 Elastic 솔루션을 실행하는 서버를 식별하십시오. | Elastic 마이그레이션이 지원되는지 확인합니다. | 앱 소유자 | 
| 온프레미스 서버 구성을 이해합니다. | 온프레미스에서 워크로드를 성공적으로 구동하는 데 필요한 서버 구성을 이해하려면 현재 사용 중인 서버 하드웨어 설치 공간, 네트워크 구성 및 스토리지 특성을 찾아보십시오. | 앱 지원 | 
| 사용자 및 앱 계정 정보를 수집합니다. | 온프레미스 Elastic 환경에서 사용되는 사용자 이름과 앱 이름을 식별하십시오. | 시스템 관리자, 앱 지원 | 
| Beats 및 데이터 발송자 구성을 문서화하십시오. | 구성을 문서화하려면 기존 데이터 소스와 싱크를 살펴보십시오. 자세한 내용은 [Elastic 설명서](https://www.elastic.co/guide/en/elasticsearch/reference/current/ingest.html)를 참조하십시오. | 앱 지원 | 
| 데이터의 속도와 양을 결정하십시오. | 클러스터가 처리하는 데이터의 양에 대한 기준을 설정합니다. | 시스템 관리자, 앱 지원 | 
| RPO 및 RTO 시나리오를 문서화하십시오. | 운영 중단 및 서비스 수준에 관한 계약(SLA)의 측면에서 Recovery Point Objective(RPO) 및 Recovery Time Objective(RTO) 시나리오를 문서화합니다. | 앱 소유자, 시스템 관리자, 앱 지원 | 
| 최적의 스냅샷 수명 주기 설정을 결정하십시오. | 마이그레이션 *도중 및 이후에* Elastic 스냅샷을 사용하여 데이터를 보호해야 하는 빈도를 정의하십시오. | 앱 소유자, 시스템 관리자, 앱 지원 | 
| 마이그레이션 후 성능 기대치를 정의하십시오. | 현재 및 예상 화면 새로 고침, 쿼리 런타임, 사용자 인터페이스 동작에 대한 지표를 생성합니다. | 시스템 관리자, 앱 지원 | 
| 인터넷 액세스 전송, 대역폭 및 가용성 요구 사항을 문서화합니다. | 스냅샷을 Amazon S3로 복사하기 위한 인터넷 연결의 속도, 지연 시간 및 복원력을 확인합니다. | 네트워크 관리자 | 
| Elastic 온프레미스 런타임의 현재 비용을 문서화합니다. | AWS 대상 환경의 규모가 고성능이면서 비용 효율적으로 설계되었는지 확인합니다. | DBA, 시스템 관리자, 앱 지원 | 
| 인증 및 권한 부여 요구 사항을 파악합니다. | Elastic 스택 보안 기능은 경량 디렉터리 액세스 프로토콜(LDAP), Security Assertion Markup Language(SAML), OpenID Connect(OIDC)와 같은 내장 영역을 제공합니다. | DBA, 시스템 관리자, 앱 지원 | 
| 지리적 위치에 기반한 특정 규제 요구 사항을 이해하십시오. | 요구 사항 및 관련 국가 요구 사항에 따라 데이터를 내보내고 암호화해야 합니다. | DBA, 시스템 관리자, 앱 지원 | 

### 마이그레이션 구현
<a name="implement-the-migration"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Amazon S3에서 스테이징 영역을 준비합니다. | Amazon S3 에서 스냅샷을 수신하려면 새로 생성한 버킷에 대한 전체 액세스 권한을 가진 [S3 버킷 생성](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html) 및 임시 AWS Identity and Access Management(IAM) 역할을 생성합니다. 자세한 내용은 [IAM 사용자에게 권한을 위임하기 위한 역할 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)을 참조하십시오. AWS 보안 토큰 서비스를 사용하여 [임시 보안 보안 인증을 요청합니다](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html). 액세스 키 ID, 비밀 액세스 키 및 세션 토큰을 안전하게 유지합니다.버킷에서 [Amazon S3 전송 가속화](https://docs.aws.amazon.com/AmazonS3/latest/userguide/transfer-acceleration-examples.html)를 활성화합니다. | AWS 관리자 | 
| AWS CLI와 Amazon S3 플러그인을 온프레미스에 설치합니다. | 각 Elasticsearch 노드에서 다음 명령을 실행합니다.<pre>sudo bin/elasticsearch-plugin install repository-s3</pre>그런 다음 노드를 재부팅합니다. | AWS 관리자 | 
| Amazon S3 클라이언트 액세스를 구성합니다. | 다음 명령을 실행하여 이전에 생성한 키를 추가합니다.<pre>elasticsearch-keystore add s3.client.default.access_key</pre><pre>elasticsearch-keystore add s3.client.default.secret_key</pre><pre>elasticsearch-keystore add s3.client.default.session_token</pre> | AWS 관리자 | 
| Elastic 데이터용 스냅샷 리포지토리를 등록하십시오. | [Kibana 개발 도구](https://www.elastic.co/guide/en/kibana/current/console-kibana.html)를 사용하여 온프레미스 로컬 클러스터에 어느 원격 S3 버킷에 쓸 것인지 알립니다. | AWS 관리자 | 
| 스냅샷 정책을 구성합니다. | 스냅샷 수명 주기 관리를 구성하려면 Kibana **Policies** 탭에서 **SLM 정책**을 선택하고, 포함해야 하는 시간, 데이터 스트림 또는 인덱스 및 사용할 이름을 정의합니다.스냅샷을 자주 찍는 정책을 구성하십시오. 스냅샷은 증분식이며 스토리지를 효율적으로 사용합니다. 준비 상태 평가 결정과 일치시키십시오. 또한 정책을 통해 [보존 정책을](https://www.elastic.co/guide/en/elasticsearch/reference/current/slm-retention.html) 지정하고 스냅샷이 더 이상 필요하지 않은 경우 스냅샷을 자동으로 삭제할 수 있습니다. | 앱 지원 | 
| 스냅샷이 작동하는지 확인합니다. | Kibana 개발 도구에서 다음 명령을 실행합니다.<pre>GET _snapshot/<your_repo_name>/_all</pre> | AWS 관리자, 앱 지원  | 
| Elastic 클라우드에 새 클러스터를 배포하십시오. | [Elastic에 로그인](https://cloud.elastic.co/login?redirectTo=%2Fhome)하고 준비 상태 평가의 비즈니스 결과에서 도출한 ‘관찰성, 검색 또는 보안’을 위한 클러스터를 선택합니다. | AWS 관리자, 앱 지원 | 
| 클러스터 키 스토어 액세스를 설정합니다. | 새 클러스터는 스냅샷을 저장할 S3 버킷에 대한 액세스 권한이 필요합니다. Elasticsearch 서비스 콘솔에서 **보안**을 선택하고 이전에 생성한 액세스 및 비밀 IAM 키를 입력합니다. | AWS 관리자 | 
| Amazon S3 액세스할 Elastic 클라우드 호스트 클러스터를 구성합니다. | Amazon S3에서 이전에 생성한 스냅샷 리포지토리에 대한 새 클러스터 액세스를 설정합니다. Kibana를 사용하여 다음을 수행합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/migrate-an-elk-stack-to-elastic-cloud-on-aws.html) | AWS 관리자, 앱 지원 | 
| 새로운 Amazon S3 리포지토리를 확인합니다. | Elastic 클라우드 클러스터에 호스팅된 새 리포지토리에 액세스할 수 있는지 확인하십시오. | AWS 관리자 | 
| Elasticsearch 서비스 클러스터를 초기화하십시오. | Elasticsearch 서비스 콘솔에서 S3 스냅샷의 Elasticsearch 서비스 클러스터를 초기화합니다.다음 명령을 POST로 실행합니다.<pre>*/_close?expand_wildcards=all</pre><pre>/_snapshot/<your-repo-name>/  <your-snapshot-name>/_restore</pre><pre>*/_open?expand_wildcards=all</pre> | 앱 지원 | 

### 마이그레이션 완료
<a name="complete-the-migration"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 스냅샷 복원이 성공했는지 확인하십시오. | Kibana 개발 도구를 사용해서 다음 명령을 실행합니다.<pre>GET _cat/indices</pre> | 앱 지원 | 
| 통합 서비스를 재배포하십시오. | Beats 및 Logstash의 엔드포인트를 새로운 Elasticsearch 서비스 엔드포인트에 연결합니다. | 앱 지원 | 

### 클러스터 환경 테스트 및 정리
<a name="test-the-cluster-environment-and-clean-up"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 클러스터 환경을 검증하십시오. | 온프레미스 Elastic 클러스터 환경을 AWS로 마이그레이션한 후에는 해당 환경에 연결하여 자체 사용자 승인 테스트(UAT) 도구를 사용하여 새 환경을 검증할 수 있습니다. | 앱 지원 | 
| 리소스를 정리합니다. | 클러스터가 성공적으로 마이그레이션되었는지 확인한 후 마이그레이션에 사용된 S3 버킷과 IAM 역할을 제거합니다. | AWS 관리자 | 

## 관련 리소스
<a name="migrate-an-elk-stack-to-elastic-cloud-on-aws-resources"></a>

**Elastic 참조**
+ [Elastic 클라우드](https://www.elastic.co/cloud/)
+ [AWS 기반 관리형 Elasticsearch와 Kibana](https://www.elastic.co/elasticsearch/service)
+ [Elastic 엔터프라이즈 검색](https://www.elastic.co/enterprise-search)
+ [Elastic 통합](https://www.elastic.co/integrations?search=amazon)
+ [Elastic 관찰성](https://www.elastic.co/observability)
+ [Elastic 보안](https://www.elastic.co/security)
+ [Beats](https://www.elastic.co/beats/)
+ [Elastic APM](https://www.elastic.co/apm/)
+ [인덱스 수명 주기 관리로 마이그레이션](https://www.elastic.co/guide/en/cloud-enterprise/current/ece-migrate-index-management.html)
+ [Elastic 구독](https://www.elastic.co/subscriptions)
+ [Elastic에 문의](https://www.elastic.co/contact)

*Elastic 블로그 포스트*
+ [자체 관리형 Elasticsearch에서 AWS 기반 Elastic 클라우드로 마이그레이션하는 방법](https://www.elastic.co/blog/how-to-migrate-from-self-managed-elasticsearch-to-elastic-cloud-on-aws)(블로그 게시물)
+ [Elastic 클라우드로 마이그레이션](https://www.elastic.co/blog/migrating-to-elastic-cloud)(블로그 게시물)

*Elastic 설명서*
+ [튜토리얼: SLM을 통한 백업 자동화](https://www.elastic.co/guide/en/elasticsearch/reference/7.10/getting-started-snapshot-lifecycle-management.html)
+ [ILM: 인덱스 수명 주기 관리](https://www.elastic.co/guide/en/elasticsearch/reference/current/index-lifecycle-management.html)
+ [Logstash](https://www.elastic.co/guide/en/logstash/current/index.html)
+ [클러스터 간 복제(CCR)](https://www.elastic.co/guide/en/elasticsearch/reference/7.14/xpack-ccr.html)
+ [파이프라인 수집](https://www.elastic.co/guide/en/elasticsearch/reference/current/ingest.html)
+ [Elasticsearch API 요청 실행](https://www.elastic.co/guide/en/kibana/current/console-kibana.html)
+ [스냅샷 보존](https://www.elastic.co/guide/en/elasticsearch/reference/current/slm-retention.html)

*Elastic 비디오 및 웨비나*
+ [Elastic 클라우드 마이그레이션](https://www.youtube.com/watch?v=WbPJi-APZ_Q)
+ [Elastic Cloud: 고객이 마이그레이션하는 이유](https://www.elastic.co/webinars/elastic-cloud-why-customers-are-migrating-now)(웨비나)

**AWS 참조**
+ [AWS Marketplace 기반 Elastic 클라우드](https://aws.amazon.com/marketplace/seller-profile?id=d8f59038-c24c-4a9d-a66d-6711d35d7305)
+ [AWS 명령줄 인터페이스](https://docs.aws.amazon.com/AmazonS3/latest/userguide/setup-aws-cli.html)
+ [AWS Direct Connect](https://aws.amazon.com/directconnect/)
+ [AWS Migration Acceleration Program](https://aws.amazon.com/migration-acceleration-program/)
+ [Network Load Balancers](https://aws.amazon.com/elasticloadbalancing/network-load-balancer/)
+ [리전 및 가용 영역](https://aws.amazon.com/about-aws/global-infrastructure/regions_az/)
+ [Amazon Route 53](https://aws.amazon.com/route53/)
+ [Amazon Simple Storage Service(S3)](https://aws.amazon.com/s3/)
+ [Amazon S3 전송 가속화](https://aws.amazon.com/s3/transfer-acceleration/)
+ [VPN 연결](https://docs.aws.amazon.com/vpc/latest/userguide/vpn-connections.html)
+ [Well-Architected 프레임워크](https://aws.amazon.com/architecture/well-architected/?wa-lens-whitepapers.sort-by=item.additionalFields.sortDate&wa-lens-whitepapers.sort-order=desc)

## 추가 정보
<a name="migrate-an-elk-stack-to-elastic-cloud-on-aws-additional"></a>

복잡한 워크로드를 마이그레이션할 계획이라면 [Elastic 컨설팅 서비스](https://www.elastic.co/consulting/engage)에 문의하십시오. 구성 및 서비스와 관련된 기본적인 질문이 있는 경우 [Elastic 지원](mailto:support@elastic.co) 팀에 문의하십시오.

# Starburst를 사용하여 AWS 클라우드 로 데이터 마이그레이션
<a name="migrate-data-to-the-aws-cloud-by-using-starburst"></a>

*Antony Prasad Thevaraj, Suresh Veeragoni, Amazon Web Services*

*Shaun Van Staden, None*

## 요약
<a name="migrate-data-to-the-aws-cloud-by-using-starburst-summary"></a>

Starburst는 기존 데이터 소스를 단일 액세스 포인트로 통합하는 엔터프라이즈 쿼리 엔진을 제공하여 Amazon Web Services(AWS)로의 데이터 마이그레이션 여정을 가속화하도록 지원합니다. 마이그레이션 계획을 확정하기 전에 여러 데이터 소스에 대한 분석을 실행하여 귀중한 통찰력을 얻을 수 있습니다. 일반적인 비즈니스 분석을 중단하지 않고 Starburst 엔진 또는 전용 추출, 전환, 적재(ETL) 애플리케이션을 사용하여 데이터를 마이그레이션할 수 있습니다.

## 사전 조건 및 제한 사항
<a name="migrate-data-to-the-aws-cloud-by-using-starburst-prereqs"></a>

**사전 조건 **
+ 활성 AWS 계정
+ Virtual Private Cloud(VPC)
+ Amazon Elastic Kubernetes Service(Amazon EKS): 클러스터
+ Amazon Elastic Compute Cloud(Amazon EC2) 오토 스케일링
+ 마이그레이션해야 하는 현재 시스템 워크로드 목록
+ 에서 온프레미스 환경 AWS 으로의 네트워크 연결

## 아키텍처
<a name="migrate-data-to-the-aws-cloud-by-using-starburst-architecture"></a>

**참조 아키텍처**

다음 상위 아키텍처 다이어그램은 AWS 클라우드에서의 Starburst Enterprise의 일반적인 배포를 보여줍니다.

1. Starburst Enterprise 클러스터는 AWS 계정내에서 실행됩니다.

1. 사용자는 경량 디렉터리 액세스 프로토콜(LDAP) 또는 공개 인증(OAuth)을 사용하여 인증하고 Starburst 클러스터와 직접 상호 작용합니다.

1. Starburst는 AWS Glue Amazon Simple Storage Service(Amazon S3), Amazon Relational Database Service(RDS) 및 Amazon Redshift와 같은 여러 AWS 데이터 소스에 연결할 수 있습니다. Starburst는 AWS 클라우드, 온프레미스 또는 기타 클라우드 환경의 데이터 소스에서 페더레이션 쿼리 기능을 제공합니다.

1. 차트 Helm을 사용하여 Amazon EKS 클러스터에서 Starburst Enterprise를 시작할 수 있습니다.

1. Starburst Enterprise는 Amazon EC2 Auto Scaling 그룹과 Amazon EC2 스팟 인스턴스를 사용하여 인프라를 최적화합니다.

1. Starburst Enterprise는 기존 온프레미스 데이터 소스에 직접 연결하여 데이터를 실시간으로 읽습니다. 또한이 환경에 기존 Starburst Enterprise 배포가 있는 경우의 새 Starburst 클러스터를이 기존 클러스터 AWS 클라우드 에 직접 연결할 수 있습니다.

![\[클라우드에 Starburst Enterprise를 배포하는 고수준 아키텍처 다이어그램\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/12ae0463-9029-4a32-9d7b-70cdb5406fb0/images/e9975d3a-f75b-41a2-8c08-5b82539adf8c.png)


다음 사항에 유의하십시오.
+ Starburst는 데이터 가상화 플랫폼이 아닙니다. 이는 분석을 위한 전체 데이터 메시 전략의 기초를 형성하는 SQL 기반 대량 병렬 처리(MPP) 쿼리 엔진입니다.
+ 마이그레이션의 일환으로 Starburst를 배포하면 기존 온프레미스 인프라에 직접 연결됩니다.
+ Starburst는 다양한 레거시 시스템과의 연결을 용이하게 하는 몇 가지 내장형 엔터프라이즈 및 오픈 소스 커넥터를 제공합니다. 커넥터 및 해당 기능의 전체 목록은 *Starburst Enterprise 사용 설명서*의 [커넥터를](https://docs.starburst.io/latest/connector.html) 참조하십시오.
+ Starburst는 온프레미스 데이터 소스에서 실시간으로 데이터를 쿼리할 수 있습니다. 이를 통해 데이터를 마이그레이션하는 동안 정기적인 비즈니스 운영이 중단되는 것을 방지할 수 있습니다.
+ 기존 온프레미스 Starburst Enterprise 배포에서 마이그레이션하는 경우 특수 커넥터*인 Starburst Stargate*를 사용하여의 Starburst Enterprise 클러스터를 온프레미스 클러스터에 AWS 직접 연결할 수 있습니다. 이를 통해 비즈니스 사용자와 데이터 분석가가에서 온프레미스 환경으로 쿼리를 페더레이션 AWS 클라우드 할 때 추가적인 성능 이점을 얻을 수 있습니다.

**높은 수준의 프로세스 개요**

Starburst를 사용하면 데이터를 마이그레이션하기 전에 모든 데이터에 대한 통찰력을 확보할 수 있으므로 Starburst를 사용하면 데이터 마이그레이션 프로젝트를 가속화할 수 있습니다. 다음 이미지는 Starburst를 사용하여 데이터를 마이그레이션하는 일반적인 프로세스를 보여줍니다.

![\[Starburst를 사용하여 데이터를 클라우드로 마이그레이션하는 프로세스 흐름\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/12ae0463-9029-4a32-9d7b-70cdb5406fb0/images/e79b0084-7275-4824-8854-646236ec23dc.png)


**역할**

Starburst를 사용하여 마이그레이션을 완료하려면 일반적으로 다음과 같은 역할이 필요합니다.
+ **클라우드 관리자** - Starburst Enterprise 애플리케이션을 실행하는 데 클라우드 리소스를 사용할 수 있도록 하는 일을 담당합니다.
+ **Starburst 관리자** - Starburst 애플리케이션 설치, 구성, 관리 및 지원을 담당합니다.
+ **데이터 엔지니어**- 담당:
  + 레거시 데이터를 클라우드로 마이그레이션
  + 분석을 지원하는 시맨틱 뷰 구축
+ **솔루션 또는 시스템 소유자** - 전체 솔루션 구현을 담당합니다.

## 도구
<a name="migrate-data-to-the-aws-cloud-by-using-starburst-tools"></a>

**AWS 서비스**
+ [Amazon Elastic Compute Cloud(Amazon EC2)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts.html)는 AWS 클라우드에서 확장 가능한 컴퓨팅 용량을 제공합니다. 필요한 만큼 가상 서버를 시작하고 빠르게 스케일 업하거나 스케일 다운할 수 있습니다.
+ [Amazon Elastic Kubernetes Service(Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html)를 사용하면 자체 Kubernetes 컨트롤 플레인 또는 노드를 설치하거나 유지 관리할 필요 AWS 없이에서 Kubernetes를 실행할 수 있습니다.

**기타 도구**
+ [Helm](https://helm.sh/docs/) – Kubernetes용 Helm 패키지 관리자는 Kubernetes 클러스터에서 애플리케이션을 설치하고 관리하는 데 도움이 됩니다.
+ [Starburst 엔터프라이즈](https://docs.starburst.io/latest/index.html) - Starburst Enterprise는 분석을 위한 전체 데이터 메시 전략의 기초를 형성하는 SQL 기반 대량 병렬 처리(MPP) 쿼리 엔진입니다.
+ [Starburst Stargate](https://docs.starburst.io/latest/connector/starburst-stargate.html) – Starburst Stargate는 한 Starburst Enterprise 환경(예: 온프레미스 데이터 센터의 클러스터)에 있는 카탈로그 및 데이터 소스를 다른 Starburst Enterprise 환경(예: AWS 클라우드의 클러스터)에 있는 카탈로그 및 데이터 소스에 연결합니다.

## 에픽
<a name="migrate-data-to-the-aws-cloud-by-using-starburst-epics"></a>

### 데이터 평가
<a name="assess-the-data"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 데이터를 식별하고 우선순위를 정하십시오. | 이동하려는 데이터를 식별하십시오. 대규모 온프레미스 레거시 시스템에는 마이그레이션하려는 핵심 데이터와 함께 이동하고 싶지 않거나 규정 준수상의 이유로 이동할 수 없는 데이터가 포함될 수 있습니다. 데이터 인벤토리로 시작하면 먼저 대상으로 삼아야 하는 데이터의 우선 순위를 정하는 데 도움이 됩니다. 자세한 내용은 [자동화된 포트폴리오 검색 시작](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/get-started-with-automated-portfolio-discovery.html)을 참조하십시오. | 데이터 엔지니어, DBA | 
| 데이터를 탐색하고, 인벤토리를 작성하고, 백업하십시오. | 사용 사례에 맞는 데이터의 품질, 수량, 관련성을 검증하십시오. 필요에 따라 데이터를 백업하거나 스냅샷을 만들고 데이터의 대상 환경을 확정합니다. | 데이터 엔지니어, DBA | 

### Starburst Enterprise 환경 설정
<a name="set-up-the-starburst-enterprise-environment"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
|  AWS 클라우드에서 Starburst Enterprise를 구성합니다. | 데이터를 카탈로그화하는 동안 관리형 Amazon EKS 클러스터에 Starburst Enterprise를 설정하십시오. 자세한 내용은 *Starburst Enterprise 참조 문서*의 [Kubernetes를 사용한 배포](https://docs.starburst.io/latest/k8s.html)를 참조하십시오. 이를 통해 데이터 마이그레이션이 진행되는 동안에도 일상적인 분석을 수행할 수 있습니다. | 관리자, 앱 개발자 | 
| Starburst를 데이터 소스에 연결합니다. | 데이터를 식별하고 Starburst Enterprise를 설정한 후 Starburst를 데이터 소스에 연결합니다. Starburst는 데이터 소스에서 SQL 쿼리로 직접 데이터를 읽습니다. 자세한 내용은 [Starburst Enterprise 참조 문서](https://docs.starburst.io/latest/overview.html)를 참조하십시오. | 관리자, 앱 개발자 | 

### 데이터 마이그레이션
<a name="migrate-the-data"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| ETL 파이프라인을 빌드하고 실행하십시오. | 데이터 마이그레이션 프로세스를 시작합니다. 이 활동은 일반적인 비즈니스 분석과 동시에 발생할 수 있습니다. 마이그레이션에는 타사 제품 또는 Starburst를 사용할 수 있습니다. Starburst는 다양한 소스에서 데이터를 읽고 쓸 수 있는 기능을 모두 갖추고 있습니다. 자세한 내용은 [Starburst Enterprise 참조 문서](https://docs.starburst.io/latest/overview.html)를 참조하십시오. | 데이터 엔지니어 | 
| 데이터를 검증합니다. | 데이터를 마이그레이션한 후 데이터를 검증하여 필요한 모든 데이터가 이동되었고 손상되지 않았는지 확인합니다. | 데이터 엔지니어, DevOps 엔지니어 | 

### 전환
<a name="cut-over"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 데이터를 잘라냅니다. | 데이터 마이그레이션 및 검증이 완료된 후 데이터를 잘라낼 수 있습니다. 여기에는 Starburst의 데이터 연결 링크 변경이 포함됩니다. 온프레미스 소스를 가리키는 대신 새 클라우드 소스를 가리키고 시맨틱 뷰를 업데이트합니다. 자세한 내용은 *Starburst Enterprise 참조 문서*의 [커넥터를](https://docs.starburst.io/latest/connector.html) 참조하십시오. | 데이터 엔지니어, 전환 리드 | 
| 사용자 대상으로 출시합니다. | 데이터 소비자는 마이그레이션된 데이터 원본으로 작업을 시작합니다. 분석 최종 사용자에게는 이 프로세스가 보이지 않습니다. | 전환 리드, 데이터 엔지니어 | 

## 관련 리소스
<a name="migrate-data-to-the-aws-cloud-by-using-starburst-resources"></a>

**AWS Marketplace**
+ [Starburst Galaxy](https://aws.amazon.com/marketplace/pp/prodview-yugyv4gbgn5ss?ref_=srh_res_product_title)
+ [Starburst Enterprise](https://aws.amazon.com/marketplace/pp/prodview-pwnl3c6p2jycg?ref_=srh_res_product_title)
+ [Starburst Data JumpStart](https://aws.amazon.com/marketplace/pp/prodview-ou6drb23gch2u?ref_=srh_res_product_title)
+ [Starburst Enterprise(Graviton 포함)](https://aws.amazon.com/marketplace/pp/prodview-2bpppdqlesn6w?ref_=srh_res_product_title)

**Starburst 문서**
+ [Starburst Enterprise 사용 설명서](https://docs.starburst.io/index.html)
+ [Starburst Enterprise 참조 문서](https://docs.starburst.io/latest/index.html)

**기타 AWS 설명서**
+ [자동 포트폴리오 검색 시작하기](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/get-started-with-automated-portfolio-discovery.html)(AWS 권고 가이드)
+ [에서 Starburst를 사용하여 클라우드 인프라 비용 및 성능 최적화 AWS](https://aws.amazon.com/blogs/architecture/optimizing-cloud-infrastructure-cost-and-performance-with-starburst-on-aws/)(AWS 블로그 게시물)

# AWS에서 입력 파일 크기의 ETL 수집 최적화
<a name="optimize-the-etl-ingestion-of-input-file-size-on-aws"></a>

*Apoorva Patrikar, Amazon Web Services*

## 요약
<a name="optimize-the-etl-ingestion-of-input-file-size-on-aws-summary"></a>

이 패턴은 데이터를 처리하기 전에 파일 크기를 최적화하여 AWS Glue의 빅 데이터 및 Apache Spark 워크로드에 대한 추출, 전환, 적재(ETL) 프로세스의 수집 단계를 최적화하는 방법을 보여줍니다. 이 패턴을 사용하여 *작은 파일 문제*를 예방하거나 해결할 수 있습니다. 즉, 작은 파일이 많으면 파일의 전체 크기 때문에 데이터 처리 속도가 느려지는 경우입니다. 예를 들어, 각각 수백 킬로바이트에 불과한 수백 개의 파일은 AWS Glue 작업의 데이터 처리 속도를 크게 저하시킬 수 있습니다. AWS Glue는 Amazon Simple Storage Service(S3)에서 내부 목록 기능을 수행해야 하고 YARN(또 다른 리소스 협상자)은 대량의 메타데이터를 저장해야 하기 때문입니다. 데이터 처리 속도를 높이려면, 그룹화를 사용하여 ETL 작업이 입력 파일 그룹을 단일 인 메모리 파티션으로 읽을 수 있도록 만들 수 있습니다. 파티션은 크기가 작은 파일들을 자동으로 그룹화합니다. 또는 사용자 지정 코드를 사용하여 기존 파일에 배치 로직을 추가할 수 있습니다.

## 사전 조건 및 제한 사항
<a name="optimize-the-etl-ingestion-of-input-file-size-on-aws-prereqs"></a>

**사전 조건 **
+ 활성 상태의 AWS 계정
+ 하나 이상의 AWS Glue [작업](https://docs.aws.amazon.com/glue/latest/dg/author-job.html)
+ 하나 이상의 빅 데이터 또는 [Apache Spark](https://spark.apache.org/) 워크로드
+ [S3 버킷](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingBucket.html)

## 아키텍처
<a name="optimize-the-etl-ingestion-of-input-file-size-on-aws-architecture"></a>

다음 패턴은 성능에 대한 가시성을 확보하기 위해 AWS Glue 작업에서 다양한 형식의 데이터를 처리한 다음 S3 버킷에 저장하는 방법을 보여줍니다.

![\[다양한 형식의 데이터는 AWS Glue 작업에서 처리된 다음 S3 버킷에 저장됩니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/88ee332f-2f12-4d88-b491-e78bbb173850/images/9a97b54a-3f67-4a48-94d2-5807373ace25.png)


이 다이어그램은 다음 워크플로를 보여줍니다.

1. 
**참고**  
AWS Glue 작업은 CSV, JSON 및 Parquet 형식의 작은 파일을 동적 프레임으로 변환합니다. : 입력 파일의 크기는 AWS Glue 작업의 성능에 가장 큰 영향을 미칩니다.

1. AWS Glue 작업은 S3 버킷에서 내부 목록 기능을 수행합니다.

## 도구
<a name="optimize-the-etl-ingestion-of-input-file-size-on-aws-tools"></a>
+ [AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/what-is-glue.html)는 완전 관리형 ETL 서비스입니다. 이를 통해 데이터 스토어와 데이터 스트림 간에 데이터를 안정적으로 분류, 정리, 보강하고 이동할 수 있습니다.
+ [Amazon Simple Storage Service(S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)는 원하는 양의 데이터를 저장, 보호 및 검색하는 데 도움이 되는 클라우드 기반 객체 스토리지 서비스입니다.

## 에픽
<a name="optimize-the-etl-ingestion-of-input-file-size-on-aws-epics"></a>

### 읽기 중에 그룹화를 사용하여 ETL 수집 최적화
<a name="use-grouping-to-optimize-etl-ingestion-during-reading"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 그룹 크기를 지정합니다. | 50,000개 이상의 파일이 있는 경우 기본값으로 그룹화가 설정됩니다. 그러나 `connectionOptions` 파라미터에 그룹 크기를 지정하여 50,000개 미만의 파일에 대해 그룹화를 사용할 수도 있습니다. `connectionOptions` 파라미터는 `create_dynamic_frame.from_options` 방법에 있습니다. | 데이터 엔지니어 | 
| 그룹화 코드를 작성하십시오. | `create_dynamic_frame` 방법을 사용하여 동적 프레임을 만들 수 있습니다. 예제:<pre>S3bucket_node1 = glueContext.create_dynamic_frame.from_options(<br />    format_options={"multiline": False},<br />    connection_type="s3",<br />    format="json",<br />    connection_options={<br />        "paths": ["s3://bucket/prefix/file.json"],<br />        "recurse": True,<br />        "groupFiles": 'inPartition', <br />        "groupSize": 1048576<br />    },<br />    transformation_ctx="S3bucket_node1",<br />)</pre>Amazon S3 파티션 그룹의 파일을 그룹화하는 데 `groupFiles`를 사용합니다. 메모리에서 읽을 그룹의 목표 크기를 설정하는 데 `groupSize`를 사용합니다. 바이트 단위로 `groupSize`를 지정합니다(1,048,576 = 1MB). | 데이터 엔지니어 | 
| 워크플로에 코드를 추가합니다. | AWS Glue의 작업 [워크플로](https://docs.aws.amazon.com/glue/latest/dg/workflows_overview.html)에 그룹화 코드를 추가합니다. | 데이터 엔지니어 | 

### 사용자 지정 로직을 사용하여 ETL 수집을 최적화합니다.
<a name="use-custom-logic-to-optimize-etl-ingestion"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 언어 및 처리 플랫폼을 선택합니다. | 사용 사례에 맞는 스크립팅 언어와 처리 플랫폼을 선택하십시오. | 클라우드 아키텍트 | 
| 코드를 작성합니다. | 사용자 지정 로직을 작성하여 파일을 일괄 처리하십시오. | 클라우드 아키텍트 | 
| 워크플로에 코드를 추가합니다. | AWS Glue의 작업 [워크플로](https://docs.aws.amazon.com/glue/latest/dg/workflows_overview.html)에 코드를 추가합니다. 이렇게 하면 작업이 실행될 때마다 사용자 지정 로직을 적용할 수 있습니다. | 데이터 엔지니어 | 

### 변환 후 데이터 쓰기 시 재분할
<a name="repartition-when-writing-data-after-transformation"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 소비 패턴을 분석합니다. | 다운스트림 애플리케이션에서 작성한 데이터를 사용하는 방법을 알아봅니다. 예를 들어 매일 데이터를 쿼리하고 리전당 데이터만 분할하거나 파일당 2.5KB와 같은 매우 작은 출력 파일이 있는 경우 이는 사용하기에 적합하지 않습니다. | DBA | 
| 쓰기 전에 데이터를 재분할합니다. | 처리 중(처리 로직 기준) 및 처리 후(사용 기준) 조인 또는 쿼리를 기반으로 하는 재분할입니다. 예를 들어 `.repartition(100000)`와 같은 바이트 크기를 기반으로 한 재분할 또는 `.repartition("column_name")`와 같은 열을 기반으로 한 재분할이 있습니다. | 데이터 엔지니어 | 

## 관련 리소스
<a name="optimize-the-etl-ingestion-of-input-file-size-on-aws-resources"></a>
+ [입력 파일을 더 큰 그룹에서 읽기](https://docs.aws.amazon.com/glue/latest/dg/grouping-input-files.html)
+ [AWS Glue 모니터링](https://docs.aws.amazon.com/glue/latest/dg/monitor-glue.html)
+ [Amazon CloudWatch 지표를 사용한 AWS Glue 모니터링](https://docs.aws.amazon.com/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)
+ [작업 모니터링 및 디버깅](https://docs.aws.amazon.com/glue/latest/dg/monitor-profile-glue-job-cloudwatch-metrics.html)
+ [AWS Glue에서 서버리스 ETL 시작하기](https://docs.aws.amazon.com/prescriptive-guidance/latest/serverless-etl-aws-glue/welcome.html)

## 추가 정보
<a name="optimize-the-etl-ingestion-of-input-file-size-on-aws-additional"></a>

**파일 크기 결정**

파일 크기가 너무 큰지 작은지 판단할 수 있는 간단한 방법은 없습니다. 파일 크기가 처리 성능에 미치는 영향은 클러스터 구성에 따라 달라집니다. 코어 Hadoop에서는 블록 크기를 최대한 활용하려면 128MB 또는 256MB의 파일을 사용하는 것이 좋습니다.

AWS Glue의 대부분의 텍스트 파일 워크로드의 경우, 5\$110 DPU 클러스터에 대해 100MB에서 1GB 사이의 파일 크기를 사용하는 것이 좋습니다. 입력 파일의 최적 크기를 파악하려면, AWS Glue 작업의 사전 처리 섹션을 모니터링한 다음 해당 작업의 CPU 사용률과 메모리 사용률을 확인하십시오.

**추가 고려 사항**

초기 ETL 단계의 성능에 병목 현상이 발생하는 경우, 처리하기 전에 데이터 파일을 그룹화하거나 병합하는 것을 고려해 보십시오. 파일 생성 프로세스를 완벽하게 제어할 수 있다면, 원시 데이터를 AWS로 보내기 전에 소스 시스템 자체에서 데이터 포인트를 집계하는 것이 훨씬 더 효율적일 수 있습니다.

# 를 사용하여 검증, 변환 및 파티셔닝으로 ETL 파이프라인 오케스트레이션 AWS Step Functions
<a name="orchestrate-an-etl-pipeline-with-validation-transformation-and-partitioning-using-aws-step-functions"></a>

*Sandip Gangapadhyay, Amazon Web Services*

## 요약
<a name="orchestrate-an-etl-pipeline-with-validation-transformation-and-partitioning-using-aws-step-functions-summary"></a>

이 패턴은 성능 및 비용 최적화를 위해 대규모 CSV 데이터 세트를 검증, 변환, 압축 및 분할하기 위한 서버리스 추출, 전환, 적재(ETL) 파이프라인을 구축하는 방법을 설명합니다. 파이프라인은에서 오케스트레이션 AWS Step Functions 되며 오류 처리, 자동 재시도 및 사용자 알림 기능을 포함합니다.

CSV 파일이 Amazon Storage Service(S3) 버킷 소스 폴더에 업로드되면 ETL 파이프라인이 실행되기 시작합니다. 파이프라인은 소스 CSV 파일의 콘텐츠와 스키마를 검증하고, CSV 파일을 압축된 Apache Parquet 형식으로 변환하고, 데이터 세트를 연도, 월, 일별로 분할하고 분석 도구가 처리할 수 있도록 별도의 폴더에 저장합니다.

이 패턴을 자동화하는 코드는 [AWS Step Functions가 포함된 ETL 파이프라인 AWS Step Functions](https://github.com/aws-samples/aws-step-functions-etl-pipeline-pattern) 리포지토리의 GitHub에서 사용할 수 있습니다.

## 사전 조건 및 제한 사항
<a name="orchestrate-an-etl-pipeline-with-validation-transformation-and-partitioning-using-aws-step-functions-prereqs"></a>

**사전 조건 **
+ 활성. AWS 계정
+ AWS Command Line Interface (AWS CLI)가와 함께 설치 및 구성되어 AWS CloudFormation 스택을 배포하여 AWS 리소스를 생성할 AWS 계정수 있습니다. AWS CLI 버전 2를 사용하는 것이 좋습니다. 지침은 AWS CLI 설명서의[의 최신 버전 설치 또는 업데이트를 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html) 참조하세요. 구성 지침은 AWS CLI 설명서의 [구성 및 자격 증명 파일 설정을](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) 참조하세요.
+ Amazon S3 버킷.
+ 올바른 스키마가 포함된 CSV 데이터 세트. (이 패턴에 포함된 [코드 리포지토리](https://github.com/aws-samples/aws-step-functions-etl-pipeline-pattern/)는 사용할 수 있는 올바른 스키마와 데이터 유형이 포함된 샘플 CSV 파일을 제공합니다.)
+ 를 지원하는 웹 브라우저입니다 AWS Management Console. ([지원되는 브라우저 목록](https://aws.amazon.com/premiumsupport/knowledge-center/browsers-management-console/)을 참조하십시오.)
+ AWS Glue 콘솔 액세스.
+ AWS Step Functions 콘솔 액세스.

**제한 사항 **
+ 에서 기록 로그 AWS Step Functions를 보관하는 최대 한도는 90일입니다. 자세한 내용은 AWS Step Functions 설명서의 [Step Functions 서비스 할당량을 참조하세요](https://docs.aws.amazon.com/step-functions/latest/dg/service-quotas.html).

**제품 버전**
+ 용 Python 3.13 AWS Lambda
+ AWS Glue 버전 4.0

## 아키텍처
<a name="orchestrate-an-etl-pipeline-with-validation-transformation-and-partitioning-using-aws-step-functions-architecture"></a>

![\[Step Functions, AWS Glue 및 Amazon SNS를 통한 S3 소스 버킷의 ETL 프로세스는 10단계로 이루어집니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/8eb792b0-d35b-4a63-ba2d-71eb8d2c1203/images/054c8e9d-76a2-4334-b21a-cbe76af45923.png)


 

다이어그램에 표시된 워크플로는 다음과 같은 상위 수준 단계로 구성되어 있습니다.

1. 사용자가 Amazon S3의 소스 폴더에 CSV 파일을 업로드합니다.

1. Amazon S3 알림 이벤트는 AWS Step Functions 상태 시스템을 시작하는 AWS Lambda 함수를 시작합니다.

1. Lambda function은 원시 CSV 파일의 스키마와 데이터 유형을 검증합니다.

1. 검증 결과에 따라:

   1. 소스 파일의 검증에 성공하면 파일은 추가 처리를 위해 스테이지 폴더로 이동합니다.

   1. 검증에 실패하는 경우 파일은 오류 폴더로 이동하고 Amazon Simple Notification Service(SNS)를 통해 오류 알림이 전송됩니다.

1.  AWS Glue 크롤러는 Amazon S3의 스테이지 폴더에서 원시 파일의 스키마를 생성합니다.

1.  AWS Glue 작업은 원시 파일을 Parquet 형식으로 변환, 압축 및 분할합니다.

1. 또한 AWS Glue 작업은 파일을 Amazon S3의 변환 폴더로 이동합니다.

1.  AWS Glue 크롤러는 변환된 파일에서 스키마를 생성합니다. 결과 스키마는 모든 분석 작업에서 사용할 수 있습니다. Amazon Athena를 사용하여 임시 쿼리를 실행할 수 있습니다.

1. 파이프라인이 오류 없이 완료되면 스키마 파일이 아카이브 폴더로 이동됩니다. 오류가 발생하는 경우 파일은 대신 오류 폴더로 이동됩니다.

1. Amazon SNS는 파이프라인 완료 상태를 기반으로 성공 또는 실패를 나타내는 알림을 보냅니다.

이 패턴에 사용되는 모든 AWS 리소스는 서버리스입니다. 관리할 서버가 없습니다.

## 도구
<a name="orchestrate-an-etl-pipeline-with-validation-transformation-and-partitioning-using-aws-step-functions-tools"></a>

**AWS 서비스**
+ [AWS Glue](https://aws.amazon.com/glue/) - 고객이 분석을 위해 데이터를 쉽게 준비하고 로드할 수 있는 완전 관리형 ETL 서비스 AWS Glue 입니다.
+ [AWS Step Functions](https://aws.amazon.com/step-functions/) – AWS Step Functions 는 AWS Lambda 함수 및 기타 AWS 서비스 를 결합하여 비즈니스 크리티컬 애플리케이션을 구축할 수 있는 서버리스 오케스트레이션 서비스입니다. AWS Step Functions 그래픽 콘솔을 통해 애플리케이션의 워크플로를 일련의 이벤트 기반 단계로 볼 수 있습니다.
+ [Amazon S3](https://aws.amazon.com/s3/) - Amazon Simple Storage Service(S3)는 업계 최고의 확장성, 데이터 가용성, 보안 및 성능을 제공하는 객체 스토리지 서비스입니다.
+ [Amazon SNS](https://aws.amazon.com/sns/) - Amazon Simple Notification Service(SNS)는 가용성이 높고 내구성이 뛰어나며 안전한 완전 관리형 게시/구독 메시징 서비스로, 마이크로서비스, 분산 시스템 및 서버리스 애플리케이션을 분리할 수 있습니다.
+ [AWS Lambda](https://aws.amazon.com/lambda/) - 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있는 컴퓨팅 서비스 AWS Lambda 입니다.는 필요한 경우에만 코드를 AWS Lambda 실행하고 하루에 몇 개의 요청에서 초당 수천 개의 요청으로 자동으로 확장합니다.

**코드**

이 패턴 코드는 [AWS Step Functions가 포함된 ETL 파이프라인 AWS Step Functions](https://github.com/aws-samples/aws-step-functions-etl-pipeline-pattern) 리포지토리의 GitHub에서 사용할 수 있습니다. 코드 리포지토리에는 다음 파일과 폴더가 포함되어 있습니다.
+ `template.yml` -를 사용하여 ETL 파이프라인을 생성하기 위한 AWS CloudFormation 템플릿입니다 AWS Step Functions.
+ `parameter.json` - 모든 파라미터와 파라미터 값을 포함합니다. *에픽* 섹션에 설명된 대로 이 파일을 업데이트하여 파라미터 값을 변경합니다.
+ `myLayer/python` 폴더 -이 프로젝트에 필요한 AWS Lambda 계층을 생성하는 데 필요한 Python 패키지를 포함합니다.
+ `lambda` 폴더 - 다음과 같은 Lambda 함수를 포함합니다.
  + `move_file.py` - 소스 데이터 세트를 아카이브, 변환 또는 오류 폴더로 이동합니다.
  + `check_crawler.py` - 실패 메시지를 보내기 전에 `RETRYLIMIT `환경 변수에 의해 구성된 횟수만큼 AWS Glue 크롤러의 상태를 확인합니다.
  + `start_crawler.py` - AWS Glue 크롤러를 시작합니다.
  + `start_step_function.py` - 시작합니다 AWS Step Functions.
  + `start_codebuild.py` - AWS CodeBuild 프로젝트를 시작합니다.
  + `validation.py` - 입력 원시 데이터 세트를 검증합니다.
  + `s3object.py` - S3 버킷 내에 필요한 디렉터리 구조를 생성합니다.
  + `notification.py` - 파이프라인 끝에 성공 또는 오류 알림을 보냅니다.

샘플 코드를 사용하려면 *에픽* 섹션의 지침을 따르십시오.

## 에픽
<a name="orchestrate-an-etl-pipeline-with-validation-transformation-and-partitioning-using-aws-step-functions-epics"></a>

### 소스 파일 준비
<a name="prepare-the-source-files"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 샘플 코드 리포지토리를 복제합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/orchestrate-an-etl-pipeline-with-validation-transformation-and-partitioning-using-aws-step-functions.html) | 개발자 | 
| 파라미터 값을 업데이트합니다. | 리포지토리의 로컬 사본에서 다음과 같이 `parameter.json` 파일을 편집하고 기본 파라미터 값을 업데이트합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/orchestrate-an-etl-pipeline-with-validation-transformation-and-partitioning-using-aws-step-functions.html) | 개발자 | 
| 소스 코드를 S3 버킷에 업로드합니다. | ETL 파이프라인을 자동화하는 AWS CloudFormation 템플릿을 배포하기 전에 템플릿의 소스 파일을 패키징하여 Amazon S3 버킷에 업로드해야 합니다. 이렇게 하려면 미리 구성된 프로파일로 다음 AWS CLI 명령을 실행합니다.<pre>aws cloudformation package --template-file template.yml --s3-bucket <bucket_name> --output-template-file packaged.template --profile <profile_name></pre>여기서 각 항목은 다음과 같습니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/orchestrate-an-etl-pipeline-with-validation-transformation-and-partitioning-using-aws-step-functions.html) | 개발자 | 

### 스택 생성
<a name="create-the-stack"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| CloudFormation 템플릿을 배포합니다. |  AWS CloudFormation 템플릿을 배포하려면 다음 AWS CLI 명령을 실행합니다.<pre>aws cloudformation deploy --stack-name <stack_name> --template-file packaged.template --parameter-overrides file://parameter.json --capabilities CAPABILITY_IAM --profile <profile_name></pre>여기서 각 항목은 다음과 같습니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/orchestrate-an-etl-pipeline-with-validation-transformation-and-partitioning-using-aws-step-functions.html) | 개발자 | 
| 진행 상황을 확인합니다. | [AWS CloudFormation AWS CloudFormation 콘솔](https://console.aws.amazon.com/cloudformation/)에서 스택 개발 진행 상황을 확인합니다. 상태가 `CREATE_COMPLETE`이면 스택이 성공적으로 배포된 것입니다. | 개발자 | 
|  AWS Glue 데이터베이스 이름을 기록해 둡니다. | 스택의 **출력** 탭에는 AWS Glue 데이터베이스 이름이 표시됩니다. 키 이름이 `GlueDBOutput`입니다. | 개발자 | 

### 파이프라인 테스트
<a name="test-the-pipeline"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| ETL 파이프라인을 시작하십시오. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/orchestrate-an-etl-pipeline-with-validation-transformation-and-partitioning-using-aws-step-functions.html) | 개발자 | 
| 파티셔닝된 데이터 세트를 확인하십시오. | ETL 파이프라인이 완료되면 Amazon S3 변환 폴더(`transform` 또는 `parameter.json` 파일에 설정한 폴더 이름)에서 분할된 데이터 세트를 사용할 수 있는지 확인합니다. | 개발자 | 
| 분할된 AWS Glue 데이터베이스를 확인합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/orchestrate-an-etl-pipeline-with-validation-transformation-and-partitioning-using-aws-step-functions.html) | 개발자 | 
| 쿼리를 실행하십시오. | (선택 사항) Amazon Athena를 사용하여 파티셔닝되고 변환된 데이터베이스에서 임시 쿼리를 실행합니다. 지침은 AWS 설명서의 [ Amazon Athena에서 SQL 쿼리 실행](https://docs.aws.amazon.com/athena/latest/ug/querying-athena-tables.html)을 참조하세요. | 데이터베이스 분석가 | 

## 문제 해결
<a name="orchestrate-an-etl-pipeline-with-validation-transformation-and-partitioning-using-aws-step-functions-troubleshooting"></a>


| 문제 | Solution | 
| --- | --- | 
| AWS Identity and Access Management AWS Glue 작업 및 크롤러에 대한 (IAM) 권한 |  AWS Glue 작업 또는 크롤러를 추가로 사용자 지정하는 경우 작업에서 사용하는 IAM 역할에 적절한 IAM 권한을 부여 AWS Glue 하거나에 데이터 권한을 제공해야 합니다 AWS Lake Formation. 자세한 내용은 [AWS 설명서](https://docs.aws.amazon.com/lake-formation/latest/dg/upgrade-glue-lake-formation.html)를 참조하세요. | 

## 관련 리소스
<a name="orchestrate-an-etl-pipeline-with-validation-transformation-and-partitioning-using-aws-step-functions-resources"></a>

**AWS 서비스 설명서**
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/)
+ [AWS Glue](https://docs.aws.amazon.com/glue/)
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/)
+ [Amazon S3](https://docs.aws.amazon.com/s3/)
+ [Amazon SNS](https://docs.aws.amazon.com/sns/)

## 추가 정보
<a name="orchestrate-an-etl-pipeline-with-validation-transformation-and-partitioning-using-aws-step-functions-additional"></a>

다음 다이어그램은 AWS Step Functions **검사기** 패널에서 성공한 ETL 파이프라인의 AWS Step Functions 워크플로를 보여줍니다.** ** 

![\[입력 .csv를 검증하고, 데이터를 크롤링하고, AWS Glue 작업을 실행하기 위한 Step Functions 워크플로입니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/8eb792b0-d35b-4a63-ba2d-71eb8d2c1203/images/bd77de7b-4d04-44bb-95d2-3ec4599b3770.png)


다음 다이어그램은 Step Functions **Inspector** 패널에서 입력 검증 오류로 인해 실패하는 ETL 파이프라인의 AWS Step Functions 워크플로를 보여줍니다.

![\[파일이 오류 폴더로 이동하도록 실패가 있는 Step Functions 워크플로입니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/8eb792b0-d35b-4a63-ba2d-71eb8d2c1203/images/5fd7dd79-ba4c-4c20-b1f0-ad4b5f22bdfc.png)


 

# Amazon Redshift 기계 학습을 이용하여 고급 분석 수행
<a name="perform-advanced-analytics-using-amazon-redshift-ml"></a>

*Po Hong, Chyanna Antonio, Amazon Web Services*

## 요약
<a name="perform-advanced-analytics-using-amazon-redshift-ml-summary"></a>

Amazon Web Services(AWS) 클라우드에서는 Amazon Redshift 기계 학습(Amazon Redshift ML)을 사용하여 Amazon Redshift 클러스터 또는 Amazon Simple Storage Service(S3)에서 저장된 데이터에 대한 기계 학습 분석을 수행할 수 있습니다. Amazon Redshift 기계 학습은 일반적으로 고급 분석에 사용되는 지도 학습을 지원합니다. Amazon Redshift ML 사용 사례에는 수익 예측, 신용 카드 사기 탐지, 고객 평생 가치(CLV) 또는 고객 이탈 예측 등이 포함됩니다.

Amazon Redshift 기계 학습을 사용하면 데이터베이스 사용자가 표준 SQL 명령으로 기계 학습 모델을 쉽게 생성, 훈련 및 배포할 수 있습니다. Amazon Redshift ML은 Amazon SageMaker Autopilot을 사용하여 제어력과 가시성을 유지하면서 데이터를 기반으로 분류 또는 회귀에 가장 적합한 기계 학습 모델을 자동으로 훈련 및 조정합니다.

Amazon Redshift, Amazon S3 및 Amazon SageMaker 간의 모든 상호 작용은 추상화되어 자동화됩니다. ML 모델은 훈련 및 배포가 완료되면 Amazon Redshift에서 [사용자 정의 함수](https://docs.aws.amazon.com/redshift/latest/dg/user-defined-functions.html)(UDF)로 사용할 수 있게 되며, SQL 쿼리에 사용할 수 있습니다. 

이 패턴은 AWS Blog의 [Amazon Redshift ML과 SQL을 사용하여 Amazon Redshift에서 ML 모델을 생성, 훈련 및 배포](https://aws.amazon.com/blogs/big-data/create-train-and-deploy-machine-learning-models-in-amazon-redshift-using-sql-with-amazon-redshift-ml/), [리소스 센터 시작하기](https://aws.amazon.com/getting-started/)의 [Amazon SageMaker를 사용하여 ML 모델을 빌드, 훈련 및 배포](https://aws.amazon.com/getting-started/hands-on/build-train-deploy-machine-learning-model-sagemaker/)를 보완합니다.

## 사전 조건 및 제한 사항
<a name="perform-advanced-analytics-using-amazon-redshift-ml-prereqs"></a>

**사전 조건 **
+ 활성 상태의 AWS 계정
+ Amazon Redshift 테이블의 기존 데이터

**‬기술**
+ *기계 학습*, *훈련* 및 *예측*을 포함한 Amazon Redshift ML에서 사용하는 용어 및 개념을 숙지해야 합니다. 이에 관한 자세한 내용은 Amazon Machine Learning(Amazon ML) 설명서의 [ML 모델 훈련](https://docs.aws.amazon.com/machine-learning/latest/dg/training-ml-models.html)을 참조하세요.
+ Amazon Redshift 사용자 설정, 액세스 관리 및 표준 SQL 구문에 대한 경험이 있어야 합니다. 이에 관한 자세한 내용은 Amazon Redshift 설명서의 [Amazon Redshift 시작하기](https://docs.aws.amazon.com/redshift/latest/gsg/getting-started.html)를 참조하세요.
+ Amazon S3 및 AWS Identity and Access Management(IAM)에 관한 지식과 경험이 있어야 합니다. 
+ AWS Command Line Interface(AWS CLI)에서 명령을 실행한 경험이 있으면 유용하지만 필수 사항은 아닙니다.

**제한 사항 **
+ Amazon Redshift 클러스터와 S3 버킷이 동일한 AWS 리전에 있어야 합니다.
+ 이 패턴의 접근 방식은 회귀, 바이너리 분류 및 멀티클래스 분류와 같은 지도 학습 모델만 지원합니다. 

## 아키텍처
<a name="perform-advanced-analytics-using-amazon-redshift-ml-architecture"></a>

![\[이 워크플로는 Amazon Redshift ML이 SageMaker와 연동하여 ML 모델을 구축, 훈련 및 배포하는 방법을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/3b6a5f49-c647-45f4-940e-b623f989326a/images/36cc39fe-c1f3-4d68-b89e-e636156001a6.png)


다음 단계에서는 Amazon Redshift ML이 SageMaker와 연동하여 ML 모델을 구축, 훈련 및 배포하는 방법을 설명합니다. 

1. Amazon Redshift는 훈련 데이터를 S3 버킷으로 내보냅니다.

1. SageMaker Autopilot은 훈련 데이터를 자동으로 사전 처리합니다.

1. `CREATE MODEL` 명령문이 호출된 후 Amazon Redshift ML은 SageMaker를 훈련에 사용합니다.

1. SageMaker Autopilot은 평가 지표를 최적화하는 ML 알고리즘과 최적의 하이퍼파라미터를 검색하고 추천합니다.

1. Amazon Redshift ML은 출력 ML 모델을 Amazon Redshift 클러스터에 SQL 함수로 등록합니다.

1. 기계 학습 모델의 함수는 SQL 문에서 사용할 수 있습니다. 

**기술 스택**
+ Amazon Redshift
+ SageMaker
+ Amazon S3

## 도구
<a name="perform-advanced-analytics-using-amazon-redshift-ml-tools"></a>
+ [Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/welcome.html) – Amazon Redshift는 페타바이트 규모의 엔터프라이즈 레벨 완전 관리형 데이터 웨어하우징 서비스입니다.
+ [Amazon Redshift ML](https://docs.aws.amazon.com/redshift/latest/dg/machine_learning.html) – Amazon Redshift 기계 학습(Amazon Redshift ML)은 모든 기술 수준의 분석가와 데이터 사이언티스트가 ML 기술을 쉽게 사용할 수 있도록 하는 강력한 클라우드 기반 서비스입니다.
+ [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) – Amazon Simple Storage Service(S3)는 인터넷에 대한 스토리지입니다. 
+ [Amazon SageMaker](https://docs.aws.amazon.com/sagemaker/latest/dg/whatis.html) - Amazon SageMaker는 완전 관리형 ML 서비스입니다. 
+ [Amazon SageMaker Autopilot](https://docs.aws.amazon.com/sagemaker/latest/dg/autopilot-automate-model-development.html) - SageMaker Autopilot은 자동 기계 학습(AutoML) 프로세스의 주요 작업을 자동화하는 기능 집합입니다.

 

**코드**

다음 코드를 사용하여 Amazon Redshift에서 지도 ML 모델을 생성할 수 있습니다.

```
"CREATE MODEL customer_churn_auto_model
FROM (SELECT state,
             account_length,
             area_code,
             total_charge/account_length AS average_daily_spend, 
             cust_serv_calls/account_length AS average_daily_cases,
             churn 
      FROM customer_activity
      WHERE  record_date < '2020-01-01' 
     )
TARGET churn
FUNCTION ml_fn_customer_churn_auto
IAM_ROLE 'arn:aws:iam::XXXXXXXXXXXX:role/Redshift-ML'
SETTINGS (
  S3_BUCKET 'your-bucket'
);")
```

**참고**  
`SELECT` 상태는 Amazon Redshift 일반 테이블, Amazon Redshift Spectrum 외부 테이블 또는 둘 다를 참조할 수 있습니다.

## 에픽
<a name="perform-advanced-analytics-using-amazon-redshift-ml-epics"></a>

### 훈련 및 테스트 데이터 세트 준비
<a name="prepare-a-training-and-test-dataset"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 훈련 및 테스트 데이터 세트를 준비합니다. | AWS Management Console에 로그인한 다음 Amazon SageMaker 콘솔을 엽니다. [기계 학습 모델 구축, 훈련 및 배포](https://aws.amazon.com/getting-started/hands-on/build-train-deploy-machine-learning-model-sagemaker/) 자습서의 지침에 따라 레이블 열(*지도 학습*)이 있고 헤더가 없는.csv 또는 Apache Parquet 파일을 생성합니다. 원시 데이터 세트를 혼합하여 모델 학습을 위한 훈련 세트(70%)와 모델 성능 평가를 위한 테스트 세트(30%)로 분할하는 것이 좋습니다. | 데이터 과학자 | 

### 기술 스택 준비 및 구성
<a name="prepare-and-configure-the-technology-stack"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Amazon Redshift 클러스터를 생성하고 구성합니다. | Amazon Redshift 콘솔에서 사용자의 요건에 따라 클러스터를 생성합니다. 이에 대한 자세한 내용은 Amazon Redshift 설명서의 [클러스터 생성](https://docs.aws.amazon.com/redshift/latest/dg/tutorial-loading-data-launch-cluster.html)을 참조하세요. Amazon Redshift 클러스터는 `SQL_PREVIEW` 유지 관리 스택으로 생성해야 합니다. 트랙 미리 보기에 관한 자세한 내용은 Amazon Redshift 설명서의 [클러스터 유지 관리 트랙 선택](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-clusters.html#rs-mgmt-maintenance-tracks) 섹션을 참조하세요. | DBA, 클라우드 아키텍트 | 
| S3 버킷을 생성하여 훈련 데이터와 모델 아티팩트를 저장합니다. | Amazon S3 콘솔에서 훈련 및 테스트 데이터를 위한 S3 버킷을 생성합니다. S3 버킷 생성에 대한 자세한 내용은 AWS Quick Starts의 [S3 버킷 생성](https://docs.aws.amazon.com/quickstarts/latest/s3backup/step-1-create-bucket.html)을 참조하세요. Amazon Redshift 클러스터와 S3 버킷이 같은 리전에 있는지 확인하세요.  | DBA, 클라우드 아키텍트 | 
| IAM 정책을 생성하여 Amazon Redshift 클러스터에 연결합니다. | Amazon Redshift 클러스터가 SageMaker 및 Amazon S3에 액세스할 수 있도록 허용하는 IAM 정책을 생성합니다. 지침 및 단계는 Amazon Redshift 설명서에서 [Amazon Redshift ML을 사용하기 위한 클러스터 설정](https://docs.aws.amazon.com/redshift/latest/dg/cluster-setup.html)을 참조하세요. | DBA, 클라우드 아키텍트 | 
| Amazon Redshift 사용자 및 그룹이 스키마와 테이블에 액세스할 수 있도록 허용합니다. | Amazon Redshift의 사용자 및 그룹이 내부 및 외부 스키마와 테이블에 액세스할 수 있도록 권한을 부여합니다. 단계 및 지침은 Amazon Redshift 설명서의 [권한 및 소유권 관리](https://docs.aws.amazon.com/redshift/latest/dg/permissions-ownership.html)를 참조하세요. | DBA | 

### Amazon Redshift에서 ML 모델 생성 및 훈련
<a name="create-and-train-the-ml-model-in-amazon-redshift"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Amazon Redshift에서 ML 모델을 생성하고 훈련합니다. | Amazon Redshift ML에서 ML 모델을 생성하고 훈련합니다. 자세한 내용은 Amazon Redshift 설명서의 `CREATE MODEL` 명령문을 참조하세요. | 개발자, 데이터 사이언티스트 | 

### Amazon Redshift에서 배치 추론 및 예측 수행
<a name="perform-batch-inference-and-prediction-in-amazon-redshift"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 생성된 ML 모델 함수를 사용하여 추론을 수행합니다. | 생성된 ML 모델 함수를 사용하여 추론을 수행하는 방법에 대한 자세한 내용은 Amazon Redshift 설명서의 [예측](https://docs.aws.amazon.com/redshift/latest/dg/prediction.html)을 참조하세요. | 데이터 사이언티스트, 비즈니스 인텔리전스 사용자 | 

## 관련 리소스
<a name="perform-advanced-analytics-using-amazon-redshift-ml-resources"></a>

**훈련 및 테스트 데이터 세트 준비**
+ [Amazon SageMaker를 사용하여 기계 학습 모델 구축, 훈련 및 배포](https://aws.amazon.com/getting-started/hands-on/build-train-deploy-machine-learning-model-sagemaker/)

 

**기술 스택 준비 및 구성**
+ [Amazon Redshift 클러스터 생성](https://docs.aws.amazon.com/redshift/latest/dg/tutorial-loading-data-launch-cluster.html)
+ [Amazon Redshift 클러스터 유지 관리 트랙 선택](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-clusters.html#rs-mgmt-maintenance-tracks)
+ [S3 버킷 생성](https://docs.aws.amazon.com/quickstarts/latest/s3backup/step-1-create-bucket.html)
+ [Amazon Redshift ML 사용을 위해 Amazon Redshift 클러스터 설정](https://docs.aws.amazon.com/redshift/latest/dg/cluster-setup.html)
+ [Amazon Redshift에서 권한 및 소유권 관리](https://docs.aws.amazon.com/redshift/latest/dg/permissions-ownership.html)

 

**Amazon Redshift에서 ML 모델 생성 및 훈련**
+ [Amazon Redshift에서 CREATE MODEL 문 생성](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_MODEL.html#r_simple_create_model) 

 

**Amazon Redshift에서 배치 추론 및 예측 수행**
+ [Amazon Redshift에서 예측](https://docs.aws.amazon.com/redshift/latest/dg/prediction.html) 

 

**기타 리소스**
+ [Amazon Redshift ML 시작하기](https://docs.aws.amazon.com/redshift/latest/dg/geting-started-machine-learning.html)
+ [Amazon Redshift ML과 SQL을 사용하여 Amazon Redshift에서 ML 모델 생성, 훈련 및 배포](https://aws.amazon.com/blogs/big-data/create-train-and-deploy-machine-learning-models-in-amazon-redshift-using-sql-with-amazon-redshift-ml/)
+ [Amazon Redshift 파트너](https://aws.amazon.com/redshift/partners/?partner-solutions-cards.sort-by=item.additionalFields.partnerNameLower&partner-solutions-cards.sort-order=aschttps://aws.amazon.com/redshift/partners/?partner-solutions-cards.sort-by=item.additionalFields.partnerNameLower&partner-solutions-cards.sort-order=asc)
+ [AWS 기계 학습 컴피턴시 파트너](https://aws.amazon.com/machine-learning/partner-solutions/?partner-solutions-cards.sort-by=item.additionalFields.partnerNameLower&partner-solutions-cards.sort-order=asc)

# Amazon Athena를 사용하여 SQL로 Amazon DynamoDB 테이블 쿼리
<a name="query-amazon-dynamodb-tables-sql-amazon-athena"></a>

*Gavin Perrie, Ajit Ambike, Brad Yates, Amazon Web Services*

## 요약
<a name="query-amazon-dynamodb-tables-sql-amazon-athena-summary"></a>

데이터에 Amazon Simple Storage Service(Amazon S3) 이외의 소스가 포함된 경우 페더레이션 쿼리를 사용하여 해당 관계형, 비관계형, 객체 또는 사용자 지정 데이터 소스에 액세스할 수 있습니다. 이 패턴에서는 SQL 데이터 소스 커넥터를 사용하여 Amazon Athena를 통해 Amazon DynamoDB로 페더레이션 쿼리 액세스를 구성하는 방법을 보여줍니다.

이 패턴을 사용하여 다음을 수행할 수 있습니다.
+ SQL을 사용하여 DynamoDB 테이블을 쿼리합니다.
+ Athena에서 페더레이션 SQL 쿼리를 실행하고 DynamoDB 테이블을 지원되는 다른 데이터 소스와 조인합니다.

## 사전 조건 및 제한 사항
<a name="query-amazon-dynamodb-tables-sql-amazon-athena-prereqs"></a>

**사전 조건 **
+ DynamoDB 테이블
+ Athena 엔진 버전 2를 사용하도록 설정된 Athena 작업 그룹입니다. 지침은 [Athena 설명서](https://docs.aws.amazon.com/athena/latest/ug/engine-versions-changing.html)를 참조하세요.
+ `AthenaDynamoDBConnector` AWS Lambda 함수가 데이터를 유출할 수 있는 S3 버킷입니다. S3 버킷과 Lambda 함수는 동일한 AWS 리전에 있어야 합니다.

Athena에 처음 액세스하는 경우 쿼리 결과 위치로 사용할 추가 S3 버킷이 필요합니다. 지침은 [Athena 설명서](https://docs.aws.amazon.com/athena/latest/ug/querying.html#query-results-specify-location-console)를 참조하세요.

**제한 사항 **
+ [INSERT INTO](https://docs.aws.amazon.com/athena/latest/ug/insert-into.html)와 같은 쓰기 작업은 지원되지 않습니다.** ** 

**제품 버전**
+ [GitHub의 Athena 쿼리 페더레이션 릴리스](https://github.com/awslabs/aws-athena-query-federation/releases)

## 아키텍처
<a name="query-amazon-dynamodb-tables-sql-amazon-athena-architecture"></a>

**대상 아키텍처**

다음 다이어그램은 패턴이 설정된 후의 연결 흐름을 보여줍니다. 사용자는 Amazon Athena에 연결하여 쿼리를 제공합니다. Athena는 쿼리와 대상을 DynamoDB 데이터 소스 커넥터 Lambda 함수로 전달하여 데이터를 검색하고 Athena에 반환합니다. 대량의 데이터가 반환되면 Athena는 전체 데이터 세트를 패키징하고 반환하기 전에 유출 버킷에 임시 결과를 저장합니다.

![\[사용자에게서 Athena, Lambda로 이어지는 워크플로로, S3 버킷 및 DynamoDB 테이블에 연결됩니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/9d1ee529-36f3-4c7e-a2e7-05b76e09a3d8/images/e50a00cf-a55a-4def-81d5-4d2755dc9a97.png)


## 도구
<a name="query-amazon-dynamodb-tables-sql-amazon-athena-tools"></a>

**AWS 서비스**
+ [Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/what-is.html)는 표준 SQL을 사용하여 Amazon Simple Storage Service(S3)에 있는 데이터를 직접 간편하게 분석할 수 있는 대화형 쿼리 서비스입니다. 이 패턴은 [Amazon Athena Query Federation SDK를 사용하여 빌드되고를 통해 애플리케이션으로 설치된 도구인 Amazon Athena DynamoDB 커넥터를](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-dynamodb) 사용합니다 AWS Serverless Application Repository. Amazon Athena AWS Lambda 
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html)는 빠르고 예측 가능하고 확장 가능한 성능을 제공하는 완전 관리형 NoSQL 데이터베이스 서비스입니다.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.
+ [Amazon Simple Storage Service(S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)는 원하는 양의 데이터를 저장, 보호 및 검색하는 데 도움이 되는 클라우드 기반 객체 스토리지 서비스입니다.

**코드 리포지토리**

이 패턴의 코드는 GitHub [Athena Query Federation](https://github.com/awslabs/aws-athena-query-federation/releases) 리포지토리에서 확인할 수 있습니다.

## 에픽
<a name="query-amazon-dynamodb-tables-sql-amazon-athena-epics"></a>

### DynamoDB 데이터 소스 커넥터 설정 및 테스트
<a name="set-up-and-test-the-ddb-data-source-connector"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| AthenaDynamoDBConnector 애플리케이션을 배포합니다. | AthenaDynamoDBConnecter를 배포하려면 다음을 수행합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/query-amazon-dynamodb-tables-sql-amazon-athena.html) | DevOps | 
| Athena의 데이터 소스를 생성합니다. | 데이터 소스를 생성하려면 다음을 수행합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/query-amazon-dynamodb-tables-sql-amazon-athena.html) | DevOps | 
| Athena를 사용하여 DynamoDB 테이블을 쿼리합니다. | DynamoDB 테이블을 쿼리하려면 다음을 수행합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/query-amazon-dynamodb-tables-sql-amazon-athena.html) | 앱 개발자 | 

## 문제 해결
<a name="query-amazon-dynamodb-tables-sql-amazon-athena-troubleshooting"></a>


| 문제 | Solution | 
| --- | --- | 
| `GENERIC_INTERNAL_ERROR: The bucket is in this region: <region>` 오류가 발생하면서 쿼리가 실패합니다*.* | Athena 유출 버킷과 Lambda 함수가 동일한 AWS 리전에 생성되었는지 확인합니다. | 
| 새로 생성된 데이터 소스는 Athena 콘솔에 표시되지 않습니다. | Athena 데이터 카탈로그는 리전별로 제공됩니다. Athena를 사용하려는 리전에 `AthenaDynamoDBConnector`가 배포되었는지 확인합니다. | 
| 새로 생성된 데이터 소스에 대해 쿼리를 실행할 수 없습니다. | **쿼리 결과 위치**가 설정되었는지 확인합니다. | 

## 관련 리소스
<a name="query-amazon-dynamodb-tables-sql-amazon-athena-resources"></a>
+ [Amazon Athena DynamoDB 커넥터](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-dynamodb)
+ [Amazon Athena 페더레이션 쿼리](https://docs.aws.amazon.com/athena/latest/ug/connect-to-a-data-source.html)

# Athena를 사용한 Amazon DynamoDB 테이블 액세스, 쿼리 및 조인
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena"></a>

*Moinul Al-Mamun, Amazon Web Services*

## 요약
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-summary"></a>

이 패턴은 Amazon Athena DynamoDB 커넥터를 사용하여 Amazon Athena와 Amazon DynamoDB 간의 연결을 설정하는 방법을 보여줍니다. 커넥터는 AWS Lambda 함수를 사용하여 DynamoDB의 데이터를 쿼리합니다. 연결을 설정하기 위해 코드를 작성할 필요가 없습니다. 연결이 설정되면 Athena [페더레이션 쿼리](https://docs.aws.amazon.com/athena/latest/ug/connect-to-a-data-source.html)를 사용해 Athena에서 SQL 명령을 실행하여 DynamoDB 테이블에 빠르게 액세스하고 분석할 수 있습니다. 또한 하나 이상의 DynamoDB 테이블을 서로 조인하거나 Amazon Redshift 또는 Amazon Aurora와 같은 다른 데이터 소스에 조인할 수 있습니다.

## 사전 조건 및 제한 사항
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-prereqs"></a>

**사전 조건 **
+ DynamoDB 테이블, Athena 데이터 소스, Lambda, AWS Identity and Access Management(IAM) 역할을 관리할 권한이 있는 활성 AWS 계정
+ Athena가 쿼리 결과를 저장할 수 있는 Amazon Simple Storage Service(S3) 버킷
+ Athena DynamoDB 커넥터가 데이터를 단기간에 저장할 수 있는 S3 버킷
+ [Athena 엔진 버전 2](https://docs.aws.amazon.com/athena/latest/ug/engine-versions-reference-0002.html)를 지원하는 AWS 리전
+ Athena 및 필수 S3 버킷에 액세스할 수 있는 IAM 권한
+ [Amazon Athena DynamoDB 커넥터](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-dynamodb), 설치됨

**제한 사항 **

DynamoDB 테이블을 쿼리하는 데는 비용이 듭니다. 테이블 크기가 몇 기가바이트(GB)를 초과하면 비용이 많이 들 수 있습니다. 전체 테이블 SCAN 작업을 수행하기 전에 비용을 고려하는 것이 좋습니다. 자세한 내용은 [Amazon DynamoDB 요금](https://aws.amazon.com/dynamodb/pricing/)을 참조하세요. 비용을 줄이고 높은 퍼포먼스를 달성하려면 쿼리에 항상 LIMIT를 사용하는 것이 좋습니다(예:`SELECT * FROM table1 LIMIT 10`). 또한 프로덕션 환경에서 JOIN 또는 GROUP BY 쿼리를 수행하기 전에 테이블 크기를 고려해야 합니다. 테이블이 너무 크면 [테이블을 Amazon S3로 마이그레이션](https://aws.amazon.com/blogs/database/simplify-amazon-dynamodb-data-extraction-and-analysis-by-using-aws-glue-and-amazon-athena/)하는 등의 대체 옵션을 고려해 보세요.

## 아키텍처
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-architecture"></a>

다음 다이어그램은 사용자가 Athena의 DynamoDB 테이블에서 SQL 쿼리를 실행하는 방법을 보여 줍니다.

![\[Athena와 DynamoDB를 연결하여 SQL 쿼리를 실행하기 위한 워크플로.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/e6ff94af-d208-40c7-94e4-af257755a603/images/bc8e0132-b578-463b-bf55-3c39ce359c17.png)


이 다이어그램은 다음 워크플로를 보여줍니다.

1. DynamoDB 테이블을 쿼리하기 위해 사용자는 Athena에서 SQL 쿼리를 실행합니다.

1. Athena는 Lambda 함수를 시작합니다.

1. Lambda 함수는 DynamoDB 테이블의 요청된 데이터를 쿼리합니다.

1. DynamoDB는 요청된 데이터를 Lambda 함수에 반환합니다. 그런 다음 함수는 Athena를 통해 쿼리 결과를 사용자에게 전송합니다.

1. Lambda 함수는 S3 버킷에 데이터를 저장합니다.

**기술 스택**
+ Amazon Athena
+ Amazon DynamoDB
+ Amazon S3
+ AWS Lambda

## 도구
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-tools"></a>
+ [Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/what-is.html)는 표준 SQL을 사용하여 Amazon S3에 있는 데이터를 직접 분석할 수 있는 대화형 쿼리 서비스입니다.
+ [Amazon Athena DynamoDB 커넥터](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-dynamodb)는 Athena가 DynamoDB에 연결하고 SQL 쿼리를 사용하여 테이블에 액세스할 수 있도록 하는 AWS 도구입니다.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html)는 빠르고 예측 가능하고 확장 가능한 성능을 제공하는 완전 관리형 NoSQL 데이터베이스 서비스입니다.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.

## 에픽
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-epics"></a>

### 샘플 DynamoDB 테이블 생성
<a name="create-sample-dynamodb-tables"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 첫 번째 샘플 테이블을 생성합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/access-query-and-join-amazon-dynamodb-tables-using-athena.html) | 개발자 | 
| 첫 번째 테이블에 샘플 데이터를 삽입합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/access-query-and-join-amazon-dynamodb-tables-using-athena.html)<pre>{<br />  "PK1": "1234",<br />  "SK1": "info",<br />  "Salary": "5000"<br /> }</pre><pre>{<br />  "PK1": "1235",<br />  "SK1": "info",<br />  "Salary": "5200"<br /> }</pre> | 개발자 | 
| 두 번째 샘플 테이블을 생성합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/access-query-and-join-amazon-dynamodb-tables-using-athena.html) | 개발자 | 
| 두 번째 테이블에 샘플 데이터를 삽입합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/access-query-and-join-amazon-dynamodb-tables-using-athena.html)<pre>{<br />  "PK2": "1234",<br /> "SK2": "bonus",<br /> "Bonus": "500"<br />}</pre><pre>{<br />  "PK2": "1235",<br /> "SK2": "bonus",<br /> "Bonus": "1000"<br />}</pre> | 개발자 | 

### Athena에서 DynamoDB용 데이터 소스를 생성
<a name="create-a-data-source-in-athena-for-dynamodb"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 데이터 소스 커넥터를 설정합니다. | DynamoDB용 데이터 소스를 생성한 다음 Lambda 함수를 생성하여 해당 데이터 소스에 연결합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/access-query-and-join-amazon-dynamodb-tables-using-athena.html) | 개발자 | 
| Lambda 함수가 S3 유출 버킷에 액세스할 수 있는지 확인합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/access-query-and-join-amazon-dynamodb-tables-using-athena.html)오류가 발생하는 경우 이 패턴의 *추가 정보* 섹션에서 지침을 참조하세요. | 개발자 | 

### Athena에서 DynamoDB 테이블에 액세스
<a name="access-dynamodb-tables-from-athena"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| DynamoDB 테이블을 쿼리합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/access-query-and-join-amazon-dynamodb-tables-using-athena.html) | 개발자 | 
| 두 DynamoDB 테이블을 조인합니다. | DynamoDB는 NoSQL 데이터 스토어이며 SQL 조인 작업을 지원하지 않습니다. 따라서 두 DynamoDB 테이블에서 조인 작업을 수행해야 합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/access-query-and-join-amazon-dynamodb-tables-using-athena.html)<pre>SELECT pk1, salary, bonus FROM dydbtable1 t1<br /> JOIN dydbtable2 t2 ON t1.pk1 = t2.pk2;</pre> | 개발자 | 

## 관련 리소스
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-resources"></a>
+ [Amazon Athena DynamoDB 커넥터](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-dynamodb)(AWS 랩)
+ [Amazon Athena의 새로운 페더레이션 쿼리로 모든 데이터 소스를 쿼리](https://aws.amazon.com/blogs/big-data/query-any-data-source-with-amazon-athenas-new-federated-query/)(AWS 빅 데이터 블로그)
+ [Athena 엔진 버전 참조](https://docs.aws.amazon.com/athena/latest/ug/engine-versions-reference.html)(Athena 사용자 가이드)
+ [AWS Glue 및 Amazon Athena를 사용하여 Amazon DynamoDB 데이터 추출 및 분석을 간소화하세요](https://aws.amazon.com/blogs/database/simplify-amazon-dynamodb-data-extraction-and-analysis-by-using-aws-glue-and-amazon-athena/)(AWS 데이터베이스 블로그)

## 추가 정보
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-additional"></a>

Athena에서 `{bucket_name}/folder_name/` 형식의 `spill_bucket`을(를) 사용하여 쿼리를 실행하면 다음과 같은 오류 메시지가 나타날 수 있습니다.

```
"GENERIC_USER_ERROR: Encountered an exception[java.lang.RuntimeException] from your LambdaFunction[arn:aws:lambda:us-east-1:xxxxxx:function:testdynamodb] executed in context[retrieving meta-data] with message[You do NOT own the spill bucket with the name: s3://amzn-s3-demo-bucket/athena_dynamodb_spill_data/]
This query ran against the "default" database, unless qualified by the query. Please post the error message on our forum  or contact customer support with Query Id: [query-id]"
```

이 오류를 해결하려면 Lambda 함수의 환경 변수를 `spill_bucket`에서 `{bucket_name_only}`(으)로 업데이트한 다음 버킷 쓰기 액세스에 대한 다음 Lambda IAM 정책을 업데이트하세요.

```
{
             "Action": [
                 "s3:GetObject",
                 "s3:ListBucket",
                 "s3:GetBucketLocation",
                 "s3:GetObjectVersion",
                 "s3:PutObject",
                 "s3:PutObjectAcl",
                 "s3:GetLifecycleConfiguration",
                 "s3:PutLifecycleConfiguration",
                 "s3:DeleteObject"
            ],
             "Resource": [
                 "arn:aws:s3:::spill_bucket",
                 "arn:aws:s3:::spill_bucket/*"
            ],
             "Effect": "Allow"
        }
```

또는 이전에 만든 Athena 데이터 소스 커넥터를 제거하고 `spill_bucket`에 `{bucket_name}`만 사용하여 새로 생성하세요.

# 스칼라 Python UDF를 사용하여 Amazon Redshift 쿼리 결과에 대한 언어별 정렬 설정
<a name="set-up-language-specific-sorting-for-amazon-redshift-query-results-using-a-scalar-python-udf"></a>

*Ethan Stark, Amazon Web Services*

## 요약
<a name="set-up-language-specific-sorting-for-amazon-redshift-query-results-using-a-scalar-python-udf-summary"></a>

이 패턴은 스칼라 Python UDF(사용자 정의 함수)를 사용하여 Amazon Redshift 쿼리 결과에 대해 대소문자를 구분하지 않는 언어 정렬을 설정하는 단계 및 샘플 코드를 제공합니다. Amazon Redshift는 바이너리 UTF-8 순서를 기준으로 결과를 반환하며 언어별 정렬을 지원하지 않으므로 스칼라 Python UDF를 사용해야 합니다. Python UDF는 Python 프로그램을 기반으로 하며 데이터 웨어하우스에서 실행되는 비SQL 처리 코드입니다. 단일 쿼리에서 SQL 문을 사용하여 Python UDF 코드를 실행할 수 있습니다. 자세한 내용은 [Amazon Redshift 빅 데이터 블로그 게시물의 Python UDFs](https://aws.amazon.com/blogs/big-data/introduction-to-python-udfs-in-amazon-redshift/) AWS .

이 패턴의 샘플 데이터는 데모용으로 튀르키예어 알파벳을 기반으로 합니다. 이 패턴의 스칼라 Python UDF는 Amazon Redshift의 기본 쿼리 결과가 튀르키예어 문자의 언어 순서를 따르도록 구축되었습니다. 자세한 내용은 이 패턴의 *추가 정보* 섹션에서 *튀르키예어 예*를 참조하세요. 다른 언어에 대해 이 패턴의 스칼라 Python UDF를 수정할 수 있습니다.

## 사전 조건 및 제한 사항
<a name="set-up-language-specific-sorting-for-amazon-redshift-query-results-using-a-scalar-python-udf-prereqs"></a>

**사전 조건 **
+ 데이터베이스, 스키마 및 테이블이 있는 [Amazon Redshift 클러스터](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-clusters.html) 
+ `CREATE TABLE` 및 `CREATE FUNCTION` 권한이 있는 [Amazon Redshift 사용자](https://docs.aws.amazon.com/redshift/latest/dg/r_Users.html) 
+ [Python 2.7](https://www.python.org/download/releases/2.7/) 이상

**제한 사항 **

이 패턴의 쿼리에서 사용하는 언어 정렬은 대소문자를 구분하지 않습니다.

## 도구
<a name="set-up-language-specific-sorting-for-amazon-redshift-query-results-using-a-scalar-python-udf-tools"></a>

**AWS 서비스**
+ [Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/gsg/getting-started.html)는 AWS 클라우드에서 관리되는 페타바이트급 데이터 웨어하우스 서비스입니다. Amazon Redshift는 데이터 레이크와 통합되므로 데이터를 사용하여 비즈니스 및 고객에 대한 새로운 인사이트를 얻을 수 있습니다.

**기타 도구**
+ [Python(UDF) 사용자 정의 함수](https://docs.snowflake.com/en/developer-guide/udf/python/udf-python-introduction.html)는 Python으로 작성한 다음 SQL 문에서 호출할 수 있는 함수입니다.

## 에픽
<a name="set-up-language-specific-sorting-for-amazon-redshift-query-results-using-a-scalar-python-udf-epics"></a>

### 쿼리 결과를 언어순으로 정렬하는 코드 개발
<a name="develop-code-to-sort-query-results-in-linguistic-order"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 샘플 데이터용 테이블을 생성합니다. | Amazon Redshift에서 테이블을 생성하고 샘플 데이터를 테이블에 삽입하려면 다음 SQL 문을 사용합니다.<pre>CREATE TABLE my_table (first_name varchar(30));<br /><br />INSERT INTO my_table (first_name)<br />VALUES<br />    ('ali'),<br />    ('Ali'),<br />    ('ırmak'),<br />    ('IRMAK'),<br />    ('irem'),<br />    ('İREM'),<br />    ('oğuz'),<br />    ('OĞUZ'),<br />    ('ömer'),<br />    ('ÖMER'),<br />    ('sedat'),<br />    ('SEDAT'),<br />    ('şule'),</pre>샘플 데이터의 첫 번째 이름에는 튀르키예어 알파벳의 특수 문자가 포함됩니다. 이 예제의 튀르키예어 고려 사항에 대한 자세한 내용은 이 패턴의 *추가 정보* 섹션에서 *튀르키예어 예*를 참조하세요. | 데이터 엔지니어 | 
| 샘플 데이터의 기본 정렬을 확인합니다. | Amazon Redshift에서 샘플 데이터의 기본 정렬을 확인하려면 다음 쿼리를 실행합니다.<pre>SELECT first_name FROM my_table ORDER BY first_name;</pre>쿼리는 이전에 생성한 테이블에서 첫 번째 이름의 목록을 반환합니다.<pre>first_name<br />---------------<br />Ali<br />IRMAK<br />OĞUZ<br />SEDAT<br />ali<br />irem<br />oğuz<br />sedat<br />ÖMER<br />ömer<br />İREM<br />ırmak<br />ŞULE<br />şule</pre>기본 바이너리 UTF-8 순서는 튀르키예어 특수 문자의 언어 순서를 수용하지 않으므로 쿼리 결과의 순서가 올바르지 않습니다. | 데이터 엔지니어 | 
| 스칼라 Python UDF를 생성합니다. | 스칼라 Python UDF를 생성하려면 다음 SQL 코드를 사용합니다. <pre>CREATE OR REPLACE FUNCTION collate_sort (value varchar) <br />RETURNS varchar <br />IMMUTABLE <br />AS <br />$$    <br />    def sort_str(val):<br />        import string<br />        <br />        dictionary = {<br />            'I': 'ı', <br />            'ı': 'h~', <br />            'İ': 'i', <br />            'Ş': 's~', <br />            'ş': 's~', <br />            'Ğ': 'g~', <br />            'ğ': 'g~', <br />            'Ü': 'u~', <br />            'ü': 'u~', <br />            'Ö': 'o~', <br />            'ö': 'o~', <br />            'Ç': 'c~', <br />            'ç': 'c~'<br />        }<br />        <br />        for key, value in dictionary.items():<br />            val = val.replace(key, value)<br />        <br />        return val.lower()<br /> <br />    return sort_str(value)<br />    <br />$$ LANGUAGE plpythonu;</pre> | 데이터 엔지니어 | 
| 샘플 데이터를 쿼리합니다. | Python UDF를 사용하여 샘플 데이터를 쿼리하려면 다음 SQL 쿼리를 실행합니다.<pre>SELECT first_name FROM my_table ORDER BY collate_sort(first_name);</pre>이제 쿼리는 샘플 데이터를 튀르키예어 언어 순서로 반환합니다.<pre>first_name<br />---------------<br />ali<br />Ali<br />ırmak<br />IRMAK<br />irem<br />İREM<br />oğuz<br />OĞUZ<br />ömer<br />Ömer<br />sedat<br />SEDAT<br />şule<br />ŞULE</pre> | 데이터 엔지니어 | 

## 관련 리소스
<a name="set-up-language-specific-sorting-for-amazon-redshift-query-results-using-a-scalar-python-udf-resources"></a>
+ [ORDER BY 절](https://docs.aws.amazon.com/redshift/latest/dg/r_ORDER_BY_clause.html)(Amazon Redshift 설명서)
+ [스칼라 Python UDF 생성](https://docs.aws.amazon.com/redshift/latest/dg/udf-creating-a-scalar-udf.html)(Amazon Redshift 설명서)

## 추가 정보
<a name="set-up-language-specific-sorting-for-amazon-redshift-query-results-using-a-scalar-python-udf-additional"></a>

**튀르키예어 예**

Amazon Redshift는 언어별 정렬 순서가 아닌 바이너리 UTF-8 정렬 순서를 기준으로 쿼리 결과를 반환합니다. 즉, 튀르키예어 문자를 포함하는 Amazon Redshift 테이블을 쿼리하면 쿼리 결과는 튀르키예어의 언어 순서에 따라 정렬되지 않습니다. 튀르키예어에는 로마자에 나타나지 않는 6개의 특수 문자(ç, ı, ğ, ö, ş, ü)가 포함되어 있습니다. 다음 표와 같이 이러한 특수 문자는 바이너리 UTF-8 순서를 기준으로 정렬된 결과 세트의 끝에 배치됩니다.


| 
| 
| 바이너리 UTF-8 순서 | 튀르키예어 언어 순서 | 
| --- |--- |
| a | a | 
| b | b | 
| c | c | 
| d | **ç(\$1)** | 
| e | d | 
| f | e | 
| g | f | 
| h | g | 
| i | **ğ(\$1)** | 
| j | h | 
| k | **ı(\$1)** | 
| l | i | 
| m | j | 
| n | k | 
| o | l | 
| p | m | 
| r | n | 
| s | o | 
| t | **ö(\$1)** | 
| u | p | 
| v | r | 
| y | s | 
| z | **ş(\$1)** | 
| **ç(\$1)** | t | 
| **ğ(\$1)** | u | 
| **ı(\$1)** | **ü(\$1)** | 
| **ö(\$1)** | v | 
| **ş(\$1)** | y | 
| **ü(\$1)** | z | 

**참고**  
별표(\$1)는 튀르키예어의 특수 문자를 나타냅니다.

위 표에서 볼 수 있듯이 특수 문자 **ç**는 튀르키예어 언어 순서에서는 **c**와 **d** 사이에 있지만 바이너리 UTF-8 순서에서는 **z** 뒤에 나타납니다. 이 패턴의 스칼라 Python UDF는 다음 문자 대체 사전을 사용하여 튀르키예어 특수 문자를 해당하는 로마자 문자로 대체합니다.


| 
| 
| 튀르키예어 특수 문자 | 로마자 해당 문자 | 
| --- |--- |
| ç | c\$1 | 
| ı | h\$1 | 
| ğ | g\$1 | 
| ö | o\$1 | 
| ş | s\$1 | 
| ü | u\$1 | 

**참고**  
해당 튀르키예어 특수 문자를 대체하는 로마자 문자 끝에는 물결표(\$1) 문자가 추가됩니다.

**스칼라 Python UDF 함수 수정**

함수가 locate 파라미터를 받아들이고 여러 트랜잭션 사전을 지원하도록 이 패턴에서 스칼라 Python UDF 함수를 수정하려면 다음 SQL 코드를 사용합니다.

```
CREATE OR REPLACE FUNCTION collate_sort (value varchar, locale varchar) 
RETURNS varchar 
IMMUTABLE 
AS 
$$    
    def sort_str(val):
       import string
       # Turkish Dictionary
       if locale == 'tr-TR':
            dictionary = {
               'I': 'ı', 
               'ı': 'h~', 
               'İ': 'i', 
               'Ş': 's~', 
               'ş': 's~', 
               'Ğ': 'g~', 
               'ğ': 'g~', 
               'Ü': 'u~', 
               'ü': 'u~', 
               'Ö': 'o~', 
               'ö': 'o~', 
               'Ç': 'c~', 
               'ç': 'c~'
        }
        # German Dictionary
        if locale == 'de-DE':
            dictionary = {
               ....
               ....
        }
        
        for key, value in dictionary.items():
            val = val.replace(key, value)
        
        return val.lower()
 
    return sort_str(value)
    
$$ LANGUAGE plpythonu;
```

다음 예제 코드에서는 수정된 Python UDF를 쿼리하는 방법을 보여 줍니다.

```
SELECT first_name FROM my_table ORDER BY collate_order(first_name, 'tr-TR');
```

# Lambda 함수가 서로 다른 AWS 리전의 S3 버킷에서 이벤트 알림을 수신하도록 Lambda 함수 구독
<a name="subscribe-a-lambda-function-to-event-notifications-from-s3-buckets-in-different-aws-regions"></a>

*Suresh Konathala, Amazon Web Services*

*Andrew Preston, Arindom Sarkar, None*

## 요약
<a name="subscribe-a-lambda-function-to-event-notifications-from-s3-buckets-in-different-aws-regions-summary"></a>

[Amazon Simple Storage Service(S3) 이벤트 알림](https://docs.aws.amazon.com/AmazonS3/latest/userguide/NotificationHowTo.html)은 S3 버킷의 특정 이벤트(예: 객체 생성 이벤트, 객체 제거 이벤트 또는 객체 복원 이벤트)에 대한 알림을 게시합니다. AWS Lambda 함수를 사용하여 애플리케이션의 요구 사항에 따라 이러한 알림을 처리할 수 있습니다. 하지만 Lambda 함수는 다른 AWS 리전에서 호스팅되는 S3 버킷의 알림을 직접 구독할 수 없습니다.

이 패턴의 접근 방식은 각 리전의 Amazon Simple Notification Service(SNS) 주제를 사용하여 리전 간 S3 버킷의 Amazon S3 알림을 처리하는 [팬아웃 시나리오](https://docs.aws.amazon.com/sns/latest/dg/sns-common-scenarios.html)를 배포합니다. 이러한 리전 SNS 주제는 Lambda 함수가 포함된 중앙 리전의 Amazon Simple Queue Service(Amazon SQS) 대기열로 Amazon S3 이벤트 알림을 보냅니다. Lambda 함수는 이 SQS 대기열을 구독하고 조직의 요구 사항에 따라 이벤트 알림을 처리합니다.

## 사전 조건 및 제한 사항
<a name="subscribe-a-lambda-function-to-event-notifications-from-s3-buckets-in-different-aws-regions-prereqs"></a>

**사전 조건 **
+ 활성 상태의 AWS 계정.
+ Amazon SQS 대기열 및 Lambda 함수를 호스팅하는 중앙 리전을 포함하여 여러 리전의 기존 S3 버킷.
+ AWS Command Line Interface(AWS CLI), 설치 및 구성됨. 이에 관한 자세한 내용은 AWS CLI 설명서의 [AWS CLI 설치, 업데이트 및 제거](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)를 참조하십시오. 
+ Amazon SNS의 팬아웃 시나리오에 익숙해야 합니다. 이에 대한 자세한 내용은 Amazon SNS 설명서에서 [일반적인 Amazon SNS 시나리오](https://docs.aws.amazon.com/sns/latest/dg/sns-common-scenarios.html)를 참조하십시오.

## 아키텍처
<a name="subscribe-a-lambda-function-to-event-notifications-from-s3-buckets-in-different-aws-regions-architecture"></a>

다음 다이어그램은 이 패턴 접근 방식의 아키텍처를 보여줍니다. 

![\[워크플로에서는 Amazon SNS, S3 및 SQS를 사용하여 리전 간 S3 버킷의 이벤트 알림을 처리합니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/cf6c1804-8c41-46f1-9f17-ff361708c595/images/760cf4c0-0cb3-48d1-92ae-1cf0fa8ae076.png)


이 다이어그램은 다음 워크플로를 보여줍니다.

1. Amazon S3는 S3 버킷(예: 객체 생성, 제거된 객체 또는 복원된 객체)에 대한 이벤트 알림을 동일한 리전의 SNS 주제로 전송합니다.

1. SNS 주제는 중앙 리전의 SQS 대기열에 이벤트를 게시합니다.

1. SQS 대기열은 Lambda 함수의 이벤트 소스로 구성되며 Lambda 함수의 이벤트 메시지를 버퍼링합니다. 

1. Lambda 함수는 SQS 대기열에서 메시지를 폴링하고 애플리케이션의 요구 사항에 따라 Amazon S3 이벤트 알림을 처리합니다.

 

**기술 스택  **
+ Lambda
+ Amazon SNS
+  Amazon SQS
+ Amazon S3

## 도구
<a name="subscribe-a-lambda-function-to-event-notifications-from-s3-buckets-in-different-aws-regions-tools"></a>
+ [AWS CLI ](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)– AWS Command Line Interface(AWS CLI)는 명령줄 쉘에서 명령을 사용하여 AWS 서비스와 상호 작용할 수 있는 오픈 소스 도구입니다. 최소한의 구성으로 명령 프롬프트에서 브라우저 기반 AWS Management Console에서 제공되는 것과 동일한 기능을 구현하는 AWS CLI명령을 실행할 수 있습니다.
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) – AWS CloudFormation을 사용하면 AWS 리소스를 모델링 및 설정하고, 빠르고 일관되게 프로비저닝하고, 수명 주기 전반에 걸쳐 관리할 수 있습니다. 템플릿을 사용하여 리소스와 해당 종속성을 설명하고, 리소스를 개별적으로 관리하는 대신 스택으로 함께 시작하고 구성할 수 있습니다. 여러 AWS 계정 및 AWS 리전에서 스택을 관리하고 프로비저닝할 수 있습니다.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) – AWS Lambda는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행하도록 지원하는 컴퓨팅 서비스입니다. Lambda는 필요 시에만 코드를 실행하며, 일일 몇 개의 요청에서 초당 수천 개의 요청까지 자동으로 규모를 조정합니다. 사용한 컴퓨팅 시간만큼만 비용을 지불하고, 코드가 실행되지 않을 때는 요금이 부과되지 않습니다.
+ [Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) – Amazon Simple Notification Service(SNS)는 웹 서버와 이메일 주소를 포함하여 게시자와 클라이언트 간에 메시지를 전달 또는 전송하는 것을 조정하고 관리합니다. 구독자는 구독하는 주제에 게시된 모든 메시지를 수신하며 주제에 대한 모든 구독자는 동일한 메시지를 수신합니다.
+ [Amazon SQS ](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html)– Amazon Simple Queue Service(Amazon SQS)는 내구력 있고 가용성이 뛰어난 보안 호스팅 대기열을 제공하며 이를 통해 분산 소프트웨어 시스템과 구성 요소를 통합 및 분리할 수 있습니다. Amazon SQS는 표준 대기열과 FIFO 대기열을 모두 지원합니다.

## 에픽
<a name="subscribe-a-lambda-function-to-event-notifications-from-s3-buckets-in-different-aws-regions-epics"></a>

### 중앙 리전에서 SQS 대기열 및 Lambda 함수를 생성합니다.
<a name="create-the-sqs-queue-and-lambda-function-in-your-central-region"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Lambda 트리거를 사용하여 SQS 대기열을 생성합니다. | AWS Management Console에 로그인하고 AWS Lambda 설명서의 [Amazon SQS에서 Lambda 사용하기](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-example.html) 튜토리얼의 지침을 사용하여 중앙 리전에 다음 리소스를 생성하십시오.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/subscribe-a-lambda-function-to-event-notifications-from-s3-buckets-in-different-aws-regions.html)Lambda 함수의 이벤트 소스로 SQS 대기열을 구성해야 합니다. | AWS DevOps, 클라우드 아키텍트 | 

### SNS 주제를 생성하고 각 필수 리전의 S3 버킷에 대한 이벤트 알림을 설정합니다.
<a name="create-an-sns-topic-and-set-up-event-notifications-for-the-s3-buckets-in-each-required-region"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
|  Amazon S3 이벤트 알림을 수신하도록 SNS 주제를 생성합니다. | Amazon S3 이벤트 알림을 수신하려는 리전에서 SNS 주제를 생성합니다. 이에 대한 자세한 내용은 Amazon SNS 설명서의 [SNS 주제 생성](https://docs.aws.amazon.com/sns/latest/dg/sns-create-topic.html)을 참조하십시오. SNS 주제의 Amazon 리소스 이름(ARN)을 기록해 두어야 합니다.  | AWS DevOps, 클라우드 아키텍트 | 
| SNS 주제를 SQS 대기열에 구독합니다. | 중앙 리전에서 호스팅하는 SQS 대기열에 SNS 주제를 구독합니다. 이에 대한 자세한 내용은 Amazon SNS 설명서의 [Amazon SNS 주제에 구독 설정](https://docs.aws.amazon.com/sns/latest/dg/sns-create-subscribe-endpoint-to-topic.html)을 참조하십시오. | AWS DevOps, 클라우드 아키텍트 | 
| SNS 주제의 액세스 정책을 업데이트합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/subscribe-a-lambda-function-to-event-notifications-from-s3-buckets-in-different-aws-regions.html)<pre>{<br />  "Version": "2012-10-17",		 	 	 <br />  "Statement": [<br />    {<br />      "Sid": "0",<br />      "Effect": "Allow",<br />      "Principal": {<br />        "Service": "s3.amazonaws.com"<br />      },<br />      "Action": "sns:Publish",<br />      "Resource": "arn:aws:sns:us-west-2::s3Events-SNSTopic-us-west-2"<br />    }<br />  ]<br />}</pre> | AWS DevOps, 클라우드 아키텍트 | 
| 리전의 각 S3 버킷에 대한 알림을 설정합니다. | 리전의 각 S3 버킷에 대한 이벤트 알림을 설정합니다. 이에 대한 자세한 내용은 Amazon S3 설명서에서 [Amazon S3 콘솔을 사용하여 이벤트 알림 활성화 및 구성](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-event-notifications.html)을 참조하십시오.**대상** 섹션에서 **SNS 주제**를 선택하고 이전에 생성한 SNS 주제의 ARN을 지정합니다. | AWS DevOps, 클라우드 아키텍트 | 
| 모든 필수 리전에 대해 이 에픽을 반복하십시오. | 중앙 리전을 포함하여 Amazon S3 이벤트 알림을 수신하려는 각 리전에 대해 이 에픽의 작업을 반복합니다. | AWS DevOps, 클라우드 아키텍트 | 

## 관련 리소스
<a name="subscribe-a-lambda-function-to-event-notifications-from-s3-buckets-in-different-aws-regions-resources"></a>
+ [액세스 정책 구성](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-add-permissions.html)(Amazon SQS 설명서)
+ [SQS 대기열을 이벤트 소스로 구성](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html#events-sqs-eventsource)(AWS Lambda 설명서)
+ [Lambda 함수를 시작하도록 SQS 대기열 구성](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-lambda-function-trigger.html)(Amazon SQS 설명서)
+ [AWS::Lambda::함수 리소스](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html)(AWS CloudFormation 설명서)

# 데이터를 Apache Parquet으로 변환하기 위한 세 가지 AWS Glue ETL 작업 유형
<a name="three-aws-glue-etl-job-types-for-converting-data-to-apache-parquet"></a>

*Adnan Alvee, Nith Govindasivan, Karthikeyan Ramachandran, Amazon Web Services*

## 요약
<a name="three-aws-glue-etl-job-types-for-converting-data-to-apache-parquet-summary"></a>

Amazon Web Services(AWS) 클라우드에서 AWS Glue는 완전관리형 추출, 전환, 적재(ETL) 서비스입니다. AWS Glue를 사용하면 경제적으로 데이터를 분류, 정리, 보강하고, 다양한 데이터 스토어와 데이터 스트림 간에 안정적으로 이동할 수 있습니다.

이 패턴은 AWS Glue에서 다양한 작업 유형을 제공하며 세 가지 스크립트를 사용하여 ETL 작업 작성을 보여줍니다.

AWS Glue를 사용하여 Python 쉘 환경에서 ETL 작업을 작성할 수 있습니다. 관리형 Apache Spark 환경에서 Python(PySpark) 또는 Scala를 사용하여 배치 및 스트리밍 ETL 작업을 모두 생성할 수도 있습니다. ETL 작업 작성을 시작하기 위해 이 패턴은 Python 쉘, PySpark 및 Scala를 사용하는 일괄 ETL 작업에 중점을 둡니다. Python 쉘 작업은 컴퓨팅 파워가 덜 필요한 워크로드를 위한 것입니다. 관리형 Apache Spark 환경은 높은 컴퓨팅 파워가 필요한 워크로드에 적합합니다.

Apache Parquet은 효율적인 압축 및 인코딩 체계를 지원하도록 구축되었습니다. 데이터를 컬럼 방식으로 저장하므로 분석 워크로드의 속도를 높일 수 있습니다. 데이터를 Parquet으로 변환하면 장기적으로 스토리지 공간, 비용 및 시간을 절감할 수 있습니다. Parquet에 대해 자세히 알아보려면 블로그 게시물 [Apache Parquet: 오픈 소스 컬럼형 데이터 형식으로 영웅이 되는 방법](https://blog.openbridge.com/how-to-be-a-hero-with-powerful-parquet-google-and-amazon-f2ae0f35ee04)을 참조하십시오.

## 사전 조건 및 제한 사항
<a name="three-aws-glue-etl-job-types-for-converting-data-to-apache-parquet-prereqs"></a>

**사전 조건 **
+ AWS Identity and Access Management(IAM) 역할(역할이 없는 경우 [추가 정보](#three-aws-glue-etl-job-types-for-converting-data-to-apache-parquet-additional) 섹션 참조)

## 아키텍처
<a name="three-aws-glue-etl-job-types-for-converting-data-to-apache-parquet-architecture"></a>

**대상 기술 스택  **
+ Glue
+ Amazon Simple Storage Service(Amazon S3)
+ Apache Parquet

**자동화 및 규모 조정**
+ [AWS Glue 워크플로](https://docs.aws.amazon.com/glue/latest/dg/workflows_overview.html)는 ETL 파이프라인의 완전 자동화를 지원합니다.
+ 데이터 처리 단위(DPU)의 수 또는 작업자 유형을 변경하여 수평 및 수직으로 규모를 조정할 수 있습니다.

## 도구
<a name="three-aws-glue-etl-job-types-for-converting-data-to-apache-parquet-tools"></a>

**AWS 서비스**
+ [Amazon Simple Storage Service(S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)는 원하는 양의 데이터를 저장, 보호 및 검색하는 데 도움이 되는 클라우드 기반 객체 스토리지 서비스입니다.
+ [AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/what-is-glue.html)는 다양한 데이터 스토어와 데이터 스트림 간에 데이터를 분류, 정리, 보강하고 이동할 수 있는 완전관리형 ETL 서비스입니다.

**기타 도구**
+ [Apache Parquet](https://parquet.apache.org/)는 스토리지 및 검색을 위해 설계된 오픈 소스 열 지향 데이터 파일 형식입니다.

**구성**

다음 설정을 사용하여 AWS Glue ETL의 컴퓨팅 파워를 구성합니다. 비용을 줄이려면 이 패턴으로 제공되는 워크로드를 실행할 때 최소 설정을 사용합니다. 
+ **Python 쉘** – 1DPU를 사용하여 16GB의 메모리를 활용하거나 0.0625DPU를 사용하여 1GB의 메모리를 활용할 수 있습니다. 이 패턴은 AWS Glue 콘솔의 기본값인 0.0625 DPU를 사용합니다.
+ **Python 또는 Scala for Spark** – 콘솔에서 Spark 관련 작업 유형을 선택하면 AWS Glue는 기본적으로 10개의 작업자와 G.1X 작업자 유형을 사용합니다. 이 패턴은 허용된 최소 수인 두 개의 작업자를 사용하며, 표준 작업자 유형은 충분하고 비용 효율적입니다.

다음 표에는 Apache Spark 환경의 다양한 AWS Glue 작업자 유형이 나와 있습니다. Python 쉘 작업은 Apache Spark 환경을 사용하여 Python을 실행하지 않으므로 테이블에 포함되지 않습니다.


| 
| 
|  | 표준 | G.1X | G.2X | 
| --- |--- |--- |--- |
| vCPU | 4 | 4 | 8 | 
| Memory | 16 GB | 16 GB | 32GB | 
| 디스크 공간 | 50GB | 64GB | 128GB | 
| 작업자당 실행기 | 2 | 1  | 1 | 

**코드**

IAM 역할 및 파라미터 구성을 포함하여 이 패턴에 사용되는 코드는 [추가 정보](#three-aws-glue-etl-job-types-for-converting-data-to-apache-parquet-additional) 섹션을 참조하십시오.

## 에픽
<a name="three-aws-glue-etl-job-types-for-converting-data-to-apache-parquet-epics"></a>

### 데이터 업로드
<a name="upload-the-data"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 새 S3 버킷이나 기존 S3 버킷에 데이터를 업로드합니다. | 계정에서 기존 S3 버킷을 생성하거나 사용합니다. [첨부 파일](#attachments-8c926709-8fa4-417f-9aaf-bcc8113d018f) 섹션에서 sample\$1data.csv 파일을 업로드하고 S3 버킷과 접두사 위치를 기록해 둡니다. | 일반 AWS | 

### AWS Glue 작업 생성 및 실행
<a name="create-and-run-the-aws-glue-job"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| AWS Glue 작업을 생성합니다. | AWS Glue 콘솔의 ETL 섹션에서 AWS Glue 작업을 추가합니다. 적절한 작업 유형, AWS Glue 버전, 해당 DPU/작업자 유형 및 작업자 수를 선택합니다. 자세한 내용은 *구성* 섹션을 참조하십시오. | 개발자, 클라우드 또는 데이터 | 
| 입력 및 출력 위치를 변경합니다. | AWS Glue 작업에 해당하는 코드를 복사하고 **데이터 업로드** 에픽에서 기록해 둔 입력 및 출력 위치를 변경합니다. | 개발자, 클라우드 또는 데이터 | 
| 파라미터를 구성합니다. | [추가 정보](#three-aws-glue-etl-job-types-for-converting-data-to-apache-parquet-additional) 섹션에 제공된 스니펫을 사용하여 ETL 작업의 파라미터를 설정할 수 있습니다. AWS Glue는 내부적으로 4개의 인수 이름을 사용합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/three-aws-glue-etl-job-types-for-converting-data-to-apache-parquet.html)`--JOB_NAME` 파라미터는 AWS Glue 콘솔에 명시적으로 입력해야 합니다. **작업**, **작업 편집**, **보안 구성, 스크립트 라이브러리 및 작업 파라미터(선택 사항)**를 선택합니다. `--JOB_NAME`을 키로 입력하고 값을 제공합니다. AWS Command Line Interface(AWS CLI) 또는 AWS Glue API를 사용하여 이 파라미터를 설정할 수도 있습니다. 이 `--JOB_NAME` 파라미터는 Spark에서 사용되며 Python 쉘 환경 작업에는 필요하지 않습니다.모든 파라미터 이름 앞에 `--`을 추가해야 합니다. 그렇지 않으면 코드가 작동하지 않습니다. 예를 들어 코드 스니펫의 경우 `--input_loc` 및 `--output_loc`를 사용하여 위치 파라미터를 간접적으로 호출해야 합니다. | 개발자, 클라우드 또는 데이터 | 
| ETL 작업을 실행합니다. | 작업을 실행하고 출력을 확인합니다. 소스 파일보다 공간이 얼마나 줄어들었는지 확인합니다. | 개발자, 클라우드 또는 데이터 | 

## 관련 리소스
<a name="three-aws-glue-etl-job-types-for-converting-data-to-apache-parquet-resources"></a>

**참조**
+ [Apache Spark](https://spark.apache.org/)
+ [AWS Glue: 작동 방식](https://docs.aws.amazon.com/glue/latest/dg/how-it-works.html)
+ [AWS Glue 요금](https://aws.amazon.com/glue/pricing/)

**튜토리얼 및 동영상 **
+ [AWS Glue란 무엇입니까?](https://www.youtube.com/watch?v=qgWMfNSN9f4)

## 추가 정보
<a name="three-aws-glue-etl-job-types-for-converting-data-to-apache-parquet-additional"></a>

**IAM 역할**

AWS Glue 작업을 생성할 때 다음 코드 스니펫에 표시된 권한이 있는 기존 IAM 역할을 사용하거나 새 역할을 사용할 수 있습니다.

새 역할을 생성하려면 다음 YAML 코드를 사용합니다.

```
# (c) 2022 Amazon Web Services, Inc. or its affiliates. All Rights Reserved. This AWS Content is provided subject to the terms of the AWS Customer
# Agreement available at https://aws.amazon.com/agreement/ or other written agreement between Customer and Amazon Web Services, Inc.

AWSTemplateFormatVersion: "2010-09-09"

Description: This template will setup IAM role for AWS Glue service.

Resources:
  rGlueRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: "Allow"
            Principal:
              Service:
                - "glue.amazonaws.com"
            Action:
              - "sts:AssumeRole"
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole
      Policies:
        - PolicyName: !Sub "${AWS::StackName}-s3-limited-read-write-inline-policy"
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - "s3:PutObject"
                  - "s3:GetObject"
                Resource: "arn:aws:s3:::*/*"
      Tags:
        - Key  : "Name"
          Value : !Sub "${AWS::StackName}"

Outputs:
  oGlueRoleName:
    Description: AWS Glue IAM role
    Value:
      Ref: rGlueRole
    Export:
      Name: !Join [ ":", [ !Ref "AWS::StackName", rGlueRole ] ]
```

**AWS Glue(Python 쉘)**

Python 코드는 Pandas 및 PyArrow 라이브러리를 사용하여 데이터를 Parquet로 변환합니다. Pandas 라이브러리는 이미 사용할 수 있습니다. PyArrow 라이브러리는 한 번만 실행되므로 패턴을 실행하면 다운로드됩니다. 휠 파일을 사용하여 PyArrow를 라이브러리로 변환하고 파일을 라이브러리 패키지로 제공할 수 있습니다. 휠 파일 패키징에 대한 자세한 내용은 [자체 Python 라이브러리 제공](https://docs.aws.amazon.com/glue/latest/dg/add-job-python.html)을 참조하십시오.

*AWS Glue Python 쉘 파라미터*

```
from awsglue.utils import getResolvedOptions

args = getResolvedOptions(sys.argv, ["input_loc", "output_loc"])
```

*AWS Glue Python 쉘 코드*

```
from io import BytesIO
import pandas as pd
import boto3
import os
import io
import site
from importlib import reload
from setuptools.command import easy_install
install_path = os.environ['GLUE_INSTALLATION']
easy_install.main( ["--install-dir", install_path, "pyarrow"] )
reload(site)
import pyarrow


input_loc = "s3://bucket-name/prefix/sample_data.csv"
output_loc = "s3://bucket-name/prefix/"


input_bucket = input_loc.split('/', 1)[0]
object_key = input_loc.split('/', 1)[1]


output_loc_bucket = output_loc.split('/', 1)[0]
output_loc_prefix = output_loc.split('/', 1)[1] 


s3 = boto3.client('s3')
obj = s3.get_object(Bucket=input_bucket, Key=object_key)
df = pd.read_csv(io.BytesIO(obj['Body'].read()))


parquet_buffer = BytesIO()
s3_resource = boto3.resource('s3')
df.to_parquet(parquet_buffer, index=False) 
s3_resource.Object(output_loc_bucket, output_loc_prefix +  'data' + '.parquet').put(Body=parquet_buffer.getvalue())
```

**Python을 사용한 AWS Glue Spark 작업**

Python에서 AWS Glue Spark 작업 유형을 사용하려면 작업 유형으로 **Spark**를 선택합니다. **작업 스타트업 시간이 개선된 Spark 3.1, Python 3(Glue 버전 3.0)**을 AWS Glue 버전으로 선택합니다.

*AWS Glue Python 파라미터*

```
from awsglue.utils import getResolvedOptions

args = getResolvedOptions(sys.argv, ["JOB_NAME", "input_loc", "output_loc"])
```

*Python 코드를 사용한 AWS Glue Spark 작업*

```
import sys
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.transforms import *
from awsglue.dynamicframe import DynamicFrame
from awsglue.utils import getResolvedOptions
from awsglue.job import Job


sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)

input_loc = "s3://bucket-name/prefix/sample_data.csv"
output_loc = "s3://bucket-name/prefix/"

inputDyf = glueContext.create_dynamic_frame_from_options(\
    connection_type = "s3", \
    connection_options = { 
        "paths": [input_loc]}, \
    format = "csv",
    format_options={
        "withHeader": True,
        "separator": ","
    })


outputDF = glueContext.write_dynamic_frame.from_options(\
    frame = inputDyf, \
    connection_type = "s3", \
    connection_options = {"path": output_loc \
        }, format = "parquet")
```

압축된 대용량 파일이 많은 경우(예: 각각 약 3MB인 파일 1,000개), 다음 코드와 같이 `recurse` 파라미터와 함께 `compressionType` 파라미터를 사용하여 접두사 내에서 사용 가능한 모든 파일을 읽습니다.

```
input_loc = "bucket-name/prefix/"
output_loc = "bucket-name/prefix/"

inputDyf = glueContext.create_dynamic_frame_from_options(
                    connection_type = "s3", 
                    connection_options = {"paths": [input_loc], 
                                            "compressionType":"gzip","recurse" :"True",
                                            },
                    format = "csv",
                    format_options={"withHeader": True,"separator": ","}
                    )
```

압축된 작은 파일(예: 각각 약 133KB인 파일 1,000개) 이 많은 경우 `groupFiles` 파라미터를 `compressionType` 및 `recurse` 파라미터와 함께 사용하십시오. `groupFiles` 파라미터는 작은 파일을 여러 개의 큰 파일로 그룹화하고 `groupSize` 파라미터는 지정된 크기(예: 1MB)로의 그룹화를 제어합니다. 다음 코드 스니펫은 코드 내에서 이러한 파라미터를 사용하는 예를 제공합니다.

```
input_loc = "bucket-name/prefix/"
output_loc = "bucket-name/prefix/"

inputDyf = glueContext.create_dynamic_frame_from_options(
                    connection_type = "s3", 
                    connection_options = {"paths": [input_loc], 
                                            "compressionType":"gzip","recurse" :"True",
                                             "groupFiles" :"inPartition",  "groupSize" :"1048576",
                                            },
                    format = "csv",
                    format_options={"withHeader": True,"separator": ","}
                    )
```

워커 노드를 변경하지 않고도 AWS Glue 작업에서 여러 파일(크든 작든, 압축이 있든 없든)을 읽고 Parquet 형식으로 대상에 쓸 수 있습니다.

**Scala를 사용한 AWS Glue Spark 작업**

Scala에서 AWS Glue Spark 작업 유형을 사용하려면 작업 유형으로 **Spark**를 선택하고 **Scala**로 **언어**를 선택합니다. **작업 스타트업 시간이 개선된 Spark 3.1, Scala 2(Glue 버전 3.0)**를 AWS Glue 버전으로 선택합니다. 스토리지 스페이스를 절약하기 위해 다음 AWS Glue with Scala 샘플도 이 `applyMapping` 기능을 사용하여 데이터 유형을 변환합니다.

*AWS Glue Scala 파라미터*

```
import com.amazonaws.services.glue.util.GlueArgParser val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME", "inputLoc", "outputLoc").toArray)
```

*Scala 코드를 사용한 AWS Glue Spark 작업*

```
import com.amazonaws.services.glue.GlueContext
import com.amazonaws.services.glue.MappingSpec
import com.amazonaws.services.glue.DynamicFrame
import com.amazonaws.services.glue.errors.CallSite
import com.amazonaws.services.glue.util.GlueArgParser
import com.amazonaws.services.glue.util.Job
import com.amazonaws.services.glue.util.JsonOptions
import org.apache.spark.SparkContext
import scala.collection.JavaConverters._


object GlueScalaApp {
  def main(sysArgs: Array[String]) {
    
    @transient val spark: SparkContext = SparkContext.getOrCreate()
    val glueContext: GlueContext = new GlueContext(spark)

    val inputLoc = "s3://bucket-name/prefix/sample_data.csv"
    val outputLoc = "s3://bucket-name/prefix/"

    val readCSV = glueContext.getSource("csv", JsonOptions(Map("paths" -> Set(inputLoc)))).getDynamicFrame()

    val applyMapping = readCSV.applyMapping(mappings = Seq(("_c0", "string", "date", "string"), ("_c1", "string", "sales", "long"),
    ("_c2", "string", "profit", "double")), caseSensitive = false)

    val formatPartition = applyMapping.toDF().coalesce(1)

    val dynamicFrame = DynamicFrame(formatPartition, glueContext)

    val dataSink = glueContext.getSinkWithFormat(
        connectionType = "s3", 
        options = JsonOptions(Map("path" -> outputLoc )),
        transformationContext = "dataSink", format = "parquet").writeDynamicFrame(dynamicFrame)
  }
}
```

## 첨부
<a name="attachments-8c926709-8fa4-417f-9aaf-bcc8113d018f"></a>

이 문서와 관련된 추가 콘텐츠에 액세스하려면 [attachment.zip](samples/p-attach/8c926709-8fa4-417f-9aaf-bcc8113d018f/attachments/attachment.zip) 파일의 압축을 풉니다.

# Amazon Athena 및 Amazon QuickSight를 사용하여 Amazon Redshift 감사 로그를 시각화합니다
<a name="visualize-amazon-redshift-audit-logs-using-amazon-athena-and-amazon-quicksight"></a>

*Sanket Sirsikar, Gopal Krishna Bhatia, Amazon Web Services*

## 요약
<a name="visualize-amazon-redshift-audit-logs-using-amazon-athena-and-amazon-quicksight-summary"></a>

Amazon Web Services(AWS) 클라우드의 데이터베이스 운영에서 보안은 필수적인 부분입니다. 조직은 데이터베이스 사용자 활동 및 연결을 모니터링하여 잠재적인 보안 사고 및 위험을 탐지하도록 해야 합니다. 이 패턴은 데이터베이스 감사라고 알려진 프로세스인 보안 및 문제 해결 목적으로 데이터베이스를 모니터링하는 데 도움이 됩니다.

 이 패턴은 Amazon Redshift 로그를 감사하는 데 도움이 되는 Amazon QuickSight의 보고 대시보드에 대한 Amazon Athena 테이블 및 뷰 생성을 자동화하는 SQL 스크립트를 제공합니다. 이렇게 하면 데이터베이스 활동 모니터링을 담당하는 사용자가 데이터 보안 기능에 편리하게 액세스할 수 있습니다. 

## 사전 조건 및 제한 사항
<a name="visualize-amazon-redshift-audit-logs-using-amazon-athena-and-amazon-quicksight-prereqs"></a>

**사전 조건 **
+ 활성 상태의 AWS 계정.
+ 기존 Amazon Redshift 클러스터입니다. 이에 대한 자세한 내용은 Amazon Redshift 설명서의 [Amazon Redshift 클러스터 생성](https://docs.aws.amazon.com/redshift/latest/dg/tutorial-loading-data-launch-cluster.html)을 참조하세요.
+ 기존 Athena 워크그룹에 액세스할 수 있습니다. 자세한 내용은 Amazon Athena 설명서의 [작업 그룹 작동 방식](https://docs.aws.amazon.com/athena/latest/ug/user-created-workgroups.html)을 참조하세요. 
+ 필수 AWS ID 및 Access Management(IAM) 권한이 있는 기존 Amazon Simple Storage Service(S3) 소스 버킷입니다. 자세한 내용은 Amazon Redshift 설명서의 [데이터베이스 감사 로깅](https://docs.aws.amazon.com/redshift/latest/mgmt/db-auditing.html)에서 [Amazon Redshift 감사 로깅을 위한 버킷 권한](https://docs.aws.amazon.com/redshift/latest/mgmt/db-auditing.html#db-auditing-bucket-permissions)을 참조하세요.

## 아키텍처
<a name="visualize-amazon-redshift-audit-logs-using-amazon-athena-and-amazon-quicksight-architecture"></a>

![\[Data flow diagram showing Amazon Redshift, logs, S3 bucket, Amazon Athena, and Amazon Quick.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/90e69009-001e-4ced-bef0-3c361f93ae87/images/9fde7f01-17ab-4207-8a59-a12daf85a382.png)


 

**기술 스택  **
+ 아테나
+ Amazon Redshift 
+ Amazon S3 
+ QuickSight

## 도구
<a name="visualize-amazon-redshift-audit-logs-using-amazon-athena-and-amazon-quicksight-tools"></a>
+ [Amazon Athena ](https://docs.aws.amazon.com/athena/latest/ug/what-is.html)– Amazon Athena는 표준 SQL을 사용해 Amazon S3에 저장된 데이터를 간편하게 분석할 수 있는 대화식 쿼리 서비스입니다. 
+ [Amazon QuickSight](https://docs.aws.amazon.com/quicksight/latest/user/welcome.html) - QuickSight는 확장 가능한 서버리스, 내장 가능한 기계 학습 기반 비즈니스 인텔리전스(BI) 서비스입니다. 
+ [Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/gsg/getting-started.html) – Amazon Redshift는 페타바이트 규모의 엔터프라이즈급 완전 관리형 데이터 웨어하우징 서비스입니다. 
+ [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) – Amazon Simple Storage Service(S3)는 인터넷 스토리지 서비스입니다.

## 에픽
<a name="visualize-amazon-redshift-audit-logs-using-amazon-athena-and-amazon-quicksight-epics"></a>

### Amazon Redshift 클러스터 구성
<a name="configure-the-amazon-redshift-cluster"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
|  Amazon Redshift 클러스터에 대한 감사 로깅을 활성화합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/visualize-amazon-redshift-audit-logs-using-amazon-athena-and-amazon-quicksight.html) | DBA, 데이터 엔지니어 | 
| Amazon Redshift 클러스터 파라미터 그룹에서 로깅을 활성화합니다. | AWS Management Console, Amazon Redshift API 참조 또는 AWS Command Line Interface(AWS CLI)를 사용하여 연결 로그, 사용자 로그 및 사용자 활동 로그에 대한 감사를 동시에 활성화할 수 있습니다. 사용자 활동 로그를 감사하려면 `enable_user_activity_logging` 데이터베이스 파라미터를 활성화해야 합니다. 연결된 파라미터를 제외하고 감사 로깅 기능만 활성화하면 데이터베이스 감사 로그가 사용자 작업 로그를 제외한 연결 및 사용자 로그 정보를 기록합니다. `enable_user_activity_logging` 파라미터는 기본적으로 활성화되지 않지만 `false`에서 `true`로 변경하여 활성화할 수 있습니다.`user_activity_logging` 파라미터가 활성화된 새 클러스터 파라미터 그룹을 생성하여 Amazon Redshift 클러스터에 연결해야 합니다. 이에 대한 자세한 내용은 Amazon Redshift 설명서의 [클러스터 수정](https://docs.aws.amazon.com/redshift/latest/mgmt/managing-clusters-console.html#modify-cluster)을 참조하세요.이 작업에 대한 자세한 내용은 Amazon Redshift 설명서에서 [Amazon Redshift 파라미터 그룹](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-parameter-groups.html) 및 [콘솔을 사용한 감사 구성](https://docs.aws.amazon.com/redshift/latest/mgmt/db-auditing-console.html)을 참조하세요. | DBA, 데이터 엔지니어 | 
| Amazon Redshift 클러스터 로깅에 대한 S3 버킷의 권한을 구성합니다. | 로깅을 사용하면 Amazon Redshift가 로깅 정보를 수집한 후 S3 버킷에 저장된 로그 파일로 업로드합니다. 기존 S3 버킷을 사용하거나 새 버킷을 생성할 수 있습니다.Amazon Redshift에 S3 버킷에 액세스하는 데 필요한 IAM 권한이 있는지 확인합니다. 이에 대한 자세한 내용은 Amazon Redshift 설명서의 [데이터베이스 감사 로깅](https://docs.aws.amazon.com/redshift/latest/mgmt/db-auditing.html)에서 [Amazon Redshift 감사 로깅을 위한 버킷 권한](https://docs.aws.amazon.com/redshift/latest/mgmt/db-auditing.html#db-auditing-bucket-permissions)을 참조하세요. | DBA, 데이터 엔지니어 | 

### Athena 테이블 및 뷰 생성
<a name="create-the-athena-table-and-views"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Athena 테이블과 뷰를 생성하여 S3 버킷에서 Amazon Redshift 감사 로그 데이터를 쿼리할 수 있습니다. | Amazon Athena 콘솔을 열고 `AuditLogging.sql` SQL 스크립트(첨부)의 데이터 정의 언어(DDL) 쿼리를 사용하여 사용자 활동 로그, 사용자 로그 및 연결 로그에 대한 테이블과 뷰를 생성합니다.자세한 내용 및 지침은 Amazon Athena 워크숍의 [테이블 생성 및 쿼리 실행](https://athena-in-action.workshop.aws/30-basics/301-create-tables.html) 자습서를 참조하세요. | 데이터 엔지니어 | 

### QuickSight 대시보드에서 로그 모니터링 설정
<a name="set-up-log-monitoring-in-the-quicksight-dashboard"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Athena를 데이터 소스로 사용하여 QuickSight 대시보드를 생성합니다. | Amazon Athena 워크숍의 [Athena를 사용하여 QuickSight로 시각화하기](https://athena-in-action.workshop.aws/30-basics/307-quicksight.html) 자습서의 지침에 따라 Amazon QuickSight 콘솔을 열고 QuickSight 대시보드를 생성합니다. | DBA, 데이터 엔지니어 | 

## 관련 리소스
<a name="visualize-amazon-redshift-audit-logs-using-amazon-athena-and-amazon-quicksight-resources"></a>
+ [Athena에서 테이블 생성 및 쿼리 실행](https://athena-in-action.workshop.aws/30-basics/301-create-tables.html)
+ [Athena를 사용하여 QuickSight로 시각화하기](https://athena-in-action.workshop.aws/30-basics/307-quicksight.html)

## 첨부
<a name="attachments-90e69009-001e-4ced-bef0-3c361f93ae87"></a>

이 문서와 관련된 추가 콘텐츠에 액세스하려면 [attachment.zip](samples/p-attach/90e69009-001e-4ced-bef0-3c361f93ae87/attachments/attachment.zip) 파일의 압축을 풉니다.

# Amazon Quick Sight를 사용하여 모든 AWS 계정에 대한 IAM 자격 증명 보고서 시각화
<a name="visualize-iam-credential-reports-for-all-aws-accounts-using-amazon-quicksight"></a>

*Parag Nagwekar, Arun Chandapillai, Amazon Web Services*

## 요약
<a name="visualize-iam-credential-reports-for-all-aws-accounts-using-amazon-quicksight-summary"></a>


| 
| 
| 경고: IAM 사용자는 장기 자격 증명을 가지므로 보안 위험이 있습니다. 이 위험을 줄이려면 이러한 사용자에게 작업을 수행하는 데 필요한 권한만 제공하고 더 이상 필요하지 않을 경우 이러한 사용자를 제거하는 것이 좋습니다. | 
| --- |

AWS Identity and Access Management(IAM) 보안 인증 보고서를 사용하면 조직의 보안, 감사, 규정 준수 요구 사항을 충족하는 데 도움이 될 수 있습니다. [보안 인증 보고서](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_getting-report.html)는 AWS 계정의 모든 사용자 목록을 제공하며 암호, 액세스 키, 다중 인증(MFA) 디바이스 등 보안 인증의 상태를 보여줍니다. [AWS Organizations](https://docs.aws.amazon.com/whitepapers/latest/organizing-your-aws-environment/core-concepts.html)에서 관리하는 여러 AWS 계정에 대한 보안 인증 보고서를 사용할 수 있습니다.

이 패턴에는 Amazon Quick Sight 대시보드를 사용하여 조직의 모든 AWS 계정에 대한 IAM 자격 증명 보고서를 생성하고 공유하는 데 도움이 되는 단계와 코드가 포함되어 있습니다. 대시보드를 조직의 이해 관계자와 공유할 수 있습니다. 보고서는 조직이 다음과 같은 목표 비즈니스 성과를 달성하는 데 도움이 될 수 있습니다.
+ IAM 사용자와 관련된 보안 사건 식별
+ IAM 사용자를 AWS Single Sign-On(SSO) 인증으로 실시간 마이그레이션하는 과정 추적
+ IAM 사용자가 액세스한 AWS 리전 추적
+ 규정 준수 유지
+ 다른 이해관계자와 정보 공유

## 사전 조건 및 제한 사항
<a name="visualize-iam-credential-reports-for-all-aws-accounts-using-amazon-quicksight-prereqs"></a>

**사전 조건 **
+ 활성 상태의 AWS 계정
+ 멤버 계정이 있는 [조직](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_tutorials_basic.html)
+ Organizations의 계정에 액세스할 수 있는 권한이 있는 [IAM 역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html)
+ [설치](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html#getting-started-install-instructions) 및 [구성](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)된 AWS Command Line Interface(AWS CLI) 버전 2
+ [Amazon Quick Enterprise 에디션](https://docs.aws.amazon.com/quicksight/latest/user/editions.html) [구독](https://docs.aws.amazon.com/quicksight/latest/user/signing-up.html) 

## 아키텍처
<a name="visualize-iam-credential-reports-for-all-aws-accounts-using-amazon-quicksight-architecture"></a>

**기술 스택**
+ Amazon Athena
+ Amazon EventBridge
+ Amazon Quick Sight
+ Amazon Simple Storage Service(Amazon S3)
+ AWS Glue
+ Identity and Access Management(IAM)
+ AWS Lambda
+ AWS Organizations

**대상 아키텍처**

다음 다이어그램은 여러 AWS 계정에서 IAM 보안 인증 보고서 데이터를 캡처하는 워크플로를 설정하는 아키텍처를 보여줍니다.

![\[다음 스크린샷은 아키텍처 다이어그램을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/8724ff28-40f6-4c43-9c65-fbd18bbbfd0f/images/e780916a-4ab7-4fdc-8ecc-c837c7d90d13.png)


1. EventBridge는 Lambda 함수를 매일 호출합니다.

1. Lambda 함수는 조직 전체의 모든 AWS 계정에서 IAM 역할을 맡습니다. 그런 다음 함수는 IAM 보안 인증 보고서를 생성하고 보고서 데이터를 중앙 집중식 S3 버킷에 저장합니다. S3 버킷에서 암호화를 활성화하고 퍼블릭 액세스를 비활성화해야 합니다.

1. AWS Glue 크롤러는 매일 S3 버킷을 크롤링하고 그에 따라 Athena 테이블을 업데이트합니다.

1. Quick Sight는 자격 증명 보고서에서 데이터를 가져오고 분석하며 이해관계자가 시각화하고 공유할 수 있는 대시보드를 구축합니다.

## 도구
<a name="visualize-iam-credential-reports-for-all-aws-accounts-using-amazon-quicksight-tools"></a>

**서비스**
+ [Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/what-is.html)는 표준 SQL을 사용해 Amazon S3에 저장된 데이터를 간편하게 분석할 수 있는 대화식 쿼리 서비스입니다.
+ [Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html)는 애플리케이션을 다양한 소스의 실시간 데이터와 연결할 수 있는 서버리스 이벤트 버스 서비스입니다. Lambda 함수, API 대상을 사용하는 HTTP 간접 호출 엔드포인트 또는 다른 AWS 계정의 이벤트 버스를 예로 들 수 있습니다.
+ [Amazon Quick Sight](https://docs.aws.amazon.com/quicksight/latest/user/welcome.html)는 분석, 데이터 시각화 및 보고에 사용할 수 있는 클라우드급 비즈니스 인텔리전스(BI) 서비스입니다. Quick Sight는 대화형 데이터 시각화, SPICE 인 메모리 분석, 임베디드 분석 및 대시보드 공유를 제공하는 Amazon Quick의 핵심 구성 요소입니다.
+ [AWS Identity and Access Management(IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)를 사용하면 사용자에 대해 인증 및 권한 부여를 제어함으로써 AWS 리소스에 대한 액세스를 안전하게 관리할 수 있습니다.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.

**코드**

이 패턴의 코드는 [getiamcredsreport-allaccounts-org](https://github.com/aws-samples/getiamcredsreport-allaccounts-org) 리포지토리에서 사용할 수 있습니다. 이 리포지토리의 코드를 사용하여 Organizations의 AWS 계정 전반에 걸쳐 IAM 보안 인증 보고서를 생성하고 중앙 위치에 저장할 수 있습니다.

## 에픽
<a name="visualize-iam-credential-reports-for-all-aws-accounts-using-amazon-quicksight-epics"></a>

### 인프라 설정
<a name="set-up-the-infrastructure"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Amazon Quick Enterprise 에디션을 설정합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/visualize-iam-credential-reports-for-all-aws-accounts-using-amazon-quicksight.html) | AWS 관리자, AWS DevOps, 클라우드 관리자, 클라우드 아키텍트 | 
| Amazon Quick Sight를 Amazon S3 및 Athena와 통합합니다. | AWS CloudFormation 스택을 배포하기 전에 Amazon S3 및 Athena를 사용하도록 Quick Sight에 [권한을 부여](https://docs.aws.amazon.com/quicksight/latest/user/troubleshoot-connect-to-datasources.html)해야 합니다. | AWS 관리자, AWS DevOps, 클라우드 관리자, 클라우드 아키텍트 | 

### 인프라 배포
<a name="deploy-the-infrastructure"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| GitHub 리포지토리를 복제합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/visualize-iam-credential-reports-for-all-aws-accounts-using-amazon-quicksight.html) | AWS 관리자 | 
| 인프라를 배포합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/visualize-iam-credential-reports-for-all-aws-accounts-using-amazon-quicksight.html) | AWS 관리자 | 
| IAM 권한 정책을 생성합니다. | 다음 권한을 사용하여 조직의 모든 AWS 계정에 대한 [IAM 정책을 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)합니다.<pre>{<br />  "Version": "2012-10-17",		 	 	 <br />  "Statement": [<br />    {<br />      "Effect": "Allow",<br />      "Action": [<br />        "iam:GenerateCredentialReport",<br />        "iam:GetCredentialReport"<br />        ],<br />      "Resource": "*"<br />    }<br />  ]<br />}</pre> | AWS DevOps, 클라우드 관리자, 클라우드 아키텍트, 데이터 엔지니어 | 
| 신뢰 정책이 있는 IAM 역할을 생성합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/visualize-iam-credential-reports-for-all-aws-accounts-using-amazon-quicksight.html)<pre>{<br />   "Version": "2012-10-17",		 	 	 <br />   "Statement":[<br />      {<br />         "Effect":"Allow",<br />         "Principal":{<br />            "AWS":[<br />               "arn:aws:iam::<MasterAccountID>:role/<LambdaRole>"<br />            ]<br />         },<br />         "Action":"sts:AssumeRole"<br />      }<br />   ]<br />}</pre>`arn:aws:iam::<MasterAccountID>:role/<LambdaRole>`을 이전에 언급한 Lambda 역할의 ARN으로 바꿉니다.조직은 일반적으로 자동화를 사용하여 AWS 계정의 IAM 역할을 생성합니다. 가능한 경우 이 자동화를 사용하는 것이 좋습니다. 또는** **코드 리포지토리의 `CreateRoleforOrg.py` 스크립트를 사용할 수도 있습니다. 스크립트에는 모든 AWS 계정에서 IAM 정책 및 역할을 생성할 권한이 있는 기존 관리자 역할 또는 기타 IAM 역할이 필요합니다. | 클라우드 관리자, 클라우드 아키텍트, AWS 관리자 | 
| 데이터를 시각화하도록 Amazon Quick Sight를 구성합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/visualize-iam-credential-reports-for-all-aws-accounts-using-amazon-quicksight.html) | AWS DevOps, 클라우드 관리자, 클라우드 아키텍트, 데이터 엔지니어 | 

## 추가 정보
<a name="visualize-iam-credential-reports-for-all-aws-accounts-using-amazon-quicksight-additional"></a>

**추가 고려 사항**

다음을 고려하세요.
+ CloudFormation을 사용하여 인프라를 배포한 후에는 Lambda와 AWS Glue가 일정에 따라 실행될 때까지 Amazon S3에서 생성되고 Athena가 분석한 보고서가 수신될 때까지 기다릴 수 있습니다. 또는 Lambda를 수동으로 실행하여 Amazon S3에서 보고서를 가져온 다음 AWS Glue 크롤러를 실행하여 데이터에서 생성된 Athena 테이블을 가져올 수 있습니다.
+ Quick은 비즈니스 요구 사항에 따라 데이터를 분석하고 시각화하는 강력한 도구입니다. 빠른의 [파라미터를](https://docs.aws.amazon.com/quicksight/latest/user/parameters-in-quicksight.html) 사용하여 선택한 데이터 필드를 기반으로 위젯 데이터를 제어할 수 있습니다. 또한 빠른 분석을 사용하여 데이터 세트에서 파라미터(예: 각각 , 및와 같은 계정`partition_0``partition_1`, 날짜 및 사용자 필드`user`)를 생성하여 계정, 날짜 및 사용자의 파라미터에 대한 제어를 추가할 수 있습니다.
+ 자체 Quick Sight 대시보드를 빌드하려면 AWS [Workshop Studio 웹 사이트의 Quick Workshops](https://catalog.workshops.aws/quicksight/en-US)를 참조하세요.
+ Quick Sight 대시보드 샘플을 보려면 GitHub [getiamcredsreport-allaccounts-org](https://github.com/aws-samples/getiamcredsreport-allaccounts-org) 코드 리포지토리를 참조하세요.

**목표 비즈니스 성과**

이 패턴을 사용하여 다음과 같은 목표 비즈니스 성과를 달성할 수 있습니다.
+ **IAM 사용자와 관련된 보안 사고 식별** - 단일 창을 사용하여 조직 내 모든 AWS 계정의 모든 사용자를 조사합니다. IAM 사용자가 가장 최근에 액세스한 개별 AWS 리전 및 사용한 서비스의 추세를 추적할 수 있습니다.
+ **IAM 사용자의 SSO 인증으로의 실시간 마이그레이션 추적 **- SSO를 사용하면 사용자는 단일 보안 인증 정보로 한 번 로그인하고 여러 AWS 계정 및 애플리케이션에 액세스할 수 있습니다. IAM 사용자를 SSO로 마이그레이션하려는 경우 이 패턴을 통해 SSO로 전환하고 모든 AWS 계정의 모든 IAM 사용자 보안 인증 정보 사용(예: AWS Management Console 액세스 또는 액세스 키 사용)을 추적할 수 있습니다.
+ **IAM 사용자가 액세스하는 AWS 리전 추적 **- 데이터 주권 및 비용 관리와 같은 다양한 목적으로 지역에 대한 IAM 사용자 액세스를 제어할 수 있습니다. 또한 모든 IAM 사용자의 리전 사용을 추적할 수 있습니다.
+ **규정 준수 유지** - 최소 권한 원칙에 따라 특정 작업을 수행하는 데 필요한 특정 IAM 권한만 부여할 수 있습니다. 또한, AWS 서비스, AWS Management Console, 장기 보안 인증 정보 사용에 대한 액세스를 추적할 수 있습니다.
+ **다른 이해 관계자와 정보 공유** - IAM 보안 인증 보고서 또는 AWS 계정에 대한 액세스 권한을 부여하지 않고도 다른 이해 관계자와 선별된 대시보드를 공유할 수 있습니다.

# 패턴 더 보기
<a name="analytics-more-patterns-pattern-list"></a>

**Topics**
+ [Amazon Cognito와 AWS Amplify UI를 사용하여 기존 React 애플리케이션 사용자 인증](authenticate-react-app-users-cognito-amplify-ui.md)
+ [Amazon Textract를 사용하여 PDF 파일에서 콘텐츠 자동 추출하기](automatically-extract-content-from-pdf-files-using-amazon-textract.md)
+ [Amazon SageMaker AI Studio Lab의 시계열에 DeepAR을 사용하여 콜드 스타트 예측 모델 구축](build-a-cold-start-forecasting-model-by-using-deepar.md)
+ [AWS Cost Explorer를 사용하여 Amazon EMR 클러스터에 대한 자세한 비용 및 사용 보고서를 생성](create-detailed-cost-and-usage-reports-for-amazon-emr-clusters-by-using-aws-cost-explorer.md)
+ [Amazon RDS 및 Amazon Aurora에 대한 자세한 비용 및 사용 보고서 생성](create-detailed-cost-and-usage-reports-for-amazon-rds-and-amazon-aurora.md)
+ [AWS Cost Explorer를 사용하여 AWS Glue 작업에 대한 자세한 비용 및 사용 보고서 생성](create-detailed-cost-and-usage-reports-for-aws-glue-jobs-by-using-aws-cost-explorer.md)
+ [에서 Kinesis Data Streams 및 Firehose를 사용하여 Amazon S3에 DynamoDB 레코드 전송 AWS CDK](deliver-dynamodb-records-to-amazon-s3-using-kinesis-data-streams-and-amazon-data-firehose-with-aws-cdk.md)
+ [AWS CodePipeline CI/CD 파이프라인을 사용하여 AWS Glue 작업 배포](deploy-an-aws-glue-job-with-an-aws-codepipeline-ci-cd-pipeline.md)
+ [Amazon Cognito 및 IaC 자동화를 사용하여 Amazon Quick Sight 시각적 구성 요소를 웹 애플리케이션에 임베드](embed-quick-sight-visual-components-into-web-apps-cognito-iac.md)
+ [Amazon DynamoDB 테이블의 스토리지 비용 추정](estimate-storage-costs-for-an-amazon-dynamodb-table.md)
+ [Terraform을 사용하여 Amazon Redshift SQL 쿼리 실행](execute-redshift-sql-queries-using-terraform.md)
+ [데이터 레이크에서 AWS IoT SiteWise 메타데이터 속성 추출 및 쿼리](extract-and-query-aws-iot-sitewise-metadata-attributes-in-a-data-lake.md)
+ [Quick Sight에서 AWS Mainframe Modernization 및 Amazon Q를 사용하여 데이터 인사이트 생성](generate-data-insights-by-using-aws-mainframe-modernization-and-amazon-q-in-quicksight.md)
+ [Quick Sight에서 AWS Mainframe Modernization 및 Amazon Q를 사용하여 Db2 z/OS 데이터 인사이트 생성](generate-db2-zos-data-insights-aws-mainframe-modernization-amazon-q-in-quicksight.md)
+ [SageMaker 노트북 인스턴스에 다른 AWS 계정의 CodeCommit 리포지토리에 대한 임시 액세스 권한 부여](give-sagemaker-notebook-instances-temporary-access-to-a-codecommit-repository-in-another-aws-account.md)
+ [Amazon Data Firehose 리소스가 AWS KMS 키로 암호화되지 않은 경우 식별 및 알림](identify-and-alert-when-amazon-data-firehose-resources-are-not-encrypted-with-an-aws-kms-key.md)
+ [PostgreSQL 데이터베이스와 상호 작용 AWS Lambda 하기 위해 로 psycopg2 라이브러리 가져오기](import-psycopg2-library-lambda.md)
+ [Microsoft Sentinel에서 AWS 보안 로그 수집 및 분석](ingest-analyze-aws-security-logs-sentinel.md)
+ [AWS DMS를 사용하여 SSL 모드에서 Amazon RDS for Oracle를 Amazon RDS for PostgreSQL로 마이그레이션](migrate-amazon-rds-for-oracle-to-amazon-rds-for-postgresql-in-ssl-mode-by-using-aws-dms.md)
+ [Oracle GoldenGate 플랫 파일 어댑터를 사용하여 Oracle 데이터베이스를 Amazon RDS for Oracle로 마이그레이션](migrate-an-oracle-database-to-amazon-rds-for-oracle-by-using-oracle-goldengate-flat-file-adapters.md)
+ [AWS DMS 및 AWS SCT를 사용하여 Amazon Redshift로 Oracle 데이터베이스 마이그레이션](migrate-an-oracle-database-to-amazon-redshift-using-aws-dms-and-aws-sct.md)
+ [Amazon S3용 AWS PrivateLink와 함께 DistCP를 사용하여 온프레미스 Hadoop 환경에서 Amazon S3로 데이터 마이그레이션하기](migrate-data-from-an-on-premises-hadoop-environment-to-amazon-s3-using-distcp-with-aws-privatelink-for-amazon-s3.md)
+ [카우치베이스 서버에서 AWS의 카우치베이스 카펠라로 마이그레이션](migrate-from-couchbase-server-to-couchbase-capella-on-aws.md)
+ [온프레미스 Cloudera 워크로드를 AWS의 Cloudera 데이터 플랫폼으로 마이그레이션](migrate-on-premises-cloudera-workloads-to-cloudera-data-platform-on-aws.md)
+ [Application Recovery Controller를 사용하여 EMR 클러스터에 대한 다중 AZ 장애 조치 관리](multi-az-failover-spark-emr-clusters-arc.md)
+ [IaC 원칙을 사용하여 Amazon Aurora 글로벌 데이터베이스의 블루/그린 배포 자동화](p-automate-blue-green-deployments-aurora-global-databases-iac.md)
+ [GitHub Actions를 사용하여 AWS CloudFormation 템플릿을 기반으로 AWS Service Catalog 제품 프로비저닝](provision-aws-service-catalog-products-using-github-actions.md)
+ [pytest 프레임워크를 AWS Glue 사용하여에서 Python ETL 작업에 대한 단위 테스트 실행](run-unit-tests-for-python-etl-jobs-in-aws-glue-using-the-pytest-framework.md)
+ [AWS ParallelCluster용 Grafana 모니터링 대시보드 설정](set-up-a-grafana-monitoring-dashboard-for-aws-parallelcluster.md)
+ [계정 간에 Amazon Redshift 클러스터에서 Amazon S3로 데이터 언로드](unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3.md)
+ [Flask 및를 사용하여 AI/ML 모델 결과 시각화 AWS Elastic Beanstalk](visualize-ai-ml-model-results-using-flask-and-aws-elastic-beanstalk.md)