Skip to main content

AWS HealthOmics로 Nf-core 워크플로우 마이그레이션 하기 (scrnaseq)

참고문서: https://catalog.us-east-1.prod.workshops.aws/workshops/76d4a4ff-fe6f-436a-a1c2-f7ce44bc5d17/en-US

이 문서를 참고하여 환경을 준비합니다. 여기서는 이 과정은 생략합니다.

프로젝트 셋업

nf-core repository로부터 워크플로우 복제

cd ~
git clone https://github.com/nf-core/scrnaseq --branch 2.7.0 --single-branch

Docker Image Manifest의 생성

cp  ~/amazon-ecr-helper-for-aws-healthomics/lib/lambda/parse-image-uri/public_registry_properties.json namespace.config

inspect_nf.py 를 실행합니다.

이때 <aws region>은 각자의 환경에 맞게 작성합니다.

python3 amazon-omics-tutorials/utils/scripts/inspect_nf.py \
--output-manifest-file scrnaseq_270_docker_images_manifest.json \
 -n namespace.config \
 --output-config-file omics.config \
 --region <aws region> \
 ~/scrnaseq/

생성되는 두 개의 출력은 scrnaseq_270_docker_images_manifest.json과 omics.config입니다.

scrnaseq_270_docker_images_manifest.json 파일은 다음과 같은 모습이어야 합니다:

{
    "manifest": [
        "quay.io/biocontainers/bioconductor-alevinqc:1.12.1--r41h9f5acd7_0",
        "quay.io/biocontainers/fastqc:0.12.1--hdfd78af_0",
        "quay.io/biocontainers/gffread:0.12.1--h8b12597_0",
        "quay.io/biocontainers/gffread:0.12.7--hd03093a_1",
        "quay.io/biocontainers/kb-python:0.28.2--pyhdfd78af_2",
        "quay.io/biocontainers/mulled-v2-1fa26d1ce03c295fe2fdcf85831a92fbcbd7e8c2:ded3841da0194af2701c780e9b3d653a85d27489-0",
        "quay.io/biocontainers/multiqc:1.21--pyhdfd78af_0",
        "quay.io/biocontainers/p7zip:16.02",
        "quay.io/biocontainers/python:3.9--1",
        "quay.io/biocontainers/scanpy:1.7.2--pyhdfd78af_0",
        "quay.io/biocontainers/simpleaf:0.10.0--h9f5acd7_1",
        "quay.io/biocontainers/star:2.7.10b--h9ee0642_0",
        "quay.io/nf-core/cellranger-arc:2.0.2",
        "quay.io/nf-core/cellranger:8.0.0",
        "quay.io/nf-core/seurat:4.3.0",
        "quay.io/nf-core/ubuntu:20.04",
        "quay.io/nf-core/universc:1.2.5.1",
        "quay.io/biocontainers/bioconductor-dropletutils:1.18.0--r42hf17093f_1"
    ]
}

컨테이너 사설화

이때 <aws-rgion>과 <your-account-id> 은 각자의 환경에 맞게 작성합니다.

aws stepfunctions start-execution \
--state-machine-arn arn:aws:states:<aws-region>:<your-account-id>:stateMachine:omx-container-puller \
--input file://scrnaseq_270_docker_images_manifest.json

step function 콘솔에서 state machines중에 omx-container-puller를 확인하여 Execution이 완료되었는지 확인합니다.

(

바로가기Screenshot 2025-04-15 at 3.52.46 PM.png)

Screenshot 2024-08-20 at 3.38.18 PM.png

nf-core project 코드 업데이트

mv omics.config scrnaseq/conf

echo "includeConfig 'conf/omics.config'" >> scrnaseq/nextflow.config 

AWS HealthOmics 워크플로우 만들기

단계1. AWS HealthOmics 파라미터 파일

paramter-descrption.parameter-description.json을 만들어 아래와 같이 저장합니다.

{
    "input": {"description": "Samplesheet with sample locations.",
                "optional": false},
    "protocol" : {"description": "10X Protocol used: 10XV1, 10XV2, 10XV3",
                "optional": false},
    "aligner": {"description": "choice of aligner: alevin, star, kallisto",
            "optional": false},
    "barcode_whitelist": {"description": "Optional whitelist if 10X protocol is not used.",
            "optional": true},
    "gtf": {"description": "S3 path to GTF file",
            "optional": false},
    "fasta": {"description": "S3 path to FASTA file",
            "optional": false},
    "skip_emptydrops": {"description": "module does not work on small dataset",
            "optional": true}
}

단계2. 워크플로우 스테이징

zip -r scrnaseq-workflow.zip scrnaseq

aws s3 cp scrnaseq-workflow.zip s3://<yourbucket>/workshop/scrnaseq-workflow.zip

aws omics create-workflow \
  --name scrnaseq-v1 \
  --definition-uri s3://<yourbucket>/workshop/scrnaseq-workflow.zip \
  --parameter-template file://parameter-description.json \
  --engine NEXTFLOW

단계3. 워크플로우 생성 확인

aws omics list-workflows --name scrnaseq-v1


워크플로우 테스트하기

입력파일 준비

parameter-description.json에 사용된 것과 동일한 키를 사용하여 input.json 파일을 새로 만듭니다. 값은 워크플로에서 허용되는 실제 S3 경로 또는 문자열이 됩니다.

