Skip to main content

VPC-Connected Workflows: 워크플로우에서 인터넷과 크로스 리전 S3에 접근하기

개요

2026년 3월, AWS HealthOmics에 VPC-Connected Workflows 기능이 추가되었습니다. 이 기능을 사용하면 HealthOmics 워크플로우가 고객이 관리하는 VPC를 통해 네트워크 트래픽을 라우팅할 수 있어, 기존 RESTRICTED 모드의 네트워크 제한을 해소할 수 있습니다.

본 게시물에서는 이 기능의 동작 원리, 실제 테스트 결과, 그리고 CDK를 활용한 인프라 구성 방법을 소개합니다.


기존 RESTRICTED 모드의 한계

HealthOmics 워크플로우의 기본 네트워킹 모드는 RESTRICTED입니다. 이 모드에서 워크플로우 태스크는 같은 리전의 S3와 ECR에만 접근할 수 있으며, 그 외의 네트워크 통신은 모두 차단됩니다.

이로 인해 다음과 같은 일반적인 생물정보학 워크플로우 시나리오가 제한됩니다:

  • 공개 데이터베이스 접근 불가: NCBI, Ensembl 등 공개 생물정보학 데이터베이스에서 레퍼런스 데이터를 다운로드할 수 없음
  • 외부 API 호출 불가: 라이선스 서버, REST API, 알림 웹훅 등에 연결할 수 없음
  • 크로스 리전 S3 접근 불가: 다른 AWS 리전의 S3 버킷에 저장된 유전체 데이터셋에 접근할 수 없음

특히 크로스 리전 S3의 경우, RESTRICTED 모드에서는 StartRun API 호출 시점에 S3 버킷의 리전을 검증하여, 다른 리전의 S3 URI가 포함되어 있으면 워크플로우가 시작조차 되지 않습니다.


VPC 모드: 어떻게 동작하는가

VPC 모드에서는 HealthOmics가 워크플로우 태스크의 ENI(Elastic Network Interface)를 고객의 VPC 프라이빗 서브넷에 생성합니다. 이 ENI를 통해 트래픽이 VPC의 NAT 게이트웨이를 거쳐 인터넷 또는 다른 리전의 AWS 서비스로 라우팅됩니다.

┌──────────────────────────────────────────────────────┐
│  VPC (10.0.0.0/16)                                   │
│                                                      │
│  ┌──────────────┐  ┌──────────────┐  ┌────────────┐  │
│  │ Private Sub-a│  │ Private Sub-b│  │Private Sub-c│ │
│  │  HealthOmics │  │  HealthOmics │  │ HealthOmics│  │
│  │  ENIs        │  │  ENIs        │  │ ENIs       │  │
│  └──────┬───────┘  └──────┬───────┘  └─────┬──────┘  │
│         └─────────────────┼────────────────┘         │
│                           │                          │
│                  ┌────────▼────────┐                 │
│                  │   NAT Gateway   │                 │
│                  │  (Public Subnet) │                │
│                  └────────┬────────┘                 │
│                           │                          │
│  S3 Gateway Endpoint ─── 같은 리전 S3 (비용 없음)      │
│  Security Group: 아웃바운드 HTTPS 443만 허용            │
└───────────────────────────┼──────────────────────────┘
                            │
              ┌─────────────┼─────────────┐
              ▼             ▼             ▼
    ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
    │  퍼블릭      │ │ 크로스 리전  │ │ 외부         │
    │  인터넷      │ │ S3 버킷      │ │ REST API     │
    │ (NCBI 등)    │ │ (us-east-1)  │ │ (GitHub 등)  │
    └──────────────┘ └──────────────┘ └──────────────┘

트래픽 경로 요약:

  • 같은 리전 S3: S3 Gateway 엔드포인트를 통해 직접 접근 (데이터 전송 비용 없음)
  • 인터넷/크로스 리전: 프라이빗 서브넷 → NAT 게이트웨이 → 인터넷 게이트웨이

콘솔에서 확인하기

HealthOmics 콘솔의 Run summary에서 두 모드의 차이를 확인할 수 있습니다.

RESTRICTED 모드 실행 화면

RESTRICTED 모드로 실행한 경우, Networking mode 항목에 Restricted로 표시됩니다. Configuration 항목은 표시되지 않으며, 워크플로우는 HealthOmics의 기본 네트워크 환경에서 실행됩니다. 같은 리전의 S3와 ECR만 접근 가능하고, 외부 인터넷 연결은 불가합니다.

restricted-networking-mode.png

VPC 모드 실행 화면

