AWS HealthOmics 변형 저장소 및 주석 저장소 가용성 변경 - AWS HealthOmics

AWS HealthOmics 변형 저장소 및 주석 저장소는 2025년 11월 7일부터 신규 고객에게 더 이상 공개되지 않습니다. 변형 저장소 또는 주석 저장소를 사용하려면 해당 날짜 이전에 가입하세요. 기존 고객은 평소처럼 서비스를 계속 사용할 수 있습니다. 자세한 내용은 AWS HealthOmics 변형 저장소 및 주석 저장소 가용성 변경을 참조하세요.

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

AWS HealthOmics 변형 저장소 및 주석 저장소 가용성 변경

신중한 고려 끝에 2025년 11월 7일부터 신규 고객에게 AWS HealthOmics 변형 저장소와 주석 저장소를 해지하기로 결정했습니다. 변형 저장소 및 주석 저장소를 사용하려면 해당 날짜 이전에 가입하세요. 기존 고객은 평소처럼 서비스를 계속 사용할 수 있습니다.

다음 섹션에서는 변형 저장소 및 분석 저장소를 새 솔루션으로 이동하는 데 도움이 되는 마이그레이션 옵션에 대해 설명합니다. 질문이나 우려 사항이 있는 경우 support.console.aws.amazon.com 지원 사례를 생성합니다.

마이그레이션 옵션 개요

다음 마이그레이션 옵션은 변형 저장소 및 주석 저장소를 사용하는 대안을 제공합니다.

  1. ETL 로직의 HealthOmics 제공 참조 구현을 사용합니다.

    스토리지에 S3 테이블 버킷을 사용하고 기존 AWS 분석 서비스를 계속 사용합니다.

  2. 기존 AWS 서비스의 조합을 사용하여 솔루션을 생성합니다.

    ETL의 경우 사용자 지정 Glue ETL 작업을 작성하거나 EMR에서 오픈 소스 HAIL 또는 GLOW 코드를 사용하여 변형 데이터를 변환할 수 있습니다.

    스토리지에 S3 테이블 버킷 사용 및 기존 AWS 분석 서비스 계속 사용

  3. 변형 및 주석 저장소 대안을 제공하는 AWS 파트너를 선택합니다.

ETL 로직의 마이그레이션 옵션

ETL 로직에 대해 다음 마이그레이션 옵션을 고려합니다.

  1. HealthOmics는 현재 변형 저장소 ETL 로직을 참조 HealthOmics 워크플로로 제공합니다. 이 워크플로의 엔진을 사용하여 변형 저장소와 정확히 동일한 변형 데이터 ETL 프로세스에 전원을 공급할 수 있지만 ETL 로직을 완전히 제어할 수 있습니다.

    이 참조 워크플로는 요청에 따라 사용할 수 있습니다. 액세스를 요청하려면 support.console.aws.amazon.com 지원 사례를 생성합니다.

  2. 변형 데이터를 변환하려면 사용자 지정 Glue ETL 작업을 작성하거나 EMR에서 오픈 소스 HAIL 또는 GLOW 코드를 사용할 수 있습니다.

스토리지를 위한 마이그레이션 옵션

서비스 호스팅 데이터 스토어를 대체하기 위해 Amazon S3 테이블 버킷을 사용하여 사용자 지정 테이블 스키마를 정의할 수 있습니다. 테이블 버킷에 대한 자세한 내용은 Amazon S3 사용 설명서테이블 버킷을 참조하세요.

Amazon S3의 완전 관리형 Iceberg 테이블에 테이블 버킷을 사용할 수 있습니다.

지원 사례를 제기하여 HealthOmics 팀에 변형 또는 주석 저장소의 데이터를 구성한 Amazon S3 테이블 버킷으로 마이그레이션하도록 요청할 수 있습니다.

Amazon S3 테이블 버킷에 데이터가 채워지면 변형 저장소와 주석 저장소를 삭제할 수 있습니다. 자세한 내용은 HealthOmics 분석 저장소 삭제를 참조하세요.

분석

데이터 분석의 경우 Amazon Amazon Athena EMR, Amazon Redshift 또는 Amazon Quick Suite와 같은 AWS 분석 서비스를 계속 사용합니다.

AWS 파트너

사용자 지정 가능한 ETL, 테이블 스키마, 기본 제공 쿼리 및 분석 도구, 데이터와 상호 작용하기 위한 사용자 인터페이스를 제공하는 AWS 파트너와 협력할 수 있습니다.

예시

다음 예제에서는 VCF 및 GVCF 데이터를 저장하는 데 적합한 테이블을 생성하는 방법을 보여줍니다.

Athena DDL

Athena에서 다음 DDL 예제를 사용하여 VCF 및 GVCF 데이터를 단일 테이블에 저장하는 데 적합한 테이블을 생성할 수 있습니다. 이 예제는 변형 저장소 구조와 정확히 동일하지는 않지만 일반적인 사용 사례에 적합합니다.