아래는 테스트 샘플의 파라미터 예시입니다. (참고)

데이터 준비 참고

예제 데이터는 다음과 같이 다운로드 해볼 수 있습니다.

wget https://github.com/nf-core/test-datasets/raw/scrnaseq/samplesheet-2-0.csv
wget https://github.com/nf-core/test-datasets/raw/scrnaseq/reference/GRCm38.p6.genome.chr19.fa
wget https://github.com/nf-core/test-datasets/raw/scrnaseq/reference/gencode.vM19.annotation.chr19.gtf

이제 현재 디렉토리에 다운로드 된 파일들을 버킷에 업로드할 수 있습니다.

aws s3 sync . s3://omics-output-us-east-1-462922227709/workflow_migration_workshop/nfcore-scrnaseq-v4.0.0/
{
        "input": "s3://aws-genomics-static-us-east-1/workflow_migration_workshop/nfcore-scrnaseq-v2.3.0/samplesheet-2-0.csv",
        "protocol": "10XV2",
        "aligner": "star",
        "fasta": "s3://aws-genomics-static-us-east-1/workflow_migration_workshop/nfcore-scrnaseq-v2.3.0/GRCm38.p6.genome.chr19.fa",
        "gtf": "s3://aws-genomics-static-us-east-1/workflow_migration_workshop/nfcore-scrnaseq-v2.3.0/gencode.vM19.annotation.chr19.gtf",
        "skip_emptydrops": true
}

실제 샘플의 파라미터는 다음을 참고해주세요. (참고)

samplesheet_2.0_full.csv

아래 버킷은 본인의 버킷으로 사용해야 합니다. 현재 공개 버킷 데이터이긴 하지만 healthomics의 사용 리전과 다른 리전의 버킷일 수 있습니다.
$ aws s3 sync s3://ngi-igenomes/test-data/scrnaseq/ s3://{mybucketname}/test-data/scrnaseq/

sample,fastq_1,fastq_2,expected_cells
pbmc8k,s3://ngi-igenomes/test-data/scrnaseq/pbmc8k_S1_L007_R1_001.fastq.gz,s3://ngi-igenomes/test-data/scrnaseq/pbmc8k_S1_L007_R2_001.fastq.gz,10000
pbmc8k,s3://ngi-igenomes/test-data/scrnaseq/pbmc8k_S1_L008_R1_001.fastq.gz,s3://ngi-igenomes/test-data/scrnaseq/pbmc8k_S1_L008_R2_001.fastq.gz,10000

input_full.json

{
        "input": "s3://{mybucketname}/samplesheet_2.0_full.csv",
        "protocol": "10XV2",
        "aligner": "star",
        "fasta": "s3://{mybucketname}/workshop/igenomes/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa",
        "gtf": "s3://{mybucketname}/workshop/igenomes/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.gtf",
        "skip_emptydrops": false
}

    // Genome references
    genome       = 'GRCh38'
    aligner      = 'star'
    protocol     = '10XV2'

    validationSchemaIgnoreParams = 'genomes'

Policy 준비

Prepare IAM service role to run AWS HealthOmics workflow

omics_workflow_policy.json 만들기

# 환경 변수 설정
export yourbucket="your-bucket-name"
export your_account_id="your-account-id"
export region="your-region"

# JSON 내용 생성 및 파일로 저장
cat << EOF > omics_workflow_policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::${yourbucket}/*",
                "arn:aws:s3:::aws-genomics-static-us-east-1/workflow_migration_workshop/nfcore-scrnaseq-v2.3.0/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::${yourbucket}",
                "arn:aws:s3:::aws-genomics-static-us-east-1/workflow_migration_workshop/nfcore-scrnaseq-v2.3.0"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::${yourbucket}/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:DescribeLogStreams",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:${region}:${your_account_id}:log-group:/aws/omics/WorkflowLog:log-stream:*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup"
            ],
            "Resource": [
                "arn:aws:logs:${region}:${your_account_id}:log-group:/aws/omics/WorkflowLog:*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ecr:BatchGetImage",
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchCheckLayerAvailability"
            ],
            "Resource": [
                "arn:aws:ecr:${region}:${your_account_id}:repository/*"
            ]
        }
    ]
}
EOF

echo "omics_workflow_policy.json 파일이 생성되었습니다."

trust_policy.json 만들기

# 환경 변수 설정
export your_account_id="your-account-id"
export region="us-east-1"  # 기본값으로 us-east-1을 설정했습니다. 필요시 변경하세요.

# JSON 내용 생성 및 파일로 저장
cat << EOF > trust_policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "omics.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "${your_account_id}"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:omics:${region}:${your_account_id}:run/*"
                }
            }
        }
    ]
}
EOF

echo "trust_policy.json 파일이 생성되었습니다."

IAM Role 생성

aws iam create-role --role-name omics_start_run_role_v1 --assume-role-policy-document file://trust_policy.json

Policy document 생성

aws iam put-role-policy --role-name omics_start_run_role_v1 --policy-name OmicsWorkflowV1 --policy-document file://omics_workflow_policy.json

워크플로우 실행

aws omics start-run \
  --name scrnaseq_workshop_test_run_1 \
  --role-arn arn:aws:iam::<your-account-id>:role/omics_start_run_role_v1 \
  --workflow-id <your-workflow-id> \
  --parameters file://input.json \
  --output-uri s3://<yourbucket>/output/