VPC 모드로 실행한 경우, Networking mode 항목에 Virtual Private Cloud (VPC)로 표시되며, 그 아래에 Configuration 항목이 추가로 나타납니다. 여기에는 연결된 VPC Configuration의 이름(예: tutorial-vpc-config)이 링크로 표시되어, 클릭하면 해당 Configuration의 상세 정보(VPC ID, 서브넷, 보안 그룹 등)를 확인할 수 있습니다.

vpc-mode.pngvpc-mode.png

두 실행 모두 동일한 워크플로우(vpc-connectivity-test-v3, WDL)를 사용했으며, 실행 시간도 유사합니다(RESTRICTED: 5분 49초, VPC: 5분 21초).


실제 테스트 결과

ap-northeast-2(서울) 리전에서 동일한 WDL 워크플로우를 RESTRICTED 모드와 VPC 모드로 각각 실행하여 연결성을 비교 테스트했습니다.

테스트 항목

카테고리 A — 인터넷 접근:

  • A1: curl https://checkip.amazonaws.com (아웃바운드 HTTPS + NAT 퍼블릭 IP 확인)
  • A2: wget https://ftp.ncbi.nlm.nih.gov/robots.txt (NCBI 공개 리소스 다운로드)
  • A3: curl https://api.github.com (외부 REST API 접근)

카테고리 B — 크로스 리전 S3 접근 (us-east-1 → ap-northeast-2):

  • B1: aws s3 cp (크로스 리전 파일 다운로드)
  • B2: aws s3 ls (크로스 리전 버킷 목록 조회)

결과 비교

테스트 RESTRICTED 모드 VPC 모드
A1 — checkip.amazonaws.com FAIL (타임아웃) PASS (NAT IP 반환)
A2 — NCBI robots.txt 다운로드 FAIL (타임아웃) PASS (파일 다운로드 성공)
A3 — GitHub API 호출 FAIL (타임아웃) PASS (HTTP 200)
B1 — 크로스 리전 S3 다운로드 API에서 차단 PASS (파일 다운로드 성공)
B2 — 크로스 리전 S3 목록 조회 API에서 차단 PASS (객체 목록 반환)

RESTRICTED 모드에서는 인터넷 테스트가 모두 타임아웃으로 실패하며, 크로스 리전 S3는 StartRun API 호출 자체가 ValidationException: S3 bucket not located in ap-northeast-2 region으로 거부됩니다.

VPC 모드에서는 5개 테스트 모두 성공합니다.


CDK를 활용한 인프라 구성

VPC 모드를 사용하려면 HealthOmics 요구사항에 맞는 VPC와 HealthOmics Configuration을 생성해야 합니다. 이를 간소화하기 위해 HealthOmicsVpc CDK L3 Construct를 활용할 수 있습니다.

이 CDK Construct는 cdk deploy 한 번으로 다음을 모두 생성합니다:

  • VPC: HealthOmics 지원 AZ에 자동 배치된 퍼블릭/프라이빗 서브넷
  • NAT 게이트웨이: development(1개) 또는 production(AZ당 1개) 모드 선택
  • 보안 그룹: 최소 권한 원칙 (아웃바운드 HTTPS 443만 허용)
  • S3 Gateway 엔드포인트: 같은 리전 S3 접근 시 데이터 전송 비용 없음
  • VPC Flow Logs: CloudWatch Logs로 자동 전송
  • HealthOmics Configuration: Custom Resource를 통해 자동 생성 및 수명 주기 관리

사용 예시

import { HealthOmicsVpc } from './lib';

new HealthOmicsVpc(stack, 'HealthOmicsVpc', {
  networkingConfigurationName: 'my-vpc-config',
  deploymentMode: 'development',    // NAT GW 1개 (비용 절감)
  vpcEndpoints: ['s3'],             // S3 Gateway 엔드포인트
});

배포 절차

# 환경 변수 설정
export AWS_REGION=us-east-1
export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)

# CDK 배포
cd healthomics-vpc-cdk-main
npm install
npx cdk bootstrap aws://${AWS_ACCOUNT_ID}/${AWS_REGION}
npx cdk deploy --require-approval never

배포 후 Configuration이 ACTIVE 상태가 되면 (약 5분 소요) VPC 모드로 워크플로우를 실행할 수 있습니다.


워크플로우 실행 방법

RESTRICTED 모드 (기본)

aws omics start-run \
    --workflow-id <WORKFLOW_ID> \
    --role-arn <ROLE_ARN> \
    --output-uri s3://my-bucket/output/ \
    --parameters '{"output_s3_uri": "s3://my-bucket/report.json"}'

VPC 모드