테이블을 생성할 때 DATABASE_NAME 및 TABLE_NAME에 대한 고유한 값을 생성합니다.

CREATE TABLE <DATABASE_NAME>. <TABLE_NAME> ( sample_name string, variant_name string COMMENT 'The ID field in VCF files, '.' indicates no name', chrom string, pos bigint, ref string, alt array <string>, qual double, filter string, genotype string, info map <string, string>, attributes map <string, string>, is_reference_block boolean COMMENT 'Used in GVCF for non-variant sites') PARTITIONED BY (bucket(128, sample_name), chrom) LOCATION '{URL}/' TBLPROPERTIES ( 'table_type'='iceberg', 'write_compression'='zstd' );

Python을 사용하여 테이블 생성(Athena 제외)

다음 Python 코드 예제에서는 Athena를 사용하지 않고 테이블을 생성하는 방법을 보여줍니다.

import boto3 from pyiceberg.catalog import Catalog, load_catalog from pyiceberg.schema import Schema from pyiceberg.table import Table from pyiceberg.table.sorting import SortOrder, SortField, SortDirection, NullOrder from pyiceberg.partitioning import PartitionSpec, PartitionField from pyiceberg.transforms import IdentityTransform, BucketTransform from pyiceberg.types import ( NestedField, StringType, LongType, DoubleType, MapType, BooleanType, ListType ) def load_s3_tables_catalog(bucket_arn: str) -> Catalog: session = boto3.session.Session() region = session.region_name or 'us-east-1' catalog_config = { "type": "rest", "warehouse": bucket_arn, "uri": f"https://s3tables.{region}.amazonaws.com/iceberg", "rest.sigv4-enabled": "true", "rest.signing-name": "s3tables", "rest.signing-region": region } return load_catalog("s3tables", **catalog_config) def create_namespace(catalog: Catalog, namespace: str) -> None: try: catalog.create_namespace(namespace) print(f"Created namespace: {namespace}") except Exception as e: if "already exists" in str(e): print(f"Namespace {namespace} already exists.") else: raise e def create_table(catalog: Catalog, namespace: str, table_name: str, schema: Schema, partition_spec: PartitionSpec = None, sort_order: SortOrder = None) -> Table: if catalog.table_exists(f"{namespace}.{table_name}"): print(f"Table {namespace}.{table_name} already exists.") return catalog.load_table(f"{namespace}.{table_name}") create_table_args = { "identifier": f"{namespace}.{table_name}", "schema": schema, "properties": {"format-version": "2"} } if partition_spec is not None: create_table_args["partition_spec"] = partition_spec if sort_order is not None: create_table_args["sort_order"] = sort_order table = catalog.create_table(**create_table_args) print(f"Created table: {namespace}.{table_name}") return table def main(bucket_arn: str, namespace: str, table_name: str): # Schema definition genomic_variants_schema = Schema( NestedField(1, "sample_name", StringType(), required=True), NestedField(2, "variant_name", StringType(), required=True), NestedField(3, "chrom", StringType(), required=True), NestedField(4, "pos", LongType(), required=True), NestedField(5, "ref", StringType(), required=True), NestedField(6, "alt", ListType(element_id=1000, element_type=StringType(), element_required=True), required=True), NestedField(7, "qual", DoubleType()), NestedField(8, "filter", StringType()), NestedField(9, "genotype", StringType()), NestedField(10, "info", MapType(key_type=StringType(), key_id=1001, value_type=StringType(), value_id=1002)), NestedField(11, "attributes", MapType(key_type=StringType(), key_id=2001, value_type=StringType(), value_id=2002)), NestedField(12, "is_reference_block", BooleanType()), identifier_field_ids=[1, 2, 3, 4] ) # Partition and sort specifications partition_spec = PartitionSpec( PartitionField(source_id=1, field_id=1001, transform=BucketTransform(128), name="sample_bucket"), PartitionField(source_id=3, field_id=1002, transform=IdentityTransform(), name="chrom") ) sort_order = SortOrder( SortField(source_id=3, transform=IdentityTransform(), direction=SortDirection.ASC, null_order=NullOrder.NULLS_LAST), SortField(source_id=4, transform=IdentityTransform(), direction=SortDirection.ASC, null_order=NullOrder.NULLS_LAST) ) # Connect to catalog and create table catalog = load_s3_tables_catalog(bucket_arn) create_namespace(catalog, namespace) table = create_table(catalog, namespace, table_name, genomic_variants_schema, partition_spec, sort_order) return table if __name__ == "__main__": bucket_arn = 'arn:aws:s3tables:<REGION>:<ACCOUNT_ID>:bucket/<TABLE_BUCKET_NAME' namespace = "variant_db" table_name = "genomic_variants" main(bucket_arn, namespace, table_name)