

# Amazon S3 연결
<a name="aws-glue-programming-etl-connect-s3-home"></a>

AWS Glue for Spark를 사용하여 Amazon S3에서 파일을 읽고 쓸 수 있습니다. AWS Glue for Spark는 CSV, Avro, JSON, Orc, Parquet을 포함하여 기본적으로 Amazon S3에 저장되는 여러 가지 공통 데이터 형식을 지원합니다. 지원되는 데이터 형식에 대한 자세한 내용은 [AWS Glue for Spark에서 입력 및 출력의 데이터 형식 옵션](aws-glue-programming-etl-format.md) 섹션을 참조하세요. 각 데이터 형식은 AWS Glue 기능의 여러 가지 세트를 지원할 수 있습니다. 특정 기능 지원에 대해서는 해당 데이터 형식 페이지를 참조하세요. 또한 Hudi, Iceberg 및 Delta Lake 데이터 레이크 프레임워크에 저장되는 버전 관리되는 파일을 읽고 쓸 수 있습니다. 데이터 레이크 프레임워크에 대한 자세한 내용은 [AWS Glue ETL 작업에서 데이터 레이크 프레임워크 사용](aws-glue-programming-etl-datalake-native-frameworks.md) 섹션을 참조하세요.

AWS Glue를 사용하면 쓰는 동안 Amazon S3 객체를 폴더 구조로 파티셔닝한 다음 파티션별로 검색하여 간단한 구성으로 성능을 개선할 수 있습니다. 성능을 개선하기 위해 데이터를 변환할 때 작은 파일을 함께 그룹화하도록 구성을 설정할 수도 있습니다. Amazon S3에서 `bzip2` 및 `gzip` 아카이브를 읽고 쓸 수 있습니다.