aws omics start-run \
    --workflow-id <WORKFLOW_ID> \
    --role-arn <ROLE_ARN> \
    --output-uri s3://my-bucket/output/ \
    --networking-mode VPC \
    --configuration-name my-vpc-config \
    --parameters '{
        "output_s3_uri": "s3://my-bucket/report.json",
        "cross_region_s3_uri": "s3://bucket-in-other-region/data.txt"
    }'

차이점은 --networking-mode VPC--configuration-name 두 가지 파라미터의 추가입니다.


알아두면 좋은 점

ECR컨테이너 이미지 설정

HealthOmics는 Amazon ECR 프라이빗 리포지토리 이미지만호스팅된 컨테이너 이미지를 지원합니다. ECR 리포지토리는 워크플로우를 실행하는 계정과 같은 리전에 있어야 하며, 다른 계정 소유의 이미지도 적절한 크로스 계정 권한이 설정되어 있으면 사용할 수 있습니다.

퍼블릭 레지스트리 이미지 사용: Docker Hub나Hub, Public ECR 이미지는등의 퍼블릭 이미지를 직접 참조할 수는 없지만, ECR Pull Through Cache를 사용하면 이러한 외부 레지스트리의 이미지를 ECR 프라이빗 리포지토리에 자동으로 동기화하여 사용할 수 없습니다.있습니다. 또한지원되는 업스트림 레지스트리는 다음과 같습니다:

  • Amazon ECR Public
  • Docker Hub
  • Quay
  • GitHub Container Registry
  • GitLab Container Registry
  • Microsoft Azure Container Registry
  • Kubernetes container image registry

추가 제약사항:

  • x86_64 아키텍처만 지원: ARM 컨테이너는 지원되지 않습니다. Apple Mac 등 ARM 기반 머신에서 빌드할 경우 docker build --platform amd64 -t my_tool:latest .와 같이 플랫폼을 명시해야 합니다.
  • ENTRYPOINT 미설정 권장: HealthOmics 워크플로우 엔진이 bash 스크립트를 command override로 주입하므로, 컨테이너 이미지에 ENTRYPOINT를 지정하지 않고 bash 셸이 기본이 되도록 빌드해야 합니다.
  • /tmp 경로 주의: 컨테이너 태스크에 공유 파일시스템이 /tmp에 마운트되므로, 이 경로에 빌드된 데이터나 도구는 덮어씌워집니다.

IAM 역할 권한 외에 ECR 리포지토리 자체에 omics.amazonaws.com 서비스 프린시플에 대한 접근 정책을 설정해야 합니다.

aws ecr set-repository-policy \
    --repository-name my-repo \
    --policy-text '{
        "Version": "2012-10-17",
        "Statement": [{
            "Effect": "Allow",
            "Principal": {"Service": "omics.amazonaws.com"},
            "Action": [
                "ecr:BatchGetImage",
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchCheckLayerAvailability"
            ]
        }]
    }'

자세한 내용은 Container images for private workflows 문서를 참고하세요.

S3 파라미터 검증

HealthOmics는 StartRun 호출 시 워크플로우 파라미터의 S3 URI를 검증합니다:

  • 참조하는 S3 객체가 존재해야 합니다 (출력 경로의 경우 플레이스홀더 생성 필요)
  • RESTRICTED 모드에서는 S3 버킷이 같은 리전에 있어야 합니다

성능 영향

VPC 모드는 ENI 프로비저닝으로 인해 시작 시간이 약 30~60초 더 소요됩니다. 워크플로우 태스크 자체의 실행 시간에는 유의미한 차이가 없습니다.

비용 고려

리소스 비용 비고
NAT 게이트웨이 시간당 ~$0.045 + 데이터 처리 가장 큰 비용 항목
S3 Gateway 엔드포인트 무료 같은 리전 S3 접근
VPC Flow Logs CloudWatch Logs 수집 비용 트러블슈팅에 유용

테스트나 개발 목적이라면 development 모드(NAT 게이트웨이 1개)를 사용하고, 테스트 완료 후 즉시 리소스를 정리하여 불필요한 비용을 방지하세요.

지원 리전

리전 AZ 수
us-east-1 (버지니아 북부) 4
us-west-2 (오레곤) 3
eu-west-1 (아일랜드) 3
eu-west-2 (런던) 3
eu-central-1 (프랑크푸르트) 3
ap-southeast-1 (싱가포르) 3
ap-northeast-2 (서울) 3
il-central-1 (텔아비브) 3

정리

VPC-Connected Workflows는 HealthOmics 워크플로우의 네트워크 접근성을 크게 확장하는 기능입니다. 외부 데이터베이스 접근, API 호출, 크로스 리전 데이터 활용이 필요한 생물정보학 파이프라인에서 특히 유용하며, CDK L3 Construct를 활용하면 복잡한 VPC 인프라 구성을 단일 명령으로 완료할 수 있습니다.