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
를 실행합니다.
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 <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 stepfunctions start-execution \
--state-machine-arn arn:aws:states:<region>:<your-account-id>:stateMachine:omx-container-puller \
--input file://scrnaseq_270_docker_images_manifest.json
step function 콘솔에서 Execution이 완료되었는지 확인합니다. (바로가기)
nf-core project 코드 업데이트
mv omics.config scrnaseq/conf
echo "includeConfig 'conf/omics.config'" >> scrnaseq/nextflow.config
AWS HealthOmics 워크플로우 만들기
단계1. AWS HealthOmics 파라미터 파일
paramter-descrption.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 경로 또는 문자열이 됩니다.
아래는 테스트 샘플의 파라미터 예시입니다. (참고)
{
"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/