**Topics**
+ [S3 연결 구성](#aws-glue-programming-etl-connect-s3-configure)
+ [Amazon S3 연결 옵션 참조](#aws-glue-programming-etl-connect-s3)
+ [데이터 형식에 대한 연결 구문은 더 이상 사용되지 않습니다.](#aws-glue-programming-etl-connect-legacy-format)
+ [Amazon S3 스토리지 클래스 제외](aws-glue-programming-etl-storage-classes.md)
+ [AWS Glue에서 ETL 출력의 파티션 관리](aws-glue-programming-etl-partitions.md)
+ [입력 파일을 더 큰 그룹에서 읽기](grouping-input-files.md)
+ [Amazon S3용 Amazon VPC 엔드포인트](vpc-endpoints-s3.md)

## S3 연결 구성
<a name="aws-glue-programming-etl-connect-s3-configure"></a>

AWS Glue에서 Spark 작업으로 Amazon S3에 연결하려면 몇 가지 필수 조건이 필요합니다.
+ AWS Glue 작업에는 관련 Amazon S3 버킷에 대한 IAM 권한이 있어야 합니다.

경우에 따라 추가 필수 조건을 구성해야 합니다.
+ 크로스 계정 액세스를 구성할 때 Amazon S3 버킷에서 적절한 액세스 제어.
+ 보안상의 이유로 Amazon S3 요청을 Amazon VPC를 통해 라우팅하도록 선택할 수 있습니다. 단, 이러한 접근 방식은 대역폭 및 가용성 문제를 일으킬 수 있습니다. 자세한 내용은 [Amazon S3용 Amazon VPC 엔드포인트](vpc-endpoints-s3.md) 섹션을 참조하세요.

## Amazon S3 연결 옵션 참조
<a name="aws-glue-programming-etl-connect-s3"></a>

Amazon S3에 대한 연결을 지정합니다.

Amazon S3에서는 테이블이 아닌 파일을 관리하므로 이 문서에 제공된 연결 속성을 지정하는 것 외에도 파일 유형에 대한 추가 구성을 지정해야 합니다. 데이터 형식 옵션을 통해 이 정보를 지정합니다. 형식 옵션에 대한 자세한 내용은 [AWS Glue for Spark에서 입력 및 출력의 데이터 형식 옵션](aws-glue-programming-etl-format.md) 섹션을 참조하세요. AWS Glue 데이터 카탈로그와 통합하여 이 정보를 지정할 수도 있습니다.

연결 옵션과 형식 옵션 간의 차이점에 대한 예로, [create\$1dynamic\$1frame\$1from\$1options](aws-glue-api-crawler-pyspark-extensions-glue-context.md#aws-glue-api-crawler-pyspark-extensions-glue-context-create_dynamic_frame_from_options) 메서드에서 `connection_type`, `connection_options`, `format` 및 `format_options`를 사용하는 방법을 고려합니다. 이 섹션에서는 `connection_options`에 제공된 파라미터에 대해 자세히 논의합니다.

`"connectionType": "s3"`에는 다음 연결 옵션을 사용합니다.
+ `"paths"`: (필수 사항) 읽을 소스 Amazon S3 경로 목록입니다.
+ `"exclusions"`: (선택사항) 배제할 Unix 식 glob 패턴의 JSON 목록이 포함된 문자열. 예를 들어 `"[\"**.pdf\"]"`는 모든 PDF 파일을 제외합니다. AWS Glue에서 지원하는 glob 구문에 대한 자세한 내용은 [포함 및 제외 패턴](https://docs.aws.amazon.com/glue/latest/dg/define-crawler.html#crawler-data-stores-exclude)을 참조하십시오.
+ `"compressionType"`: 또는 "`compression`": (선택 사항) 데이터 압축 방식을 지정합니다. Amazon S3 소스에는 `"compressionType"`을 사용하고 Amazon S3 대상에는 `"compression"`을 사용합니다. 이 작업은 데이터에 표준 파일 확장자가 있는 경우에는 필요하지 않습니다. 가능한 값은 `"gzip"` 및 `"bzip2"`입니다). 특정 형식에 대해 추가 압축 형식이 지원될 수 있습니다. 자세한 기능 지원은 데이터 형식 페이지를 참조하세요.
+ `"groupFiles"`: (선택 사항) 입력에 50,000개 이상의 파일이 포함된 경우에는 기본적으로 파일 그룹화가 설정됩니다. 파일이 50,000개 미만일 때 그룹화를 설정하려면 이 파라미터를 `"inPartition"`으로 설정합니다. 파일이 50,000개 이상일 때 그룹화를 비활성화하려면 이 파라미터를 `"none"`으로 설정합니다.
+ `"groupSize"`: (선택사항) 대상 그룹 크기(바이트). 입력 데이터 크기와 클러스터 크기에 따라 기본값을 계산합니다. 입력 파일이 50,000개 미만일 때는 `"groupFiles"`을 `"inPartition"`으로 설정해야 적용됩니다.
+ `"recurse"`: (선택사항) true로 설정할 경우 지정된 경로의 모든 하위 디렉터리에 있는 파일을 반복적으로 읽습니다.
+ `"maxBand"`: (선택 사항, 고급) 이 옵션은 `s3` 목록이 일정할 것으로 예상하는 시간(밀리초)을 제어합니다. 마지막 `maxBand`밀리초에 속하는 수정 타임스탬프가 있는 파일은 특히 `JobBookmarks`를 사용하여 Amazon S3 최종 일관성을 고려할 때 추적됩니다. 대부분의 사용자는 이 옵션을 설정할 필요가 없습니다. 기본값은 900,000밀리초 또는 15분입니다.
+ `"maxFilesInBand"`: (선택 사항, 고급) 이 옵션은 마지막 `maxBand`초부터 저장할 최대 파일 수를 지정합니다. 이 수를 초과할 경우 추가 파일은 건너뛰고 다음 작업 실행에서만 처리됩니다. 대부분의 사용자는 이 옵션을 설정할 필요가 없습니다.
+ `"isFailFast"`: (선택 사항) 이 옵션은 AWS Glue ETL 작업에서 리더 구문 분석 예외가 발생하는지 여부를 결정합니다. `true`로 설정하면 Spark 태스크의 4번 재시도가 데이터를 제대로 구문 분석하지 못하면 작업이 빠르게 실패합니다.
+ `"catalogPartitionPredicate"`: (선택 사항) 읽기에 사용됩니다. SQL `WHERE` 절의 콘텐츠입니다. 파티션 수가 매우 많은 데이터 카탈로그 테이블에서 읽을 때 사용됩니다. 데이터 카탈로그 인덱스에서 일치하는 파티션을 검색합니다. [create\$1dynamic\$1frame\$1from\$1catalog](aws-glue-api-crawler-pyspark-extensions-glue-context.md#aws-glue-api-crawler-pyspark-extensions-glue-context-create_dynamic_frame_from_catalog) 메서드 및 기타 유사한 메서드의 옵션인 `push_down_predicate`와 함께 사용됩니다. 자세한 내용은 [카탈로그 파티션 조건자를 사용한 서버 측 필터링](aws-glue-programming-etl-partitions.md#aws-glue-programming-etl-partitions-cat-predicates) 섹션을 참조하세요.
+ `"partitionKeys"`: (선택 사항) 쓰기에 사용됩니다. 열 레이블 문자열의 배열입니다. AWS Glue는 이 구성에 지정된 대로 데이터를 파티셔닝합니다. 자세한 내용은 [파티션 작성](aws-glue-programming-etl-partitions.md#aws-glue-programming-etl-partitions-writing) 섹션을 참조하세요.
+ `"excludeStorageClasses"`: (선택 사항) 읽기에 사용됩니다. Amazon S3 스토리지 클래스를 지정하는 문자열 배열입니다. AWS Glue는 이 구성을 기반으로 Amazon S3 객체를 제외합니다. 자세한 내용은 [Amazon S3 스토리지 클래스 제외](aws-glue-programming-etl-storage-classes.md) 섹션을 참조하세요.

## 데이터 형식에 대한 연결 구문은 더 이상 사용되지 않습니다.
<a name="aws-glue-programming-etl-connect-legacy-format"></a>

특정 연결 유형 구문을 사용하여 특정 데이터 형식에 액세스할 수 있습니다. 이 구문은 더 이상 사용되지 않습니다. 대신 [AWS Glue for Spark에서 입력 및 출력의 데이터 형식 옵션](aws-glue-programming-etl-format.md)에 제공된 `s3` 연결 유형과 형식 옵션을 사용하여 형식을 지정하는 것이 좋습니다.

### "connectionType": "Orc"
<a name="aws-glue-programming-etl-connect-orc"></a>

Amazon S3에 저장된 파일에 [Apache ORC(Hive Optimized Row Columnar)](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC) 파일 포맷으로 연결을 지정합니다.

`"connectionType": "orc"`에는 다음 연결 옵션을 사용합니다.
+ `paths`: (필수 사항) 읽을 소스 Amazon S3 경로 목록입니다.
+ *(기타 옵션 이름/값 페어)*: 형식 지정 옵션을 포함한 모든 추가 옵션이 SparkSQL `DataSource`에 직접 전달됩니다.

### "connectionType": "parquet"
<a name="aws-glue-programming-etl-connect-parquet"></a>

Amazon S3에 [Apache Parquet](https://parquet.apache.org/docs/) 파일 포맷으로 저장된 파일에 대한 연결을 지정합니다.

`"connectionType": "parquet"`에는 다음 연결 옵션을 사용합니다.
+ `paths`: (필수 사항) 읽을 소스 Amazon S3 경로 목록입니다.
+ *(기타 옵션 이름/값 페어)*: 형식 지정 옵션을 포함한 모든 추가 옵션이 SparkSQL `DataSource`에 직접 전달됩니다.

# Amazon S3 스토리지 클래스 제외
<a name="aws-glue-programming-etl-storage-classes"></a>

Amazon Simple Storage Service(Amazon S3)에서 파일 또는 파티션을 읽는 AWS Glue ETL 작업을 실행하는 경우 일부 Amazon S3 스토리지 클래스 유형을 제외할 수 있습니다.

Amazon S3에서 제공되는 스토리지 클래스는 다음과 같습니다.
+ `STANDARD` - 자주 액세스하는 데이터의 범용 스토리지일 때
+ `INTELLIGENT_TIERING` - 액세스 패턴이 불확실하거나 바뀌는 데이터일 때
+ `STANDARD_IA` 및 `ONEZONE_IA` - 저장 기간이 길지만 액세스 횟수가 비교적 적은 데이터일 때
+ `GLACIER`, `DEEP_ARCHIVE` 및 `REDUCED_REDUNDANCY` - 장기 아카이브 및 디지털 보존이 필요할 때

자세한 내용은 *Amazon S3 Developer Guide*의 [Amazon S3 Storage Classes](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html)를 참조하세요.

이번 단원의 예제는 `GLACIER` 및 `DEEP_ARCHIVE` 스토리지 클래스를 제외하는 방법을 나타낸 것입니다. 두 클래스는 파일을 나열하는 데 사용되지만 복원하지 않을 경우 파일을 읽어오지는 못합니다. 자세한 내용은 *Amazon S3 Developer Guide*의 [Restoring Archived Objects](https://docs.aws.amazon.com/AmazonS3/latest/dev/restoring-objects.html)를 참조하세요.

스토리지 클래스 제외를 사용하면 해당 스토리지 클래스 계층에서 파티션이 포함된 테이블에 대해 AWS Glue 작업을 실행할 수 있습니다. 제외를 사용하지 않으면 해당 계층에서 데이터를 읽어오는 작업은 다음 오류와 함께 중단됩니다. AmazonS3Exception: The operation is not valid for the object's storage class.

AWS Glue에서 Amazon S3 스토리지 클래스를 필터링할 수 있는 여러 가지 방법이 있습니다.

**Topics**
+ [동적 프레임 생성 시 Amazon S3 스토리지 클래스 제외](#aws-glue-programming-etl-storage-classes-dynamic-frame)
+ [Data Catalog 테이블에서 Amazon S3 스토리지 클래스 제외](#aws-glue-programming-etl-storage-classes-table)

## 동적 프레임 생성 시 Amazon S3 스토리지 클래스 제외
<a name="aws-glue-programming-etl-storage-classes-dynamic-frame"></a>

동적 프레임을 생성할 때 Amazon S3 스토리지 클래스를 제외하려면 `additionalOptions`에서 `excludeStorageClasses`를 사용합니다. AWS Glue는 자동으로 고유한 Amazon S3 `Lister` 구현을 사용하여 지정된 스토리지 클래스에 해당하는 파일을 나열하고 제외합니다.

다음 Python 및 Scala 예제는 동적 프레임을 생성할 때 `GLACIER` 및 `DEEP_ARCHIVE` 스토리지 클래스를 제외하는 방법을 나타낸 것입니다.

Python 예제:

```
glueContext.create_dynamic_frame.from_catalog(
    database = "my_database",
    tableName = "my_table_name",
    redshift_tmp_dir = "",
    transformation_ctx = "my_transformation_context",
    additional_options = {
        "excludeStorageClasses" : ["GLACIER", "DEEP_ARCHIVE"]
    }
)
```

Scala 예제:

```
val* *df = glueContext.getCatalogSource(
    nameSpace, tableName, "", "my_transformation_context",  
    additionalOptions = JsonOptions(
        Map("excludeStorageClasses" -> List("GLACIER", "DEEP_ARCHIVE"))
    )
).getDynamicFrame()
```

## Data Catalog 테이블에서 Amazon S3 스토리지 클래스 제외
<a name="aws-glue-programming-etl-storage-classes-table"></a>

AWS Glue ETL 작업에서 사용할 스토리지 클래스 제외를 AWS Glue Data Catalog의 테이블 파라미터로 지정할 수 있습니다. 이러한 파라미터는 AWS Command Line Interface(AWS CLI) 를 사용하거나 API에서 프로그래밍 방식으로 `CreateTable` 작업에 추가할 수 있습니다. 자세한 내용은 [테이블 구조](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html#aws-glue-api-catalog-tables-Table) 단원과 [CreateTable](https://docs.aws.amazon.com/glue/latest/webapi/API_CreateTable.html) 단원을 참조하십시오.

그 밖에 AWS Glue 콘솔에서 제외된 스토리지 클래스를 지정하는 방법도 있습니다.

**Amazon S3 스토리지 클래스를 제외하려면(콘솔)**

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **테이블**을 선택합니다.

1. 목록에서 테이블 이름과 **테이블 편집**을 차례대로 선택합니다.

1. **테이블 속성**에서 **excludeStorageClasses**를 키로, 그리고 **[\$1"GLACIER\$1",\$1"DEEP\$1ARCHIVE\$1"]**를 값으로 추가합니다.

1. **Apply(적용)**를 선택합니다.

# AWS Glue에서 ETL 출력의 파티션 관리
<a name="aws-glue-programming-etl-partitions"></a>

파티셔닝은 데이터 세트를 조직하기 위한 중요한 기술로써 효율적으로 데이터 세트를 쿼리할 수 있습니다. 하나 이상의 열에 대한 구별되는 값을 기반으로 계층적 디렉터리 구조에서 데이터를 정리합니다.

예를 들어, 날짜를 기준으로 Amazon Simple Storage Service(Amazon S3)에서 애플리케이션 로그를 분할하고 연, 월, 일을 기준으로 쪼갤 수 있습니다. 하루만큼의 데이터와 대응하는 파일은 `s3://my_bucket/logs/year=2018/month=01/day=23/`와 같은 접두사 아래 위치합니다. 이제 AWS Glue는 Amazon Athena, Amazon Redshift Spectru과 같은 시스템과 더불어 Amazon S3의 기본 데이터를 모두 읽지 않고도 이러한 파티션을 사용하여 파티션 값을 기준으로 데이터를 필터링할 수 있습니다.

크롤러는 파일 유형 및 스키마를 추론할 뿐만 아니라 크롤러가 AWS Glue Data Catalog를 채울 경우 데이터 집합의 파티션 구조를 자동적으로 확인합니다. 결과로 얻은 파티션 열을 AWS Glue ETL 작업 또는 Amazon Athena와 같은 쿼리 엔진에서 쿼리할 수 있습니다.

테이블을 크롤링한 후 크롤러가 생성한 파티션을 볼 수 있습니다. AWS Glue 콘솔의 왼쪽 탐색 창에서 **테이블(Tables)**을 선택합니다. 크롤러에서 생성한 테이블을 선택한 다음 [**파티션 보기(View Partitions)**]를 선택합니다.

`key=val` 스타일에서 Apache Hive 스타일로 분할된 경로의 경우, 크롤러는 열 이름에 자동으로 키 이름을 채웁니다. 그렇지 않은 경우에는 `partition_0`, `partition_1` 같은 기본 이름을 사용합니다. 콘솔에서 기본 이름을 변경할 수 있습니다. 이를 위해 테이블로 이동합니다. **인덱스** 탭 아래에 인덱스가 있는지 확인합니다. 인덱스가 있는 경우 계속 진행하려면 해당 인덱스를 삭제해야 합니다(이후 새 열 이름을 사용하여 다시 생성할 수 있음). 그런 다음 **스키마 편집**을 선택하고 여기에서 파티션 열의 이름을 수정합니다.

ETL 스크립트에서 파티션 열에 필터링합니다. 파티션 정보는 Data Catalog에 저장되므로 `from_catalog` API 호출을 사용하여 `DynamicFrame`에 파티션 열을 포함합니다. 예를 들어 `create_dynamic_frame.from_options` 대신 `create_dynamic_frame.from_catalog`을 사용하세요.

파티셔닝은 데이터 스캔을 줄이는 최적화 기법입니다. 이 기법이 적절한 시기를 식별하는 프로세스에 대한 자세한 내용은 AWS 권장 가이드의 *Apache Spark용 AWS Glue 작업 성능 조정 모범 사례* 가이드에 있는 [데이터 스캔량 감소](https://docs.aws.amazon.com/prescriptive-guidance/latest/tuning-aws-glue-for-apache-spark/reduce-data-scan.html)를 참조하세요.

## 푸시다운 조건자를 사용하여 예비 필터링
<a name="aws-glue-programming-etl-partitions-pushdowns"></a>

많은 경우, 조건자를 푸시다운하여 데이터 세트 내 모든 파일을 나열하거나 읽지 않아도 파티션에 필터링할 수 있습니다. 데이터 집합 전체를 읽는 대신 DynamicFrame에서 필터링한 다음 Data Catalog에서 파티션 메타데이터에 직접 필터링을 적용할 수 있습니다. 그런 다음 실제로 필요한 것을 DynamicFrame에서 나열하고 읽습니다.

예를 들어, Python에서는 다음을 작성할 수 있습니다.

```
glue_context.create_dynamic_frame.from_catalog(
    database = "my_S3_data_set",
    table_name = "catalog_data_table",
    push_down_predicate = my_partition_predicate)
```

조건자 표현식을 만족하는 Data Catalog의 파티션을 로딩만 하는 DynamicFrame을 생성합니다. 로딩하는 데이터의 서브셋이 얼마나 작은지에 따라 진행 시간을 많이 줄일 수 있습니다.

조건자 표현식은 Spark SQL가 지원한 부울 확장일 수 있습니다. Spark SQL 쿼리의 `WHERE`에 넣는 어떤 것도 만족할 수 있습니다. 예를 들어 조건자 표현식 `pushDownPredicate = "(year=='2017' and month=='04')"`는 `year`가 2017이고 `month`가 04인 Data Catalog의 파티션만 로드합니다. 자세한 내용은 [Apache Spark SQL 설명서](https://spark.apache.org/docs/2.1.1/sql-programming-guide.html), 특히 [Scala SQL 함수 참조](https://spark.apache.org/docs/2.1.1/api/scala/index.html#org.apache.spark.sql.functions$)를 참조하십시오.

## 카탈로그 파티션 조건자를 사용한 서버 측 필터링
<a name="aws-glue-programming-etl-partitions-cat-predicates"></a>

`push_down_predicate` 옵션은 카탈로그의 모든 파티션을 나열한 후 해당 파티션에 대한 Amazon S3의 파일을 나열하기 전에 적용됩니다. 테이블에 대한 파티션이 많은 경우 카탈로그 파티션 목록에 여전히 추가 시간 오버헤드가 발생할 수 있습니다. 이 오버헤드를 해결하기 위해 AWS Glue Data Catalog의 [파티션 인덱스](https://docs.aws.amazon.com/glue/latest/dg/partition-indexes.html)를 사용하는 `catalogPartitionPredicate` 옵션과 함께 서버 측 파티션 정리를 사용할 수 있습니다. 따라서 한 테이블에 수백만 개의 파티션이 있는 경우 파티션 필터링이 훨씬 빨라집니다. 카탈로그 파티션 인덱스에서 아직 지원되지 않는 조건자 구문이 `catalogPartitionPredicate`에 필요한 경우 `additional_options`에서 `push_down_predicate`와 `catalogPartitionPredicate`를 함께 사용할 수 있습니다.

Python:

```
dynamic_frame = glueContext.create_dynamic_frame.from_catalog(
    database=dbname, 
    table_name=tablename,
    transformation_ctx="datasource0",
    push_down_predicate="day>=10 and customer_id like '10%'",
    additional_options={"catalogPartitionPredicate":"year='2021' and month='06'"}
)
```

Scala:

```
val dynamicFrame = glueContext.getCatalogSource(
    database = dbname,
    tableName = tablename, 
    transformationContext = "datasource0",
    pushDownPredicate="day>=10 and customer_id like '10%'",
    additionalOptions = JsonOptions("""{
        "catalogPartitionPredicate": "year='2021' and month='06'"}""")
    ).getDynamicFrame()
```

**참고**  
`push_down_predicate`와 `catalogPartitionPredicate`는 다른 구문을 사용합니다. 전자는 Spark SQL 표준 구문을 사용하고 후자는 JSQL 구문 분석기를 사용합니다.

## 파티션 작성
<a name="aws-glue-programming-etl-partitions-writing"></a>

기본적으로 DynamicFrame은 작성될 때 파티션이 되지 않습니다. 출력 파일 모두는 지정된 출력 경로의 상위 수준에 작성됩니다. 최근까지 파티션에 DynamicFrame을 작성하는 유일한 방법은 작성 전에 DynamicFrame을 Spark SQL DataFrame으로 전환하는 방법이었습니다.

그러나 DynamicFrame은 싱크를 생성할 때 `partitionKeys` 옵션을 사용하여 키의 시퀀스를 사용한 본래 파티셔닝을 지원합니다. 예를 들어, 다음 Python 코드는 Parquet 포맷의 Amazon S3로 데이터 집합을 유형 필드로 분할된 디렉터리에 작성합니다. 그런 다음, Amazon Athena와 같은 다른 시스템을 사용하여 이런 파티션을 진행할 수 있습니다.

```
glue_context.write_dynamic_frame.from_options(
    frame = projectedEvents,
    connection_type = "s3",    
    connection_options = {"path": "$outpath", "partitionKeys": ["type"]},
    format = "parquet")
```

# 입력 파일을 더 큰 그룹에서 읽기
<a name="grouping-input-files"></a>

테이블에 속성을 설정하여 AWS Glue ETL 작업을 활성화하여 속성을 Amazon S3 데이터 스토어에서 읽을 때 파일을 모읍니다. 이 속성은 각 ETL 태스크이 입력 파일 그룹을 단일 인메모리 파티션으로 읽을 수 있도록 만듭니다. 이렇게 하는 것은 Amazon S3 데이터 스토어에 많은 수의 작은 파일을 있을 때 유용합니다. 특정 속성을 설정하면 AWS Glue에 지시를 내려 Amazon S3 데이터 파티션 내 파일을 모으고 읽을 그룹의 크기를 설정합니다. `create_dynamic_frame.from_options` 메서드로 Amazon S3 데이터 스토어에서 읽을 때 이러한 옵션을 설정할 수도 있습니다.

테이블 파일을 모으려면 테이블 구조의 파라미터 필드에서 키 값 페어를 설정합니다. JSON 표기법을 사용하여 테이블 파라미터 필드 값을 설정합니다. 테이블 속성을 편집하는 방법에 대한 더 자세한 정보는 [테이블 세부 정보 보기 및 편집](tables-described.md#console-tables-details)를 참조하십시오.

이 방법을 사용하여 Amazon S3 데이터 스토어로 Data Catalog의 테이블을 모을 수 있도록 합니다.

**groupFiles**  
**groupFiles**를 `inPartition`으로 설정하면 Amazon S3 데이터 파티션 내 파일 그룹화가 가능합니다. 입력 파일이 50,000개 이상일 경우 AWS Glue가 그룹화를 자동으로 활성화합니다.  

```
  'groupFiles': 'inPartition'
```

**groupSize**  
**groupSize**를 바이트 단위로 그룹의 대상 크기로 설정합니다. **groupSize** 속성은 조건부입니다. 제공되지 않으면 총 ETL 작업 수 및 인메모리 파티션을 줄이면서 AWS Glue는 크기를 계산하여 클러스터의 모든 CPU 코어를 사용합니다.  
예를 들어, 다음은 그룹 크기를 1MB로 설정합니다.  

```
  'groupSize': '1048576'
```
계산 결과로 `groupsize`를 설정해야 합니다. 예: 1024 \$1 1024 = 1048576.

**recurse**  
**recurse**를 `True`로 설정하여 `paths`를 경로 어레이로 지정할 때 모든 하위 디렉터리의 파일을 재귀적으로 읽을 수 있습니다. 다음 예와 같이 `paths`(이가) Amazon S3의 객체 키 배열이거나 입력 형식이 parquet/orc인 경우 **재귀**를 설정하지 않아도 됩니다.  

```
  'recurse':True
```

`create_dynamic_frame.from_options` 메서드를 사용하여 Amazon S3에서 직접 읽는 경우 이러한 연결 옵션을 추가합니다. 예를 들어, 다음과 같이 파일을 1MB 그룹으로 그룹화하려는 시도합니다.

```
df = glueContext.create_dynamic_frame.from_options("s3", {'paths': ["s3://s3path/"], 'recurse':True, 'groupFiles': 'inPartition', 'groupSize': '1048576'}, format="json")
```

**참고**  
`groupFiles`는 csv, ion, grokLog, json, xml 등의 데이터 포맷에서 생성된 DynamicFrames에서 지원됩니다. avro, parquet, orc에서는 이 옵션이 지원되지 않습니다.

# Amazon S3용 Amazon VPC 엔드포인트
<a name="vpc-endpoints-s3"></a>

보안상의 이유로 많은 AWS 고객은 Amazon Virtual Private Cloud 환경(Amazon VPC)에서 애플리케이션을 실행합니다. Amazon VPC를 통해 Amazon EC2 인스턴스를 퍼블릭 인터넷을 비롯한 다른 네트워크와 논리적으로 분리된 Virtual Private Cloud로 시작할 수 있습니다. Amazon VPC를 사용하면 IP 주소 범위, 서브넷, 라우팅 테이블, 네트워크 게이트웨이 및 보안 설정을 통제할 수 있습니다.

**참고**  
2013년 12월 4일 이후 AWS 계정을 생성했다면 각 AWS 리전에 기본 VPC가 갖춰져 있습니다. 별도의 구성 단계 없이 기본 VPC를 사용하여 즉시 시작할 수 있습니다.  
자세한 내용은 Amazon VPC 사용 설명서의 [기본 VPC 및 서브넷](https://docs.aws.amazon.com/vpc/latest/userguide/default-vpc.html)을 참조하세요.

많은 고객이 퍼블릭 인터넷을 통해 데이터를 주고받는 것에 대한 합법적인 개인 정보 보호 및 보안 문제를 우려합니다. 가상 사설 네트워크(VPN)를 사용하여 모든 Amazon S3 네트워크 트래픽을 자체 기업 네트워크 인프라를 통해 라우팅함으로써 이러한 문제를 해결할 수 있습니다. 그러나 이러한 접근 방식은 대역폭 및 가용성 문제를 일으킬 수 있습니다.

Amazon S3에 대한 VPC 엔드포인트는 이러한 문제를 완화할 수 있습니다. Amazon S3에 대한 VPC 엔드포인트를 사용하여 AWS Glue가 퍼블릭 인터넷에 노출되지 않고도 프라이빗 IP 주소를 사용하여 Amazon S3에 액세스할 수 있습니다. AWS Glue에 퍼블릭 IP 주소를 지정할 필요가 없으며 VPC에서 인터넷 게이트웨이, NAT 디바이스 또는 가상 프라이빗 게이트웨이가 필요 없습니다. 엔드포인트 정책을 사용하여 Amazon S3에 대한 액세스를 제어합니다. VPC와 AWS 서비스 간의 트래픽은 Amazon 네트워크를 벗어나지 않습니다.

Amazon S3에 대한 VPC 엔드포인트를 생성하면 리전 내의 Amazon S3 엔드포인트(예: *s3.us-west-2.amazonaws.com*)에 대한 요청이 Amazon 네트워크 내의 프라이빗 Amazon S3 엔드포인트로 라우팅됩니다. VPC의 Amazon EC2 인스턴스에서 실행되는 애플리케이션을 수정할 필요가 없습니다.엔드포인트 이름은 동일하게 남아있지만 Amazon S3에 대한 경로는 전적으로 Amazon 네트워크에 유지되며 퍼블릭 인터넷에 액세스하지 않습니다.

VPC 엔드포인트에 대한 자세한 내용은 Amazon VPC 사용 설명서의 [VPC 엔드포인트](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints.html)를 참조하세요.

다음 다이어그램은 AWS Glue가 Amazon S3에 액세스하기 위해 VPC 엔드포인트를 사용하는 방법을 보여줍니다.

![\[VPC 연결에서 Amazon S3까지 보여주는 네트워크 트래픽 흐름\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/PopulateCatalog-vpc-endpoint.png)


**Amazon S3에 대한 액세스를 설정하려면**

1. AWS Management Console에 로그인하고 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)에서 Amazon VPC 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **엔드포인트**를 선택합니다.

1. [**엔드포인트 생성(Create Endpoint)**]을 선택하고 단계에 따라 게이트웨이 유형의 Amazon S3 VPC 엔드포인트를 생성합니다.