

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

# HealthOmics에서 프라이빗 워크플로 생성
<a name="workflows-setup"></a>

*프라이빗 워크플로*는 워크플로를 생성하기 전에 생성하고 구성하는 다양한 리소스에 따라 달라집니다.
+ **Workflow definition file:** WDL, Nextflow또는 로 작성된 워크플로 정의 파일입니다CWL. 워크플로 정의는 워크플로를 사용하는 실행에 대한 입력 및 출력을 지정합니다. 또한 컴퓨팅 및 메모리 요구 사항을 포함하여 워크플로의 실행 및 실행 작업에 대한 사양도 포함되어 있습니다. 워크플로 정의 파일은 `.zip` 형식이어야 합니다. 자세한 내용은 [워크플로 정의 파일을](workflow-definition-files.md) 참조하세요.
  + [Amazon Q CLI](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/what-is.html)를 사용하여 WDL, Nextflow 및 CWL에서 워크플로 정의 파일을 빌드하고 검증할 수 있습니다. 자세한 내용은 [Amazon Q CLI에 대한 프롬프트 예제](getting-started.md#omics-q-prompts) 및 GitHub의 [HealthOmics Agentic 생성형 AI 자습](https://github.com/aws-samples/aws-healthomics-tutorials/tree/main/generative-ai)서를 참조하세요.
+ **(Optional) Parameter template file:**에 작성된 파라미터 템플릿 파일입니다JSON. 파일을 생성하여 실행 파라미터를 정의하거나 HealthOmics에서 파라미터 템플릿을 생성합니다. 자세한 내용은 [ HealthOmics 워크플로용 파라미터 템플릿 파일을 참조하세요](parameter-templates.md).
+ **Amazon ECR container images:** 워크플로에 대한 프라이빗 Amazon ECR 리포지토리를 생성합니다. 프라이빗 리포지토리에서 컨테이너 이미지를 생성하거나 지원되는 업스트림 레지스트리의 콘텐츠를 Amazon ECR 프라이빗 리포지토리와 동기화합니다.
+ **(Optional) Sentieon licenses:** 프라이빗 워크플로에서 Sentieon 소프트웨어를 사용할 수 있는 Sentieon 라이선스를 요청합니다.

선택적으로 워크플로를 생성하기 전이나 후에 워크플로 정의에서 린터를 실행할 수 있습니다. 이 **linter** 주제에서는 HealthOmics에서 사용할 수 있는 린터에 대해 설명합니다.

**Topics**
+ [Git 기반 리포지토리와 HealthOmics 워크플로 통합](workflows-git-integration.md)
+ [HealthOmics의 워크플로 정의 파일](workflow-definition-files.md)
+ [HealthOmics 워크플로용 파라미터 템플릿 파일](parameter-templates.md)
+ [프라이빗 워크플로용 컨테이너 이미지](workflows-ecr.md)
+ [HealthOmics 워크플로 README 파일](workflows-readme.md)
+ [프라이빗 워크플로에 대한 Sentieon 라이선스 요청](private-workflows-subscribe.md)
+ [HealthOmics의 워크플로 린터](workflows-linter.md)
+ [HealthOmics 워크플로 작업](creating-private-workflows.md)

# Git 기반 리포지토리와 HealthOmics 워크플로 통합
<a name="workflows-git-integration"></a>

워크플로(또는 워크플로 버전)를 생성할 때 워크플로, 실행 및 작업에 대한 정보를 지정하는 워크플로 정의를 제공합니다. HealthOmics는 워크플로 정의를 .zip 아카이브(로컬 또는 Amazon S3 버킷에 저장됨) 또는 지원되는 Git 기반 리포지토리에서 검색할 수 있습니다.

Git 기반 리포지토리와 HealthOmics 통합을 통해 다음 기능을 사용할 수 있습니다.
+ 퍼블릭, 프라이빗 및 자체 관리형 인스턴스에서 직접 워크플로를 생성합니다.
+ 리포지토리의 워크플로 README 파일 및 파라미터 템플릿 통합.
+ GitHub, GitLab 및 Bitbucket 리포지토리를 지원합니다.

Git 기반 리포지토리를 사용하면 워크플로 정의 파일 및 입력 파라미터 템플릿 파일을 다운로드하고.zip 아카이브를 생성한 다음 아카이브를 S3에 스테이징하는 수동 단계를 피할 수 있습니다. 이렇게 하면 다음 예제와 같은 시나리오의 워크플로 생성이 간소화됩니다.

1. nf-core와 같은 일반적인 오픈 소스 워크플로를 사용하여 빠르게 시작하려고 합니다. HealthOmics는 GitHub의 nf-core 리포지토리에서 모든 워크플로 정의 및 입력 파라미터 템플릿 파일을 자동으로 검색하고 이러한 파일을 사용하여 새 워크플로를 생성합니다.

1. GitHub의 퍼블릭 워크플로를 사용 중이며 일부 새 업데이트를 사용할 수 있게 됩니다. GitHub의 업데이트된 워크플로 정의를 소스로 사용하여 새 HealthOmics 워크플로 버전을 쉽게 생성할 수 있습니다. 워크플로 사용자는 원래 워크플로 또는 생성한 새 워크플로 버전 중에서 선택할 수 있습니다.

1. 팀이 공개되지 않은 독점 파이프라인을 구축하고 있습니다. 코드를 프라이빗 git 리포지토리에 보관하고이 워크플로 정의를 HealthOmics 워크플로에 사용합니다. 팀은 반복 워크플로 개발 수명 주기의 일부로 워크플로 정의를 자주 업데이트합니다. 프라이빗 리포지토리에서 필요에 따라 새 워크플로 버전을 쉽게 생성할 수 있습니다.

**Topics**
+ [지원되는 Git 기반 리포지토리](#workflows-git-supported)
+ [외부 코드 리포지토리에 대한 연결 구성](#workflows-git-connections)
+ [자체 관리형 리포지토리 액세스](#workflows-git-self-managed)
+ [외부 코드 리포지토리와 관련된 할당량](#workflows-git-quotas)
+ [필수 IAM 권한](#workflows-git-permissions)

## 지원되는 Git 기반 리포지토리
<a name="workflows-git-supported"></a>

HealthOmics는 다음 Git 기반 공급자에 대한 퍼블릭 및 프라이빗 리포지토리를 지원합니다.
+ GitHub 
+ GitLab 
+ Bitbucket 

HealthOmics는 다음 Git 기반 공급자에 대해 자체 관리형 리포지토리를 지원합니다.
+ GitHubEnterpriseServer 
+ GitLabSelfManaged 

HealthOmics는 GitHub, GitLab 및 Bitbucket에 대한 교차 계정 연결 사용을 지원합니다. AWS Resource Access Manager를 통해 공유 권한을 설정합니다. 예제는 *CodePipeline 사용 설명서*의 [공유 연결을](https://docs.aws.amazon.com/codepipeline/latest/userguide/connections-shared.html) 참조하세요.

## 외부 코드 리포지토리에 대한 연결 구성
<a name="workflows-git-connections"></a>

AWS CodeConnection을 사용하여 워크플로를 Git 기반 리포지토리에 연결합니다. HealthOmics는이 연결을 사용하여 소스 코드 리포지토리에 액세스합니다.

**참고**  
il-central-1 리전에서는 AWS CodeConnections 서비스를 사용할 수 없습니다. 이 리전의 경우 리포지토리에서 워크플로 또는 워크플로 버전을 생성하도록 서비스 us-east-1을 구성합니다.

### 연결 생성
<a name="workflows-git-connection-create"></a>

연결을 생성하려면 먼저 *개발자 콘솔 도구 사용 설명서*의 [연결 설정](https://docs.aws.amazon.com/dtconsole/latest/userguide/setting-up-connections.html)의 지침을 따르세요.

연결을 생성하려면 *개발자 콘솔 도구 사용 설명서*의 [연결 생성](https://docs.aws.amazon.com/dtconsole/latest/userguide/connections-create.html)의 지침을 따르세요.

### 연결에 대한 권한 부여 구성
<a name="workflows-git-connection-create"></a>

공급자의 OAuth 흐름을 사용하여 연결을 승인해야 합니다. 연결 상태를 사용하기 `AVAILABLE` 전에 상태가 인지 확인합니다.

예제는 블로그 게시물 [ How To Create a AWS HealthOmics Workflows from Content in Git](https://repost.aws/articles/ARCEN7AjhaRSmteczRoc_QsA/how-to-create-an-aws-healthomics-workflows-from-content-in-git)를 참조하세요.

## 자체 관리형 리포지토리 액세스
<a name="workflows-git-self-managed"></a>

GitLab 자체 관리형 리포지토리에 대한 연결을 설정하려면 호스트를 생성할 때 관리자 개인 액세스 토큰을 사용합니다. 후속 연결 생성은 고객 계정으로 Oauth에 액세스합니다.

다음 예시에서는 GitLab 자체 관리형 리포지토리에 대한 연결을 설정합니다.

1. 관리자 사용자의 개인 액세스 토큰에 대한 액세스를 설정합니다.

   GitLab 자체 관리형 리포지토리에서 PAT를 설정하려면 GitLab [Docs의 개인 액세스 토큰](https://docs.gitlab.com/user/profile/personal_access_tokens/)을 참조하세요. *GitLab *

1. 호스트 생성

   1. **CodePipeline>설정>연결**로 이동합니다.

   1. **호스트** 탭을 선택한 다음 **호스트 생성을** 선택합니다.

   1. 다음 필드를 구성합니다.
      + 호스트의 이름을 입력합니다.
      + 공급자 유형에서 **GitLab 자체 관리**형을 선택합니다.
      + **호스트 URL**을 입력합니다.
      + 호스트가 VPC에 정의된 경우 VPC 정보를 입력합니다.

   1. **호스트 생성을** 선택하면 호스트가 PENDING 상태로 생성됩니다.

   1. 설정을 완료하려면 **호스트 설정을** 선택합니다.

   1. 관리자 사용자의 개인 액세스 토큰(PAT)을 입력한 다음 **계속**을 선택합니다.

1. 연결 생성

   1. **연결 탭에서 연결 생성을** 선택합니다. **** 

   1. 공급자 유형에서 **GitLab 자체 관리형**을 선택합니다.

   1. **연결 설정>연결 이름 입력**에서 이전에 생성한 호스트 URL을 입력합니다.

   1. GitLab 자체 관리형 인스턴스에 VPC를 통해서만 액세스할 수 있는 경우 VPC 세부 정보를 구성합니다.

   1. 대기 **중인 연결 업데이트를** 선택합니다. 모달 창은 GitLab 로그인 페이지로 리디렉션합니다.

   1. 고객 계정의 사용자 이름과 암호를 입력하고 권한 부여 프로세스를 완료합니다.

   1.  처음 설정하려면 **Authorize AWS Connector for Gitlab Self Managed**를 선택합니다.

## 외부 코드 리포지토리와 관련된 할당량
<a name="workflows-git-quotas"></a>

외부 코드 리포지토리와 HealthOmics 통합의 경우 리포지토리, 각 리포지토리 파일 및 각 README 파일의 최대 크기가 있습니다. 자세한 내용은 [HealthOmics 워크플로 고정 크기 할당량](fixed-quotas.md#fixed-quotas-workflows)을 참조하세요.

## 필수 IAM 권한
<a name="workflows-git-permissions"></a>

자격 증명 기반 IAM 정책에 다음 작업을 추가합니다.

```
   "codeconnections:CreateConnection",
   "codeconnections:GetConnection",
   "codeconnections:GetHost",
   "codeconnections:ListConnections",
   "codeconnections:UseConnection"
```

# HealthOmics의 워크플로 정의 파일
<a name="workflow-definition-files"></a>

워크플로 정의를 사용하여 워크플로, 실행 및 실행의 작업에 대한 정보를 지정합니다. 워크플로 정의 언어를 사용하여 하나 이상의 파일에 워크플로 정의를 생성합니다. HealthOmics는 WDL, Nextflow 또는 CWL로 작성된 워크플로 정의를 지원합니다.

HealthOmics는 WDL 워크플로 정의에 대해 다음과 같은 선택을 지원합니다.
+ WDL - 사양을 준수하는 WDL 엔진을 제공합니다.
+ WDL lenient - Cromwell에서 마이그레이션된 워크플로를 처리하도록 설계되었습니다. 고객 Cromwell 지시문과 일부 규정 미준수 로직을 지원합니다. 자세한 내용은 [WDL lenient의 암시적 유형 변환](workflow-languages-wdl.md#workflow-wdl-type-conversion)을 참조하세요.

각 워크플로 언어에 대한 자세한 내용은 아래의 언어별 세부 섹션을 참조하세요.

워크플로 정의에서 다음과 같은 유형의 정보를 지정합니다.
+ **Language version** - 워크플로 정의의 언어 및 버전입니다.
+ **Compute and memory** - 워크플로의 작업에 대한 컴퓨팅 및 메모리 요구 사항입니다.
+ **Inputs** - 워크플로 작업에 대한 입력의 위치입니다. 자세한 내용은 [HealthOmics 실행 입력](workflows-run-inputs.md) 단원을 참조하십시오.
+ **Outputs** - 작업이 생성하는 출력을 저장할 위치입니다.
+ **Task resources** - 각 작업에 대한 컴퓨팅 및 메모리 요구 사항입니다.
+ **Accelerators** - 액셀러레이터와 같이 작업에 필요한 기타 리소스.

**Topics**
+ [HealthOmics 워크플로 정의 요구 사항](workflow-defn-requirements.md)
+ [HealthOmics 워크플로 정의 언어에 대한 버전 지원](workflows-lang-versions.md)
+ [HealthOmics 작업에 대한 컴퓨팅 및 메모리 요구 사항](memory-and-compute-tasks.md)
+ [HealthOmics 워크플로 정의의 작업 출력](workflows-task-outputs.md)
+ [HealthOmics 워크플로 정의의 태스크 리소스](task-resources.md)
+ [HealthOmics 워크플로 정의의 태스크 액셀러레이터](task-accelerators.md)
+ [WDL 워크플로 정의 세부 정보](workflow-languages-wdl.md)
+ [Nextflow 워크플로 정의 세부 정보](workflow-definition-nextflow.md)
+ [CWL 워크플로 정의 세부 정보](workflow-languages-cwl.md)
+ [워크플로 정의 예](workflow-definition-examples.md)

# HealthOmics 워크플로 정의 요구 사항
<a name="workflow-defn-requirements"></a>

HealthOmics 워크플로 정의 파일은 다음 요구 사항을 충족해야 합니다.
+ 작업은 입력/출력 파라미터, Amazon ECR 컨테이너 리포지토리, 메모리 또는 CPU 할당과 같은 런타임 사양을 정의해야 합니다.
+ IAM 역할에 필요한 권한이 있는지 확인합니다.<a name="lower"></a>
  + 워크플로는 Amazon S3와 같은 AWS 리소스의 입력 데이터에 액세스할 수 있습니다.
  + 워크플로는 필요한 경우 외부 리포지토리 서비스에 액세스할 수 있습니다.
+ 워크플로 정의에서 출력 파일을 선언합니다. 중간 실행 파일을 출력 위치에 복사하려면 이를 워크플로 출력으로 선언합니다.
+ 입력 및 출력 위치는 워크플로와 동일한 리전에 있어야 합니다.
+ HealthOmics 스토리지 워크플로 입력은 `ACTIVE` 상태여야 합니다. HealthOmics는 `ARCHIVED` 상태의 입력을 가져오지 않으므로 워크플로가 실패합니다. Amazon S3 객체 입력에 대한 자세한 내용은 섹션을 참조하세요[HealthOmics 실행 입력](workflows-run-inputs.md).
+ ZIP 아카이브에 단일 워크플로 정의 또는 'main'이라는 파일이 포함된 경우 워크플로의 **main** 위치는 선택 사항입니다.<a name="lower"></a>
  + 예시 경로: `workflow-definition/main-file.wdl`
+ Amazon S3 또는 로컬 드라이브에서 워크플로를 생성하기 전에 워크플로 정의 파일과 하위 워크플로와 같은 종속성의 zip 아카이브를 생성합니다.
+ 워크플로에서 Amazon ECR 컨테이너를 Amazon ECR 권한 검증을 위한 입력 파라미터로 선언하는 것이 좋습니다.

추가 Nextflow 고려 사항:
+ **/bin**

  Nextflow 워크플로 정의에는 실행 가능한 스크립트가 있는 /bin 폴더가 포함될 수 있습니다. 이 경로에는 작업에 대한 읽기 전용 및 실행 가능한 액세스 권한이 있습니다. 이러한 스크립트에 의존하는 작업은 적절한 스크립트 인터프리터로 빌드된 컨테이너를 사용해야 합니다. 가장 좋은 방법은 인터프리터를 직접 호출하는 것입니다. 예제:

  ```
  process my_bin_task {
     ...
     script:
        """
        python3 my_python_script.py
        """
  }
  ```
+ **includeConfig**

  Nextflow 기반 워크플로 정의에는 파라미터 정의를 추상화하거나 리소스 프로파일을 처리하는 데 도움이 되는 nextflow.config 파일이 포함될 수 있습니다. 여러 환경에서 Nextflow 파이프라인의 개발 및 실행을 지원하려면 includeConfig 지시문을 사용하여 글로벌 구성에 추가하는 HealthOmics별 구성을 사용합니다. 이식성을 유지하려면 다음 코드를 사용하여 HealthOmics에서 실행할 때만 파일을 포함하도록 워크플로를 구성합니다.

  ```
  // at the end of the nextflow.config file
  if ("$AWS_WORKFLOW_RUN") {
      includeConfig 'conf/omics.config'
  }
  ```
+ **Reports**

  HealthOmics는 엔진 생성 Dag, 추적 및 실행 보고서를 지원하지 않습니다. GetRun 및 GetRunTask API 호출을 조합하여 추적 및 실행 보고서에 대한 대안을 생성할 수 있습니다.

추가 CWL 고려 사항:
+ **Container image uri interpolation**

  HealthOmics를 사용하면 DockerRequirement의 dockerPull 속성이 인라인 Javascript 표현식이 될 수 있습니다. 예제:

  ```
  requirements:
    DockerRequirement:
      dockerPull: "$(inputs.container_image)"
  ```

  이렇게 하면 컨테이너 이미지 URIs 워크플로의 입력 파라미터로 지정할 수 있습니다.
+ **Javascript expressions**

  Javascript 표현식은 `strict mode` 규정을 준수해야 합니다.
+ **Operation process**

  HealthOmics는 CWL 작업 프로세스를 지원하지 않습니다.

# HealthOmics 워크플로 정의 언어에 대한 버전 지원
<a name="workflows-lang-versions"></a>

HealthOmics는 Nextflow, WDL 또는 CWL로 작성된 워크플로 정의 파일을 지원합니다. 다음 섹션에서는 이러한 언어에 대한 HealthOmics 버전 지원에 대한 정보를 제공합니다.

**Topics**
+ [WDL 버전 지원](#workflows-lang-versions-WDL)
+ [CWL 버전 지원](#workflows-lang-versions-CWL)
+ [Nextflow 버전 지원](#workflows-lang-versions-nextflow)

## WDL 버전 지원
<a name="workflows-lang-versions-WDL"></a>

HealthOmics는 버전 1.0, 1.1 및 WDL 사양의 개발 버전을 지원합니다.

모든 WDL 문서에는 준수하는 사양의 버전(주요 및 부)을 지정하는 버전 문이 포함되어야 합니다. 버전에 대한 자세한 내용은 [WDL 버전 관리를](https://github.com/openwdl/wdl/blob/wdl-1.1/SPEC.md#versioning) 참조하세요.

WDL 사양 버전 1.0 및 1.1은 `Directory` 유형을 지원하지 않습니다. 입력 또는 출력에 `Directory` 유형을 사용하려면 파일의 첫 번째 줄**development**에서 버전을 로 설정합니다.

```
version development  # first line of .wdl file
     ... remainder of the file ...
```

## CWL 버전 지원
<a name="workflows-lang-versions-CWL"></a>

HealthOmics는 CWL 언어 버전 1.0, 1.1 및 1.2를 지원합니다.

CWL 워크플로 정의 파일에서 언어 버전을 지정할 수 있습니다. CWL에 대한 자세한 내용은 [CWL 사용 설명서를](https://github.com/common-workflow-language/user_guide) 참조하세요.

## Nextflow 버전 지원
<a name="workflows-lang-versions-nextflow"></a>

HealthOmics는 세 가지 Nextflow 안정 버전을 지원합니다. Nextflow는 일반적으로 6개월마다 안정적인 버전을 릴리스합니다. HealthOmics는 월별 '엣지' 릴리스를 지원하지 않습니다.

HealthOmics는 각 버전에서 릴리스된 기능을 지원하지만 미리 보기 기능은 지원하지 않습니다.

### 지원되는 버전
<a name="workflows-versions-nextflow-list"></a>

HealthOmics는 다음 Nextflow 버전을 지원합니다.
+ Nextflow v22.04.01 DSL 1 및 DSL 2
+ Nextflow v23.10.0 DSL 2(기본값)
+ Nextflow v24.10.8 DSL 2

워크플로를 지원되는 최신 버전(v24.10.8)으로 마이그레이션하려면 [Nextflow 업그레이드 가이드를](https://nextflow.io/docs/latest/migrations/24-10.html) 따르세요.

Nextflow 마이그레이션 가이드의 다음 섹션에 설명된 대로 Nextflow v23에서 v24로 마이그레이션할 때 몇 가지 주요 변경 사항이 있습니다.
+ [ 24.04의 주요 변경 사항](https://www.nextflow.io/docs/latest/migrations/24-04.html#breaking-changes)
+  [ 24.10의 주요 변경 사항](https://www.nextflow.io/docs/latest/migrations/24-10.html#breaking-changes)

### Nextflow 버전 감지 및 처리
<a name="workflows-versions-processing"></a>

HealthOmics는 지정한 DSL 버전과 Nextflow 버전을 감지합니다. 이러한 입력을 기반으로 실행할 최적의 Nextflow 버전을 자동으로 결정합니다.

#### DSL 버전
<a name="workflows-versions-p1"></a>

HealthOmics는 워크플로 정의 파일에서 요청된 DSL 버전을 감지합니다. 예를 들어를 지정할 수 있습니다`nextflow.enable.dsl=2`.

HealthOmics는 기본적으로 DSL 2를 지원합니다. 워크플로 정의 파일에 지정된 경우 DSL 1과의 이전 버전과의 호환성을 제공합니다.
+ DSL 2를 지정하면 Nextflow v22.04.0 또는 v24.10.8를 지정하지 않는 한 HealthOmics는 Nextflow v23.10.0을 실행합니다.
+ DSL 1을 지정하면 HealthOmics는 Nextflow v22.04 DSL1(DSL 1을 실행하는 지원되는 유일한 버전)을 실행합니다.
+ DSL 버전을 지정하지 않거나 HealthOmics가 어떤 이유로든 DSL 정보를 구문 분석할 수 없는 경우(예: 워크플로 정의 파일의 구문 오류) HealthOmics는 기본적으로 DSL 2로 설정되고 Nextflow v23.10.0을 실행합니다.
+ 최신 Nextflow 버전 및 소프트웨어 기능을 활용하도록 워크플로를 DSL 1에서 DSL 2로 업그레이드하려면 [DSL 1에서 마이그레이션을](https://nextflow.io/docs/latest/dsl1.html) 참조하세요.

#### Nextflow 버전
<a name="workflows-versions-p2"></a>

HealthOmics는이 파일을 제공하는 경우 Nextflow 구성 파일(nextflow.config)에서 요청된 Nextflow 버전을 감지합니다. 포함된 구성으로 인한 예기치 않은 재정의를 방지하려면 파일 끝에 `nextflowVersion` 절을 추가하는 것이 좋습니다. 자세한 내용은 [Nextflow 구성을](https://nextflow.io/docs/latest/config.html) 참조하세요.

다음 구문을 사용하여 Nextflow 버전 또는 버전 범위를 지정할 수 있습니다.

```
   // exact match
   manifest.nextflowVersion = '1.2.3'   
            
   // 1.2 or later (excluding 2 and later)
   manifest.nextflowVersion = '1.2+'         
            
   // 1.2 or later
   manifest.nextflowVersion = '>=1.2'
            
   // any version in the range 1.2 to 1.5
   manifest.nextflowVersion = '>=1.2, <=1.5' 
            
   // use the "!" prefix to stop execution if the current version 
   // doesn't match the required version.
   manifest.nextflowVersion = '!>=1.2'
```

HealthOmics는 Nextflow 버전 정보를 다음과 같이 처리합니다.
+ **=**를 사용하여 HealthOmics가 지원하는 정확한 버전을 지정하는 경우 HealthOmics는 해당 버전을 사용합니다.
+ **\$1**를 사용하여 지원되지 않는 정확한 버전 또는 버전 범위를 지정하는 경우 HealthOmics는 예외를 발생시키고 실행에 실패합니다. 버전 요청을 엄격하게 적용하고 요청에 지원되지 않는 버전이 포함된 경우 빠르게 실패하려면이 옵션을 사용하는 것이 좋습니다.
+ 버전 범위를 지정하면 범위에 v24.10.8가 포함되지 않는 한 HealthOmics는 해당 범위에서 지원되는 최신 버전을 사용합니다. 이 경우 HealthOmics는 이전 버전을 선호합니다. 예를 들어 범위가 v23.10.0과 v24.10.8를 모두 포함하는 경우 HealthOmics는 v23.10.0을 선택합니다.
+ 요청된 버전이 없거나 요청된 버전이 유효하지 않거나 어떤 이유로든 구문 분석할 수 없는 경우:
  + DSL 1을 지정한 경우 HealthOmics는 Nextflow v22.04를 실행합니다.
  + 그렇지 않으면 HealthOmics는 Nextflow v23.10.0을 실행합니다.

 각 실행에 HealthOmics가 사용한 Nextflow 버전에 대한 다음 정보를 검색할 수 있습니다.
+ 실행 로그에는 HealthOmics가 실행에 사용한 실제 Nextflow 버전에 대한 정보가 포함되어 있습니다.
+ HealthOmics는 요청된 버전과 직접 일치하지 않거나 지정한 버전과 다른 버전을 사용해야 하는 경우 실행 로그에 경고를 추가합니다.
+ **GetRun** API 작업에 대한 응답에는 HealthOmics가 실행에 사용한 실제 Nextflow 버전이 포함된 필드(`engineVersion`)가 포함됩니다. 예제:

  ```
  "engineVersion":"22.04.0"
  ```

# HealthOmics 작업에 대한 컴퓨팅 및 메모리 요구 사항
<a name="memory-and-compute-tasks"></a>

HealthOmics는 omics 인스턴스에서 프라이빗 워크플로 작업을 실행합니다. HealthOmics는 다양한 유형의 작업을 수용할 수 있는 다양한 인스턴스 유형을 제공합니다. 각 인스턴스 유형에는 고정 메모리 및 vCPU 구성(및 가속 컴퓨팅 인스턴스 유형에 대한 고정 GPU 구성)이 있습니다. omics 인스턴스 사용 비용은 인스턴스 유형에 따라 다릅니다. 자세한 내용은 [HealthOmics 요금](https://aws.amazon.com/healthomics/pricing/) 페이지를 참조하세요.

워크플로의 태스크의 경우 워크플로 정의 파일에서 필요한 메모리와 vCPUs를 지정합니다. 워크플로 작업이 실행되면 HealthOmics는 요청된 메모리 및 vCPUs. 예를 들어 작업에 64GiB의 메모리와 8개의 vCPUs 필요한 경우 HealthOmics는를 선택합니다`omics.r.2xlarge`.

인스턴스 유형을 검토하고 요구 사항에 가장 적합한 인스턴스와 일치하도록 요청된 vCPUs 및 메모리 크기를 설정하는 것이 좋습니다. 작업 컨테이너는 인스턴스 유형에 추가 vCPUs 및 메모리가 있더라도 워크플로 정의 파일에 지정한 vCPUs 수와 메모리 크기를 사용합니다.

다음 목록에는 vCPU 및 메모리 할당에 대한 추가 정보가 포함되어 있습니다.
+ 컨테이너 리소스 할당은 하드 제한입니다. 작업의 메모리가 부족하거나 추가 vCPUs를 사용하려고 하면 작업에서 오류 로그가 생성되고 종료됩니다.
+ 컴퓨팅 또는 메모리 요구 사항을 지정하지 않으면 HealthOmics는 vCPU 1**omics.c.large**개와 메모리 1GiB가 있는 구성을 선택하고 기본값으로 설정합니다.
+ 요청할 수 있는 최소 구성은 vCPU 1개와 메모리 1GiB입니다.
+ 지원되는 인스턴스 유형을 초과하는 vCPUs, 메모리 또는 GPUs를 지정하면 HealthOmics에서 오류 메시지가 발생하고 워크플로가 검증에 실패합니다.
+ 분수 단위를 지정하면 HealthOmics는 가장 가까운 정수로 반올림합니다.
+ HealthOmics는 관리 및 로깅 에이전트를 위해 소량의 메모리(5%)를 예약하므로 작업의 애플리케이션에서 전체 메모리 할당을 항상 사용할 수 있는 것은 아닙니다.
+ HealthOmics는 지정한 컴퓨팅 및 메모리 요구 사항에 맞게 인스턴스 유형과 일치하며 하드웨어 생성을 혼합하여 사용할 수 있습니다. 따라서 동일한 작업에 대한 작업 실행 시간에 약간의 차이가 있을 수 있습니다.

이 주제에서는 HealthOmics가 지원하는 인스턴스 유형에 대한 세부 정보를 제공합니다.

**Topics**
+ [표준 인스턴스 유형](#workflow-task-standard-instances)
+ [컴퓨팅 최적화 인스턴스](#workflow-task-compute-optimized-instances)
+ [메모리 최적화 인스턴스](#workflow-task-memory-optimized-instances)
+ [가속 컴퓨팅 인스턴스](#workflow-task-accelerated-computing-instances)

**참고**  
 표준, 컴퓨팅 및 메모리 최적화 인스턴스의 경우 인스턴스에 더 높은 처리량이 필요한 경우 인스턴스 대역폭 크기를 늘립니다. vCPUs(크기 4xl 이하)인 Amazon EC2 인스턴스는 처리량 버스팅이 발생할 수 있습니다. Amazon EC2 인스턴스 처리량에 대한 자세한 내용은 [Amazon EC2 사용 가능한 인스턴스 대역폭](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-network-bandwidth.html#available-instance-bandwidth)을 참조하세요.

## 표준 인스턴스 유형
<a name="workflow-task-standard-instances"></a>

표준 인스턴스 유형의 경우 구성은 컴퓨팅 성능과 메모리의 균형을 목표로 합니다.

HealthOmics는 미국 서부(오레곤) 및 미국 동부(버지니아 북부) 리전에서 32xlarge 및 48xlarge 인스턴스를 지원합니다.


| Instance | vCPUs 수 | Memory | 
| --- | --- | --- | 
| omics.m.large | 2 | 8GiB | 
| omics.m.xlarge | 4 | 16GiB | 
| omics.m.2xlarge | 8 | 32GiB | 
| omics.m.4xlarge | 16 | 64GiB | 
| omics.m.8xlarge | 32 | 128GiB | 
| omics.m.12xlarge | 48 | 192GiB | 
| omics.m.16xlarge | 64 | 256GiB | 
| omics.m.24xlarge | 96 | 384 GiB | 
| omics.m.32xlarge | 128 | 512GiB | 
| omics.m.48xlarge | 192 | 768GiB | 

## 컴퓨팅 최적화 인스턴스
<a name="workflow-task-compute-optimized-instances"></a>

컴퓨팅 최적화 인스턴스 유형의 경우 구성의 컴퓨팅 성능과 메모리가 더 적습니다.

HealthOmics는 미국 서부(오레곤) 및 미국 동부(버지니아 북부) 리전에서 32xlarge 및 48xlarge 인스턴스를 지원합니다.


| Instance | vCPUs 수 | Memory | 
| --- | --- | --- | 
| omics.c.large | 2 | 4GiB | 
| omics.c.xlarge | 4 | 8GiB | 
| omics.c.2xlarge | 8 | 16GiB | 
| omics.c.4xlarge | 16 | 32GiB | 
| omics.c.8xlarge | 32 | 64GiB | 
| omics.c.12xlarge | 48 | 96GiB | 
| omics.c.16xlarge | 64 | 128GiB | 
| omics.c.24xlarge | 96 | 192GiB | 
| omics.c.32xlarge | 128 | 256GiB | 
| omics.c.48xlarge | 192 | 384 GiB | 

## 메모리 최적화 인스턴스
<a name="workflow-task-memory-optimized-instances"></a>

메모리 최적화 인스턴스 유형의 경우 구성의 컴퓨팅 성능과 메모리가 더 적습니다.

HealthOmics는 미국 서부(오레곤) 및 미국 동부(버지니아 북부) 리전에서 32xlarge 및 48xlarge 인스턴스를 지원합니다.


| Instance | vCPUs 수 | Memory | 
| --- | --- | --- | 
| omics.r.large | 2 | 16GiB | 
| omics.r.xlarge | 4 | 32GiB | 
| omics.r.2xlarge | 8 | 64GiB | 
| omics.r.4xlarge | 16 | 128GiB | 
| omics.r.8xlarge | 32 | 256GiB | 
| omics.r.12xlarge | 48 | 384 GiB | 
| omics.r.16xlarge | 64 | 512GiB | 
| omics.r.24xlarge | 96 | 768GiB | 
| omics.r.32xlarge | 128 | 1024GiB | 
| omics.r.48xlarge | 192 | 1536GiB | 

## 가속 컴퓨팅 인스턴스
<a name="workflow-task-accelerated-computing-instances"></a>

HealthOmics가 작업에 가속 컴퓨팅 인스턴스를 할당하도록 워크플로의 각 작업에 대해 GPU 리소스를 선택적으로 지정할 수 있습니다. 워크플로 정의 파일에서 GPU 정보를 지정하는 방법에 대한 자세한 내용은 섹션을 참조하세요[HealthOmics 워크플로 정의의 태스크 액셀러레이터](task-accelerators.md).

여러 인스턴스 유형을 지원하는 태스크 액셀러레이터를 지정하는 경우 HealthOmics는 가용성에 따라 인스턴스 유형을 선택합니다. 두 개 이상의 인스턴스 유형을 사용할 수 있는 경우 HealthOmics는 저렴한 인스턴스를 선호합니다. 리전에서 사용 가능한 최신 세대 인스턴스를 기본 설정하는 nvidia-t4-a10g-l4 태스크 액셀러레이터는 예외입니다.

이스라엘(텔아비브) 리전에서는 G4 인스턴스가 지원되지 않습니다. 아시아 태평양(싱가포르) 리전에서는 G5 인스턴스가 지원되지 않습니다.



**Topics**
+ [G6 및 G6e 인스턴스 유형](#workflow-task-accelerated-accelerated-g6)
+ [G4 및 G5 인스턴스](#workflow-task-accelerated-accelerated-g45)

### G6 및 G6e 인스턴스 유형
<a name="workflow-task-accelerated-accelerated-g6"></a>

HealthOmics는 다음과 같은 G6 가속 컴퓨팅 인스턴스 구성을 지원합니다. 모든 omics.g6 인스턴스는 Nvidia L4 GPUs 사용합니다.

HealthOmics는 미국 서부(오레곤) 및 미국 동부(버지니아 북부) 리전에서 G6 및 G6e 인스턴스를 지원합니다.


| Instance | vCPUs 수 | Memory | GPUs 수 | GPU 메모리 | 
| --- | --- | --- | --- | --- | 
| omics.g6.xlarge | 4 | 16GiB | 1 | 24GiB | 
| omics.g6.2xlarge | 8 | 32GiB | 1 | 24GiB | 
| omics.g6.4xlarge | 16 | 64GiB | 1 | 24GiB | 
| omics.g6.8xlarge | 32 | 128GiB | 1 | 24GiB | 
| omics.g6.12xlarge | 48 | 192GiB | 4 | 96GiB | 
| omics.g6.16xlarge | 64 | 256GiB | 1 | 24GiB | 
| omics.g6.24xlarge | 96 | 384 GiB | 4 | 96GiB | 

모든 omics.g6e 인스턴스는 Nvidia L40s GPUs 사용합니다.


| Instance | vCPUs 수 | Memory | GPUs 수 | GPU 메모리 | 
| --- | --- | --- | --- | --- | 
| omics.g6e.xlarge | 4 | 32GiB | 1 | 48GiB | 
| omics.g6e.2xlarge | 8 | 64GiB | 1 | 48GiB | 
| omics.g6e.4xlarge | 16 | 128GiB | 1 | 48GiB | 
| omics.g6e.8xlarge | 32 | 256GiB | 1 | 48GiB | 
| omics.g6e.12xlarge | 48 | 384 GiB | 4 | 192GiB | 
| omics.g6e.16xlarge | 64 | 512GiB | 1 | 48GiB | 
| omics.g6e.24xlarge | 96 | 768GiB | 4 | 192GiB | 

### G4 및 G5 인스턴스
<a name="workflow-task-accelerated-accelerated-g45"></a>

HealthOmics는 다음과 같은 G4 및 G5 가속 컴퓨팅 인스턴스 구성을 지원합니다.

모든 omics.g5 인스턴스는 Nvidia Tesla A10G GPUs 사용합니다.


| Instance | vCPUs 수 | Memory | GPUs 수 | GPU 메모리 | 
| --- | --- | --- | --- | --- | 
| omics.g5.xlarge | 4 | 16GiB | 1 | 24GiB | 
| omics.g5.2xlarge | 8 | 32GiB | 1 | 24GiB | 
| omics.g5.4xlarge | 16 | 64GiB | 1 | 24GiB | 
| omics.g5.8xlarge | 32 | 128GiB | 1 | 24GiB | 
| omics.g5.12xlarge | 48 | 192GiB | 4 | 96GiB | 
| omics.g5.16xlarge | 64 | 256GiB | 1 | 24GiB | 
| omics.g5.24xlarge | 96 | 384 GiB | 4 | 96GiB | 

모든 omics.g4dn 인스턴스는 Nvidia Tesla T4 GPUs 사용합니다.


| Instance | vCPUs 수 | Memory | GPUs 수 | GPU 메모리 | 
| --- | --- | --- | --- | --- | 
| omics.g4dn.xlarge | 4 | 16GiB | 1 | 16GiB | 
| omics.g4dn.2xlarge | 8 | 32GiB | 1 | 16GiB | 
| omics.g4dn.4xlarge | 16 | 64GiB | 1 | 16GiB | 
| omics.g4dn.8xlarge | 32 | 128GiB | 1 | 16GiB | 
| omics.g4dn.12xlarge | 48 | 192GiB | 4 | 64GiB | 
| omics.g4dn.16xlarge | 64 | 256GiB | 1 | 24GiB | 

# HealthOmics 워크플로 정의의 작업 출력
<a name="workflows-task-outputs"></a>

워크플로 정의에서 작업 출력을 지정합니다. 기본적으로 HealthOmics는 워크플로가 완료되면 모든 중간 작업 파일을 삭제합니다. 중간 파일을 내보내려면 이를 출력으로 정의합니다.

호출 캐싱을 사용하는 경우 HealthOmics는 출력으로 정의한 중간 파일을 포함하여 작업 출력을 캐시에 저장합니다.

다음 주제에는 각 워크플로 정의 언어에 대한 작업 정의 예제가 포함되어 있습니다.

**Topics**
+ [WDL에 대한 작업 출력](#workflow-task-outputs-wdl)
+ [Nextflow에 대한 작업 출력](#workflow-task-outputs-nextflow)
+ [CWL에 대한 작업 출력](#workflow-task-outputs-cwl)

## WDL에 대한 작업 출력
<a name="workflow-task-outputs-wdl"></a>

WDL로 작성된 워크플로 정의의 경우 최상위 워크플로 **outputs** 섹션에서 출력을 정의합니다.

HealthOmics

**Topics**
+ [STDOUT에 대한 작업 출력](#task-outputs-wdl-stdout)
+ [STDERR에 대한 작업 출력](#task-outputs-wdl-stderr)
+ [파일에 대한 작업 출력](#task-outputs-wdl-file)
+ [파일 배열에 대한 작업 출력](#task-outputs-wdl-files)

### STDOUT에 대한 작업 출력
<a name="task-outputs-wdl-stdout"></a>

이 예제에서는 STDOUT 콘텐츠를 작업 출력 파일에 에코`SayHello`하는 라는 작업을 생성합니다. WDL **stdout** 함수는 파일에서 STDOUT 콘텐츠(이 예제에서는 입력 문자열 **Hello World\$1**)를 캡처합니다**stdout\$1file**.

HealthOmics는 모든 STDOUT 콘텐츠에 대한 로그를 생성하므로 출력은 작업에 대한 다른 STDERR 로깅 정보와 함께 CloudWatch Logs에도 표시됩니다.

```
version 1.0
 workflow HelloWorld {
    input {
        String message = "Hello, World!"
        String ubuntu_container = "123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/library/ubuntu:20.04"
    }

    call SayHello {
        input:
            message = message,
            container = ubuntu_container
    }

    output {
        File stdout_file = SayHello.stdout_file
    }
}

task SayHello {
    input {
        String message
        String container
    }

    command <<<
        echo "~{message}" 
        echo "Current date: $(date)"
        echo "This message was printed to STDOUT"
    >>>

    runtime {
        docker: container
        cpu: 1
        memory: "2 GB"
    }

    output {
        File stdout_file = stdout()
    }
}
```

### STDERR에 대한 작업 출력
<a name="task-outputs-wdl-stderr"></a>

이 예제에서는 STDERR 콘텐츠를 작업 출력 파일에 에코`SayHello`하는 라는 작업을 생성합니다. WDL **stderr** 함수는 파일에서 STDERR 콘텐츠(이 예에서는 입력 문자열 **Hello World\$1**)를 캡처합니다**stderr\$1file**.

HealthOmics는 모든 STDERR 콘텐츠에 대한 로그를 생성하므로 출력은 작업에 대한 다른 STDERR 로깅 정보와 함께 CloudWatch Logs에 표시됩니다.

```
version 1.0
 workflow HelloWorld {
    input {
        String message = "Hello, World!"
        String ubuntu_container = "123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/library/ubuntu:20.04"
    }

    call SayHello {
        input:
            message = message,
            container = ubuntu_container
    }

    output {
        File stderr_file = SayHello.stderr_file
    }
}

task SayHello {
    input {
        String message
        String container
    }

    command <<<
        echo "~{message}" >&2
        echo "Current date: $(date)" >&2
        echo "This message was printed to STDERR" >&2
    >>>

    runtime {
        docker: container
        cpu: 1
        memory: "2 GB"
    }

    output {
        File stderr_file = stderr()
    }
}
```

### 파일에 대한 작업 출력
<a name="task-outputs-wdl-file"></a>

이 예제에서 SayHello 작업은 두 개의 파일(message.txt 및 info.txt)을 생성하고 이러한 파일을 명명된 출력(message\$1file 및 info\$1file)으로 명시적으로 선언합니다.

```
version 1.0
workflow HelloWorld {
    input {
        String message = "Hello, World!"
        String ubuntu_container = "123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/library/ubuntu:20.04"
    }

    call SayHello {
        input:
            message = message,
            container = ubuntu_container
    }

    output {
        File message_file = SayHello.message_file
        File info_file = SayHello.info_file
    }
}

task SayHello {
    input {
        String message
        String container
    }

    command <<<
        # Create message file
        echo "~{message}" > message.txt
        
        # Create info file with date and additional information
        echo "Current date: $(date)" > info.txt
        echo "This message was saved to a file" >> info.txt
    >>>

    runtime {
        docker: container
        cpu: 1
        memory: "2 GB"
    }

    output {
        File message_file = "message.txt"
        File info_file = "info.txt"
    } 
}
```

### 파일 배열에 대한 작업 출력
<a name="task-outputs-wdl-files"></a>

이 예제에서 `GenerateGreetings` 작업은 파일 배열을 작업 출력으로 생성합니다. 작업은 입력 배열의 각 멤버에 대해 하나의 인사말 파일을 동적으로 생성합니다`names`. 런타임까지 파일 이름을 알 수 없으므로 출력 정의는 WDL glob() 함수를 사용하여 패턴과 일치하는 모든 파일을 출력합니다`*_greeting.txt`.

```
version 1.0
 workflow HelloArray {
    input {
        Array[String] names = ["World", "Friend", "Developer"]
        String ubuntu_container = "123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/library/ubuntu:20.04"
    }

    call GenerateGreetings {
        input:
            names = names,
            container = ubuntu_container
    }

    output {
        Array[File] greeting_files = GenerateGreetings.greeting_files
    }
}

task GenerateGreetings {
    input {
        Array[String] names
        String container
    }

    command  <<<
        # Create a greeting file for each name
        for name in ~{sep=" " names}; do
            echo "Hello, $name!" > ${name}_greeting.txt
        done
    >>>

    runtime {
        docker: container
        cpu: 1
        memory: "2 GB"
    }

    output {
        Array[File] greeting_files = glob("*_greeting.txt")
    }       
 }
```

## Nextflow에 대한 작업 출력
<a name="workflow-task-outputs-nextflow"></a>

Nextflow에 작성된 워크플로 정의의 경우 **publishDir** 명령을 정의하여 작업 콘텐츠를 출력 Amazon S3 버킷으로 내보냅니다. **publishDir** 값을 로 설정합니다`/mnt/workflow/pubdir`.

HealthOmics가 Amazon S3로 파일을 내보내려면 파일이이 디렉터리에 있어야 합니다.

작업이 후속 작업에 대한 입력으로 사용할 출력 파일 그룹을 생성하는 경우 이러한 파일을 디렉터리에 그룹화하고 디렉터리를 작업 출력으로 내보내는 것이 좋습니다. 각 개별 파일을 열거하면 기본 파일 시스템에서 I/O 병목 현상이 발생할 수 있습니다. 예:

```
process my_task {
      ...
      // recommended
      output "output-folder/", emit: output
      
      // not recommended
      // output "output-folder/**", emit: output
      ...
  }
```

## CWL에 대한 작업 출력
<a name="workflow-task-outputs-cwl"></a>

CWL로 작성된 워크플로 정의의 경우 작업을 사용하여 `CommandLineTool` 작업 출력을 지정할 수 있습니다. 다음 섹션에서는 다양한 유형의 출력을 정의하는 `CommandLineTool` 작업의 예를 보여줍니다.

**Topics**
+ [STDOUT에 대한 작업 출력](#task-outputs-cwl-stdout)
+ [STDERR에 대한 작업 출력](#task-outputs-cwl-stderr)
+ [파일에 대한 작업 출력](#task-outputs-cwl-file)
+ [파일 배열에 대한 작업 출력](#task-outputs-cwl-files)

### STDOUT에 대한 작업 출력
<a name="task-outputs-cwl-stdout"></a>

이 예제에서는 STDOUT 콘텐츠를 라는 텍스트 출력 파일로 에코하는 `CommandLineTool` 작업을 생성합니다**output.txt**. 예를 들어 다음 입력을 입력하면 결과 작업 출력은 **output.txt** 파일의 **Hello World\$1**입니다.

```
{
    "message": "Hello World!"
}
```

`outputs` 명령은 출력 이름이 **example\$1out** 이고 유형이 임을 지정합니다`stdout`. 다운스트림 작업이이 작업의 출력을 소비하려면 출력을 라고 합니다`example_out`.

HealthOmics는 모든 STDERR 및 STDOUT 콘텐츠에 대한 로그를 생성하므로 출력은 작업에 대한 다른 STDERR 로깅 정보와 함께 CloudWatch Logs에도 표시됩니다.

```
cwlVersion: v1.2
class: CommandLineTool
baseCommand: echo
stdout: output.txt
inputs:
  message:
    type: string
    inputBinding:
      position: 1
outputs:
  example_out:
    type: stdout

requirements:
    DockerRequirement:
        dockerPull: 123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/library/ubuntu:20.04
    ResourceRequirement:
        ramMin: 2048
        coresMin: 1
```

### STDERR에 대한 작업 출력
<a name="task-outputs-cwl-stderr"></a>

이 예제에서는 STDERR 콘텐츠를 라는 텍스트 출력 파일로 에코하는 `CommandLineTool` 작업을 생성합니다**stderr.txt**. 작업은가 (STDOUT 대신) STDERR에 `echo` 쓰`baseCommand`도록를 수정합니다.

`outputs` 명령은 출력 이름이 **stderr\$1out** 이고 유형이 임을 지정합니다`stderr`.

HealthOmics는 모든 STDERR 및 STDOUT 콘텐츠에 대한 로그를 생성하므로 작업에 대한 다른 STDERR 로깅 정보와 함께 출력이 CloudWatch Logs에 표시됩니다.

```
cwlVersion: v1.2
class: CommandLineTool
baseCommand: [bash, -c]
stderr: stderr.txt
inputs:
  message:
    type: string
    inputBinding:
      position: 1
      shellQuote: true
      valueFrom: "echo $(self) >&2"
outputs:
  stderr_out:
    type: stderr

requirements:
    DockerRequirement:
        dockerPull: 123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/library/ubuntu:20.04
    ResourceRequirement:
        ramMin: 2048
        coresMin: 1
```

### 파일에 대한 작업 출력
<a name="task-outputs-cwl-file"></a>

이 예제에서는 입력 파일에서 압축된 tar 아카이브를 생성하는 `CommandLineTool` 작업을 생성합니다. 아카이브의 이름을 입력 파라미터(archive\$1name)로 제공합니다.

**outputs** 명령은 `archive_file` 출력 유형이 임을 지정`File`하고 입력 파라미터에 대한 참조를 사용하여 출력 파일에 `archive_name` 바인딩합니다.

```
cwlVersion: v1.2
class: CommandLineTool
baseCommand: [tar, cfz]
inputs:
  archive_name:
    type: string
    inputBinding:
      position: 1
  input_files:
    type: File[]
    inputBinding:
      position: 2
      
outputs:
  archive_file:
    type: File
    outputBinding:
      glob: "$(inputs.archive_name)"

requirements:
    DockerRequirement:
        dockerPull: 123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/library/ubuntu:20.04
    ResourceRequirement:
        ramMin: 2048
        coresMin: 1
```

### 파일 배열에 대한 작업 출력
<a name="task-outputs-cwl-files"></a>

이 예제에서 `CommandLineTool` 작업은 `touch` 명령을 사용하여 파일 배열을 생성합니다. 명령은 `files-to-create` 입력 파라미터의 문자열을 사용하여 파일의 이름을 지정합니다. 명령은 파일 배열을 출력합니다. 배열에는 작업 디렉터리에서 `glob` 패턴과 일치하는 모든 파일이 포함됩니다. 이 예제에서는 모든 파일과 일치하는 와일드카드 패턴("\$1")을 사용합니다.

```
cwlVersion: v1.2
class: CommandLineTool
baseCommand: touch
inputs:
  files-to-create:
    type:
      type: array
      items: string
    inputBinding:
      position: 1
outputs:
  output-files:
    type:
      type: array
      items: File
    outputBinding:
      glob: "*"

requirements:
    DockerRequirement:
        dockerPull: 123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/library/ubuntu:20.04
    ResourceRequirement:
        ramMin: 2048
        coresMin: 1
```

# HealthOmics 워크플로 정의의 태스크 리소스
<a name="task-resources"></a>

워크플로 정의에서 각 작업에 대해 다음을 정의합니다.
+ 작업의 컨테이너 이미지입니다. 자세한 내용은 [프라이빗 워크플로용 컨테이너 이미지](workflows-ecr.md) 단원을 참조하십시오.
+ 작업에 필요한 CPUs 및 메모리 수입니다. 자세한 내용은 [HealthOmics 작업에 대한 컴퓨팅 및 메모리 요구 사항](memory-and-compute-tasks.md) 단원을 참조하십시오.

HealthOmics는 작업별 스토리지 사양을 무시합니다. HealthOmics는 실행 중인 모든 작업이 액세스할 수 있는 실행 스토리지를 제공합니다. 자세한 내용은 [HealthOmics 워크플로에서 스토리지 유형 실행](workflows-run-types.md) 단원을 참조하십시오.

------
#### [ WDL ]

```
task my_task {
   runtime {
      container: "<aws-account-id>.dkr.ecr.<aws-region>.amazonaws.com/<image-name>"
      cpu: 2
      memory: "4 GB"
   }
   ...
}
```

WDL 워크플로의 경우 HealthOmics는 서비스 오류로 인해 실패한 작업에 대해 최대 2회의 재시도를 시도합니다(API 요청은 5XX HTTP 상태 코드를 반환함). 작업 재시도에 대한 자세한 내용은 섹션을 참조하세요[작업 재시도](monitoring-runs.md#run-status-task-retries).

WDL 정의 파일에서 작업에 대해 다음 구성을 지정하여 재시도 동작을 옵트아웃할 수 있습니다.

```
runtime {
   preemptible: 0
}
```

------
#### [ NextFlow ]

```
process my_task {
   container "<aws-account-id>.dkr.ecr.<aws-region>.amazonaws.com/<image-name>"
   cpus 2
   memory "4 GiB"
   ...
}
```

------
#### [ CWL ]

```
cwlVersion: v1.2
class: CommandLineTool
requirements:
    DockerRequirement:
        dockerPull: "<aws-account-id>.dkr.ecr.<aws-region>.amazonaws.com/<image-name>"
    ResourceRequirement:
        coresMax: 2
        ramMax: 4000 # specified in mebibytes
```

------

# HealthOmics 워크플로 정의의 태스크 액셀러레이터
<a name="task-accelerators"></a>

워크플로 정의에서 선택적으로 작업에 대한 GPU 액셀러레이터 사양을 지정할 수 있습니다. HealthOmics는 지원되는 인스턴스 유형과 함께 다음 액셀러레이터 사양 값을 지원합니다.


| 액셀러레이터 사양 | Healthomics 인스턴스 유형 | 
| --- | --- | 
| nvidia-tesla-t4 | G4 | 
| nvidia-tesla-t4-a10g | G4 및 G5 | 
| nvidia-tesla-a10g | G5 | 
| nvidia-t4-a10g-l4 | G4, G5 및 G6 | 
| nvidia-l4-a10g | G5 및 G6 | 
| nvidia-l4 | G6 | 
| nvidia-l40s | G6e | 

여러 인스턴스 유형을 지원하는 액셀러레이터 유형을 지정하는 경우 HealthOmics는 사용 가능한 용량을 기반으로 인스턴스 유형을 선택합니다. 두 인스턴스 유형을 모두 사용할 수 있는 경우 HealthOmics는 저렴한 인스턴스를 선호합니다. 단, 사용 가능한 최신 세대 인스턴스에 대한 기본 설정을 제공하는 nvidia-t4-a10g-l4 태스크 액셀러레이터는 예외입니다.

인스턴스 유형에 대한 자세한 내용은 섹션을 참조하세요[가속 컴퓨팅 인스턴스](memory-and-compute-tasks.md#workflow-task-accelerated-computing-instances).

다음 예제에서 워크플로 정의는를 액셀러레이터`nvidia-l4`로 지정합니다.

------
#### [ WDL ]

```
task my_task {
 runtime {
    ...
    acceleratorCount: 1
    acceleratorType: "nvidia-l4"
 }
 ...
}
```

------
#### [ NextFlow ]

```
process my_task {
 ...
 accelerator 1, type: "nvidia-l4"
 ...
}
```

------
#### [ CWL ]

```
cwlVersion: v1.2
class: CommandLineTool
requirements:
  ...
  cwltool:CUDARequirement:
      cudaDeviceCountMin: 1
      cudaComputeCapability: "nvidia-l4"
      cudaVersionMin: "1.0"
```

------

# WDL 워크플로 정의 세부 정보
<a name="workflow-languages-wdl"></a>

다음 주제에서는 HealthOmics에서 WDL 워크플로 정의에 사용할 수 있는 유형 및 명령에 대한 세부 정보를 제공합니다.

**Topics**
+ [WDL lenient의 암시적 유형 변환](#workflow-wdl-type-conversion)
+ [input.json의 네임스페이스 정의](#workflow-wdl-namespace-defn)
+ [WDL의 기본 유형](#workflow-wdl-primitive-types)
+ [WDL의 복잡한 유형](#workflow-wdl-complex-types)
+ [WDL의 지침](#workflow-wdl-directives)
+ [WDL의 작업 메타데이터](#workflow-wdl-task-metadata)
+ [WDL 워크플로 정의 예제](#wdl-example)

## WDL lenient의 암시적 유형 변환
<a name="workflow-wdl-type-conversion"></a>

HealthOmics는 input.json 파일 및 워크플로 정의에서 암시적 유형 변환을 지원합니다. 암시적 유형 캐스팅을 사용하려면 워크플로를 생성할 때 워크플로 엔진을 WDL lenient로 지정합니다. WDL lenient는 Cromwell에서 마이그레이션된 워크플로를 처리하도록 설계되었습니다. 고객 Cromwell 지시문과 일부 비준수 로직을 지원합니다.

WDL lenient는 WDL의 [제한된 예외](https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#-limited-exceptions) 목록에 있는 다음 항목에 대한 유형 변환을 지원합니다.
+ Float to Int. 여기서 강제로 인해 정밀도가 손실되지 않습니다(예: 1.0이 1에 매핑됨).
+ Int/Float에 대한 문자열로, 강제로 인해 정밀도가 손실되지 않습니다.
+ Map[W, X]를 Array[Pair[Y, Z]]에 매핑합니다.이 경우 W는 Y에 강제 적용되고 X는 Z에 강제 적용됩니다.
+ Array[Pair[W, X]]를 Map[Y, Z]으로 바꿉니다.이 경우 W는 Y로 강제 적용되고 X는 Z로 강제 적용됩니다(예: 1.0을 1로 매핑).

암시적 유형 캐스팅을 사용하려면 워크플로 또는 워크플로 버전을 생성할 때 워크플로 엔진을 WDL\$1LENIENT로 지정합니다.

콘솔에서 워크플로 엔진 파라미터의 이름은 **Language**입니다. API에서 워크플로 엔진 파라미터의 이름은 **엔진**입니다. 자세한 내용은 [프라이빗 워크플로 생성](create-private-workflow.md) 또는 [워크플로 버전 생성](workflows-version-create.md)을 참조하세요.

## input.json의 네임스페이스 정의
<a name="workflow-wdl-namespace-defn"></a>

HealthOmics는 input.json에서 정규화된 변수를 지원합니다. 예를 들어 워크플로 **SumWorkflow**에서 number1 및 number2라는 두 개의 입력 변수를 선언하는 경우:

```
workflow SumWorkflow {
  input {
    Int number1
    Int number2
  }
}
```

 input.json에서 정규화된 변수로 사용할 수 있습니다.

```
{
    "SumWorkflow.number1": 15,
    "SumWorkflow.number2": 27
}
```

## WDL의 기본 유형
<a name="workflow-wdl-primitive-types"></a>

다음 표는 WDL의 입력이 일치하는 기본 유형에 매핑되는 방법을 보여줍니다. HealthOmics는 유형 강제에 대한 제한된 지원을 제공하므로 명시적 유형을 설정하는 것이 좋습니다.


**기본 유형**  

| WDL 유형 | JSON 유형 | WDL 예 | JSON 키 및 값의 예 | 참고 | 
| --- | --- | --- | --- | --- | 
| Boolean | boolean | Boolean b | "b": true | 값은 소문자여야 하며 따옴표가 없어야 합니다. | 
| Int | integer | Int i | "i": 7 | 따옴표가 없어야 합니다. | 
| Float | number | Float f | "f": 42.2 | 따옴표가 없어야 합니다. | 
| String | string | String s | "s": "characters" | URI인 JSON 문자열은 가져올 WDL 파일에 매핑되어야 합니다. | 
| File | string | File f | "f": "s3://amzn-s3-demo-bucket1/path/to/file" | 워크플로에 제공된 IAM 역할에 이러한 객체에 대한 읽기 액세스 권한이 있는 한 Amazon S3 및 HealthOmics 스토리지 URIs를 가져옵니다. 다른 URI 체계는 지원되지 않습니다(예: file://, https://및 ftp://). URI는 객체를 지정해야 합니다. 디렉터리일 수 없습니다. 즉, 로 끝날 수 없습니다/. | 
| Directory | string | Directory d | "d": "s3://bucket/path/" | Directory 유형은 WDL 1.0 또는 1.1에 포함되지 않으므로 WDL 파일의 헤더version development에를 추가해야 합니다. URI는 Amazon S3 URI여야 하며 접두사가 '/'로 끝나야 합니다. 디렉터리의 모든 콘텐츠는 단일 다운로드로 워크플로에 재귀적으로 복사됩니다. 에는 워크플로와 관련된 파일만 포함되어야 Directory 합니다. | 

## WDL의 복잡한 유형
<a name="workflow-wdl-complex-types"></a>

다음 표는 WDL의 입력이 일치하는 복합 JSON 유형에 매핑되는 방법을 보여줍니다. WDL의 복잡한 유형은 기본 유형으로 구성된 데이터 구조입니다. 목록과 같은 데이터 구조는 배열로 변환됩니다.


**복잡한 유형**  

| WDL 유형 | JSON 유형 | WDL 예 | JSON 키 및 값의 예 | 참고 | 
| --- | --- | --- | --- | --- | 
| Array | array | Array[Int] nums | “nums": [1, 2, 3] | 배열의 멤버는 WDL 배열 유형의 형식을 따라야 합니다. | 
| Pair | object | Pair[String, Int] str\$1to\$1i | “str\$1to\$1i": \$1"left": "0", "right": 1\$1 | 페어의 각 값은 일치하는 WDL 유형의 JSON 형식을 사용해야 합니다. | 
| Map | object | Map[Int, String] int\$1to\$1string | "int\$1to\$1string": \$1 2: "hello", 1: "goodbye" \$1 | 맵의 각 항목은 일치하는 WDL 유형의 JSON 형식을 사용해야 합니다. | 
| Struct | object | <pre>struct SampleBamAndIndex { <br />  String sample_name <br />  File bam <br />  File bam_index <br />} SampleBamAndIndex b_and_i</pre>  |  <pre>"b_and_i": { <br />   "sample_name": "NA12878", <br />   "bam": "s3://amzn-s3-demo-bucket1/NA12878.bam", <br />   "bam_index": "s3://amzn-s3-demo-bucket1/NA12878.bam.bai" <br />}           </pre>  | 구조체 멤버의 이름은 JSON 객체 키의 이름과 정확히 일치해야 합니다. 각 값은 일치하는 WDL 유형의 JSON 형식을 사용해야 합니다. | 
| Object | 해당 사항 없음 | 해당 사항 없음 | 해당 사항 없음 | WDL Object 유형은 오래된 유형이므로 Struct 모든 경우에 로 교체해야 합니다. | 

## WDL의 지침
<a name="workflow-wdl-directives"></a>

HealthOmics는 HealthOmics 지원합니다.

### GPU 리소스 구성
<a name="workflow-wdl-directive-gpu"></a>

HealthOmics는 지원되는 모든 [GPU 인스턴스](https://docs.aws.amazon.com/omics/latest/dev/task-accelerators.html)**acceleratorCount**에서 런타임 속성 **acceleratorType** 및를 지원합니다. HealthOmics는 액셀러레이터와 동일한 기능을 **gpuCount**가진 **gpuType** 및 라는 별칭도 지원합니다. WDL 정의에 두 명령이 모두 포함된 경우 HealthOmics는 액셀러레이터 값을 사용합니다.

다음 예제에서는 이러한 지시문을 사용하는 방법을 보여줍니다.

```
runtime {
    gpuCount: 2
    gpuType: "nvidia-tesla-t4"
}
```

### 서비스 오류에 대한 작업 재시도 구성
<a name="workflow-wdl-task-retry"></a>

HealthOmics는 서비스 오류(5XX HTTP 상태 코드)로 인해 실패한 작업에 대해 최대 2회의 재시도를 지원합니다. 최대 재시도 횟수(1 또는 2)를 구성하고 서비스 오류에 대한 재시도를 옵트아웃할 수 있습니다. 기본적으로 HealthOmics는 최대 2회의 재시도를 시도합니다.

다음 예제에서는 서비스 오류에 대한 재시도를 옵트아웃`preemptible`하도록를 설정합니다.

```
{
  preemptible: 0 
}
```

HealthOmics의 작업 재시도에 대한 자세한 내용은 섹션을 참조하세요[작업 재시도](monitoring-runs.md#run-status-task-retries).

### 메모리 부족에 대한 작업 재시도 구성
<a name="workflow-wdl-retries"></a>

HealthOmics는 메모리가 부족하여 실패한 작업에 대한 재시도를 지원합니다(컨테이너 종료 코드 137, 4XX HTTP 상태 코드). HealthOmics는 각 재시도에 대해 메모리 양을 두 배로 늘립니다.

기본적으로 HealthOmics는 이러한 유형의 실패에 대해 재시도하지 않습니다. `maxRetries` 지시문을 사용하여 최대 재시도 횟수를 지정합니다.

다음 예제에서는를 3`maxRetries`으로 설정하여 HealthOmics가 최대 4회의 작업 완료 시도(최초 시도 \$1 3회의 재시도)를 시도하도록 합니다.

```
runtime {
    maxRetries: 3
}
```

**참고**  
메모리 부족에 대한 작업 재시도에는 GNU findutils 4.2.3 이상이 필요합니다. 기본 HealthOmics 이미지 컨테이너에는이 패키지가 포함되어 있습니다. WDL 정의에서 사용자 지정 이미지를 지정하는 경우 이미지에 GNU findutils 4.2.3 이상이 포함되어 있는지 확인합니다.

### 반환 코드 구성
<a name="workflow-wdl-directive-returnCodes"></a>

**returnCodes** 속성은 작업의 성공적인 실행을 나타내는 반환 코드 또는 반환 코드 세트를 지정하는 메커니즘을 제공합니다. WDL 엔진은 WDL 정의의 **런타임** 섹션에서 지정한 반환 코드를 준수하고 그에 따라 작업 상태를 설정합니다.

```
runtime {
    returnCodes: 1
}
```

HealthOmics는 또한 **returnCodes**와 동일한 기능을 가진 **continueOnReturnCode**라는 별칭을 지원합니다. 두 속성을 모두 지정하면 HealthOmics는 **returnCodes** 값을 사용합니다.

## WDL의 작업 메타데이터
<a name="workflow-wdl-task-metadata"></a>

HealthOmics는 WDL 작업에 대해 다음과 같은 메타데이터 옵션을 지원합니다.

### 휘발성 속성을 사용하여 작업 수준 캐싱 비활성화
<a name="workflow-wdl-volatile-attribute"></a>

**휘발성** 속성을 사용하면 WDL 워크플로의 특정 작업에 대한 통화 캐싱을 비활성화할 수 있습니다. 작업이 휘발성으로 표시되면 실행에 대해 캐싱이 활성화된 경우에도 항상 실행되고 캐시된 결과를 사용하지 않습니다.

작업 정의의 **메타** 섹션에 **휘발성** 속성을 추가합니다.

```
task my_volatile_task {
    meta {
        volatile: true
    }
    
    input {
        String input_file
    }
    
    command {
        echo "Processing ${input_file}" > output.txt
    }
    
    output {
        File result = "output.txt"
    }
}
```

## WDL 워크플로 정의 예제
<a name="wdl-example"></a>

다음 예제에서는 WDL`BAM`에서에서 로 변환`CRAM`하기 위한 프라이빗 워크플로 정의를 보여줍니다. `BAM` 워크플로`CRAM`에 대한는 두 가지 작업을 정의하고 `genomes-in-the-cloud` 컨테이너의 도구를 사용합니다.이 작업은 예제에 나와 있으며 공개적으로 사용할 수 있습니다.

다음 예제에서는 Amazon ECR 컨테이너를 파라미터로 포함하는 방법을 보여줍니다. 이렇게 하면 HealthOmics가 실행을 시작하기 전에 컨테이너에 대한 액세스 권한을 확인할 수 있습니다.

```
{
   ...
   "gotc_docker":"<account_id>.dkr.ecr.<region>.amazonaws.com/genomes-in-the-cloud:2.4.7-1603303710"
}
```

다음 예제에서는 파일이 Amazon S3 버킷에 있을 때 실행에 사용할 파일을 지정하는 방법을 보여줍니다.

```
{
    "input_cram": "s3://amzn-s3-demo-bucket1/inputs/NA12878.cram",
    "ref_dict": "s3://amzn-s3-demo-bucket1/inputs/Homo_sapiens_assembly38.dict",
    "ref_fasta": "s3://amzn-s3-demo-bucket1/inputs/Homo_sapiens_assembly38.fasta",
    "ref_fasta_index": "s3://amzn-s3-demo-bucket1/inputs/Homo_sapiens_assembly38.fasta.fai",
    "sample_name": "NA12878"
}
```

시퀀스 스토어에서 파일을 지정하려면 다음 예제와 같이 시퀀스 스토어의 URI를 사용하여를 지정합니다.

```
{
    "input_cram": "omics://429915189008.storage.us-west-2.amazonaws.com/111122223333/readSet/4500843795/source1",
    "ref_dict": "s3://amzn-s3-demo-bucket1/inputs/Homo_sapiens_assembly38.dict",
    "ref_fasta": "s3://amzn-s3-demo-bucket1/inputs/Homo_sapiens_assembly38.fasta",
    "ref_fasta_index": "s3://amzn-s3-demo-bucket1/inputs/Homo_sapiens_assembly38.fasta.fai",
    "sample_name": "NA12878"
}
```

그런 다음 다음 예제와 같이 WDL에서 워크플로를 정의할 수 있습니다.

```
 version 1.0
workflow CramToBamFlow {
    input {
        File ref_fasta
        File ref_fasta_index
        File ref_dict
        File input_cram
        String sample_name
        String gotc_docker = "<account>.dkr.ecr.us-west-2.amazonaws.com/genomes-in-the-
cloud:latest"
    }
    #Converts CRAM to SAM to BAM and makes BAI.
    call CramToBamTask{
         input:
            ref_fasta = ref_fasta,
            ref_fasta_index = ref_fasta_index,
            ref_dict = ref_dict,
            input_cram = input_cram,
            sample_name = sample_name,
            docker_image = gotc_docker,
     }
     #Validates Bam.
     call ValidateSamFile{
        input:
           input_bam = CramToBamTask.outputBam,
           docker_image = gotc_docker,
     }
     #Outputs Bam, Bai, and validation report to the FireCloud data model.
     output {
         File outputBam = CramToBamTask.outputBam
         File outputBai = CramToBamTask.outputBai
         File validation_report = ValidateSamFile.report
      }
}
#Task definitions.
task CramToBamTask {
    input {
       # Command parameters
       File ref_fasta
       File ref_fasta_index
       File ref_dict
       File input_cram
       String sample_name
       # Runtime parameters
       String docker_image
    }
   #Calls samtools view to do the conversion.
   command {
       set -eo pipefail

       samtools view -h -T ~{ref_fasta} ~{input_cram} |
       samtools view -b -o ~{sample_name}.bam -
       samtools index -b ~{sample_name}.bam
       mv ~{sample_name}.bam.bai ~{sample_name}.bai
    }
    
    #Runtime attributes:
    runtime {
        docker: docker_image
    }

    #Outputs a BAM and BAI with the same sample name
     output {
         File outputBam = "~{sample_name}.bam"
         File outputBai = "~{sample_name}.bai"
    }
}

#Validates BAM output to ensure it wasn't corrupted during the file conversion.
task ValidateSamFile {
   input {
      File input_bam
      Int machine_mem_size = 4
      String docker_image
   }
   String output_name = basename(input_bam, ".bam") + ".validation_report"
   Int command_mem_size = machine_mem_size - 1
   command {
       java -Xmx~{command_mem_size}G -jar /usr/gitc/picard.jar \
       ValidateSamFile \
       INPUT=~{input_bam} \
       OUTPUT=~{output_name} \
       MODE=SUMMARY \
       IS_BISULFITE_SEQUENCED=false
    }
    runtime {
    docker: docker_image
    }
   #A text file is generated that lists errors or warnings that apply.
    output {
        File report = "~{output_name}"
    }
}
```

# Nextflow 워크플로 정의 세부 정보
<a name="workflow-definition-nextflow"></a>

HealthOmics는 Nextflow DSL1 및 DSL2를 지원합니다. 자세한 내용은 [Nextflow 버전 지원](workflows-lang-versions.md#workflows-lang-versions-nextflow)을 참조하세요.

Nextflow DSL2는 Groovy 프로그래밍 언어를 기반으로 하므로 파라미터는 동적이며 Groovy와 동일한 규칙을 사용하여 강제 유형을 지정할 수 있습니다. 입력 JSON에서 제공하는 파라미터와 값은 워크플로의 파라미터(`params`) 맵에서 사용할 수 있습니다.

**Topics**
+ [nf-schema 및 nf-validation 플러그인 사용](#schema-and-validation-plugins-nextflow)
+ [스토리지 URIs 지정](#storage-uris-nextflow)
+ [Nextflow 지시문](#workflow-nexflow-directives)
+ [작업 콘텐츠 내보내기](#exporting-task-content-nextflow)

## nf-schema 및 nf-validation 플러그인 사용
<a name="schema-and-validation-plugins-nextflow"></a>

**참고**  
플러그인에 대한 HealthOmics 지원 요약:  
v22.04 - 플러그인을 지원하지 않음
v23.10 - `nf-schema` 및 지원 `nf-validation`
v24.10 - 지원 `nf-schema`

HealthOmics는 Nextflow 플러그인에 대해 다음과 같은 지원을 제공합니다.
+ Nextflow v23.10의 경우 HealthOmics는 nf-validation@1.1.1 플러그인을 사전 설치합니다.
+ Nextflow v23.10 이상의 경우 HealthOmics는 nf-schema@2.3.0 플러그인을 사전 설치합니다.
+ 워크플로 실행 중에는 추가 플러그인을 검색할 수 없습니다. HealthOmics는 `nextflow.config` 파일에서 지정한 다른 플러그인 버전을 무시합니다.
+ Nextflow v24 이상의 경우 `nf-schema`는 더 이상 사용되지 않는 `nf-validation` 플러그인의 새 버전입니다. 자세한 내용은 Nextflow GitHub [ 리포지토리의 nf-schema](https://github.com/nextflow-io/nf-schema)를 참조하세요.

## 스토리지 URIs 지정
<a name="storage-uris-nextflow"></a>

Amazon S3 또는 HealthOmics URI를 사용하여 Nextflow 파일 또는 경로 객체를 구성하는 경우 읽기 액세스 권한이 부여되는 한 워크플로에서 일치하는 객체를 사용할 수 있습니다. Amazon S3 URIs. 예시는 [Amazon S3 입력 파라미터 형식](workflows-run-inputs.md#s3-run-input-formats) 섹션을 참조하세요.

HealthOmics는 Amazon S3 URIs 또는 HealthOmics 스토리지 URIs에서 glob 패턴 사용을 부분적으로 지원합니다. 워크플로 정의에서 `path` 또는 `file` 채널 생성에 Glob 패턴을 사용합니다. 예상되는 동작과 정확한 사례는 단원을 참조하십시오[Amazon S3 입력에서 Glob 패턴의 Nextflow 처리](workflows-run-inputs.md#wd-nextflow-s3-formats).

## Nextflow 지시문
<a name="workflow-nexflow-directives"></a>

Nextflow 구성 파일 또는 워크플로 정의에서 Nextflow 지시문을 구성합니다. 다음 목록은 HealthOmics가 구성 설정을 적용하는 데 사용하는 우선 순위의 순서를 가장 낮은 우선 순위부터 가장 높은 우선 순위까지 보여줍니다.

1. 구성 파일의 전역 구성입니다.

1. 워크플로 정의의 작업 섹션입니다.

1. 구성 파일의 작업별 선택기입니다.

**Topics**
+ [를 사용한 작업 재시도 전략 `errorStrategy`](#workflow-nextflow-errorStrategy)
+ [를 사용하여 작업 재시도 `maxRetries`](#workflow-nexflow-task-retry)
+ [를 사용하여 작업 재시도 옵트아웃 `omicsRetryOn5xx`](#workflow-nextflow-retry-5xx)
+ [`time` 지시문을 사용한 작업 기간](#time-directive-nextflow)

### 를 사용한 작업 재시도 전략 `errorStrategy`
<a name="workflow-nextflow-errorStrategy"></a>

`errorStrategy` 지시문을 사용하여 작업 오류에 대한 전략을 정의합니다. 기본적으로 작업이 오류 표시(종료 상태가 0이 아님)와 함께 반환되면 작업이 중지되고 HealthOmics가 전체 실행을 종료합니다. 를 `errorStrategy`로 설정하면 `retry` HealthOmics는 실패한 작업을 한 번 재시도합니다. 재시도 횟수를 늘리려면 섹션을 참조하세요[를 사용하여 작업 재시도 `maxRetries`](#workflow-nexflow-task-retry).

```
process {
    label 'my_label'
    errorStrategy 'retry'

    script:
    """
    your-command-here
    """
}
```

HealthOmics가 실행 중에 작업 재시도를 처리하는 방법에 대한 자세한 내용은 섹션을 참조하세요[작업 재시도](monitoring-runs.md#run-status-task-retries).

### 를 사용하여 작업 재시도 `maxRetries`
<a name="workflow-nexflow-task-retry"></a>

기본적으로 HealthOmics는 실패한 작업의 재시도를 시도하지 않거나를 구성한 경우 한 번의 재시도를 시도합니다`errorStrategy`. 최대 재시도 횟수를 늘리려면를 `retry` `errorStrategy`로 설정하고 `maxRetries` 명령을 사용하여 최대 재시도 횟수를 구성합니다.

다음 예제에서는 글로벌 구성에서 최대 재시도 횟수를 3으로 설정합니다.

```
process {
    errorStrategy = 'retry'
    maxRetries = 3
}
```

다음 예제에서는 워크플로 정의`maxRetries`의 작업 섹션에서를 설정하는 방법을 보여줍니다.

```
process myTask {
    label 'my_label'
    errorStrategy 'retry'
    maxRetries 3
    
    script:
    """
    your-command-here
    """
}
```

다음 예제에서는 이름 또는 레이블 선택기를 기반으로 Nextflow 구성 파일에서 작업별 구성을 지정하는 방법을 보여줍니다.

```
process {
    withLabel: 'my_label' {
        errorStrategy = 'retry'
        maxRetries = 3
    }

    withName: 'myTask' {
        errorStrategy = 'retry'
        maxRetries = 3
    }
}
```

### 를 사용하여 작업 재시도 옵트아웃 `omicsRetryOn5xx`
<a name="workflow-nextflow-retry-5xx"></a>

Nextflow v23 및 v24의 경우 HealthOmics는 서비스 오류(5XX HTTP 상태 코드)로 인해 작업이 실패한 경우 작업 재시도를 지원합니다. 기본적으로 HealthOmics는 실패한 작업을 최대 2회 재시도합니다.

서비스 오류에 대한 작업 재시도를 옵트아웃`omicsRetryOn5xx`하도록를 구성할 수 있습니다. HealthOmics의 작업 재시도에 대한 자세한 내용은 섹션을 참조하세요[작업 재시도](monitoring-runs.md#run-status-task-retries).

다음 예제에서는 작업 재시도를 옵트아웃하도록 전역 구성`omicsRetryOn5xx`에서를 구성합니다.

```
process {
    omicsRetryOn5xx = false
}
```

다음 예제에서는 워크플로 정의`omicsRetryOn5xx`의 작업 섹션에서를 구성하는 방법을 보여줍니다.

```
process myTask {
    label 'my_label'
    omicsRetryOn5xx = false
    
    script:
    """
    your-command-here
    """
}
```

다음 예제에서는 이름 또는 레이블 선택기를 기반으로 Nextflow 구성 파일에서 작업별 구성`omicsRetryOn5xx`으로를 설정하는 방법을 보여줍니다.

```
process {
    withLabel: 'my_label' {
        omicsRetryOn5xx = false
    }

    withName: 'myTask' {
        omicsRetryOn5xx = false
    }
}
```

### `time` 지시문을 사용한 작업 기간
<a name="time-directive-nextflow"></a>

HealthOmics는 조정 가능한 할당량( 참조[HealthOmics 서비스 할당량](service-quotas.md))을 제공하여 실행의 최대 기간을 지정합니다. Nextflow v23 및 v24 워크플로의 경우 Nextflow `time` 명령을 사용하여 최대 작업 기간을 지정할 수도 있습니다.

새 워크플로 개발 중에 최대 작업 기간을 설정하면 런어웨이 작업과 장기 실행 작업을 포착하는 데 도움이 됩니다.

Nextflow 시간 명령에 대한 자세한 내용은 Nextflow 참조의 [시간 명령을](https://www.nextflow.io/docs/latest/reference/process.html#process-time) 참조하세요.

HealthOmics는 Nextflow 시간 명령에 대해 다음과 같은 지원을 제공합니다.

1. HealthOmics는 시간 명령에 대해 1분 단위를 지원합니다. 60초에서 최대 실행 기간 값 사이의 값을 지정할 수 있습니다.

1. 60 미만의 값을 입력하면 HealthOmics는 값을 60초로 반올림합니다. 60보다 큰 값의 경우 HealthOmics는 가장 가까운 분으로 내림합니다.

1. 워크플로가 작업에 대한 재시도를 지원하는 경우 HealthOmics는 시간 초과 시 작업을 재시도합니다.

1. 작업이 시간 초과(또는 마지막 재시도 시간이 초과)되면 HealthOmics는 작업을 취소합니다. 이 작업의 지속 시간은 1\$12분입니다.

1. 작업 시간 초과 시 HealthOmics는 실행 및 작업 상태를 실패로 설정하고 실행 중인 다른 작업(시작 중, 보류 중 또는 실행 중 상태의 작업)을 취소합니다. HealthOmics는 제한 시간 이전에 완료한 작업의 출력을 지정된 S3 출력 위치로 내보냅니다.

1. 작업이 보류 중 상태로 소비하는 시간은 작업 기간에 포함되지 않습니다.

1. 실행이 실행 그룹의 일부이고 실행 그룹이 작업 타이머보다 빨리 시간 초과되면 실행 및 작업이 실패 상태로 전환됩니다.

`ms`, , 또는 단위 중 하나 이상을 사용하여 제한 시간을 지정합니다`s``m``h``d`.

다음 예제에서는 Nextflow 구성 파일에서 전역 구성을 지정하는 방법을 보여줍니다. 전역 제한 시간을 1시간 30분으로 설정합니다.

```
process {
    time = '1h30m'
}
```

다음 예제에서는 워크플로 정의의 작업 섹션에서 시간 지시문을 지정하는 방법을 보여줍니다. 이 예제에서는 제한 시간을 3일, 5시간 및 4분으로 설정합니다. 이 값은 구성 파일의 전역 값보다 우선하지만 구성 `my_label` 파일의에 대한 작업별 시간 명령보다 우선하지는 않습니다.

```
process myTask {
    label 'my_label'
    time '3d5h4m'
        
    script:
    """
    your-command-here
    """
}
```

다음 예제에서는 이름 또는 레이블 선택기를 기반으로 Nextflow 구성 파일에서 작업별 시간 지시문을 지정하는 방법을 보여줍니다. 이 예제에서는 글로벌 작업 제한 시간 값을 30분으로 설정합니다. 작업의 경우 값을 2시간`myTask`으로 설정하고 레이블이 인 작업의 경우 값을 3시간으로 설정합니다`my_label`. 선택기와 일치하는 작업의 경우 이러한 값이 워크플로 정의의 전역 값 및 값보다 우선합니다.

```
process {
    time = '30m'
    
    withLabel: 'my_label' {
        time = '3h'  
    }

    withName: 'myTask' {
        time = '2h'  
    }
}
```

## 작업 콘텐츠 내보내기
<a name="exporting-task-content-nextflow"></a>

Nextflow에 작성된 워크플로의 경우 **publishDir** 명령을 정의하여 작업 콘텐츠를 출력 Amazon S3 버킷으로 내보냅니다. 다음 예제와 같이 **publishDir** 값을 로 설정합니다`/mnt/workflow/pubdir`. Amazon S3로 파일을 내보내려면 파일이이 디렉터리에 있어야 합니다.

```
 nextflow.enable.dsl=2
              
  workflow {
    CramToBamTask(params.ref_fasta, params.ref_fasta_index, params.ref_dict, params.input_cram, params.sample_name)
    ValidateSamFile(CramToBamTask.out.outputBam)
  }
  
  process CramToBamTask {
    container "<account>.dkr.ecr.us-west-2.amazonaws.com/genomes-in-the-cloud"
  
    publishDir "/mnt/workflow/pubdir"
  
    input:
        path ref_fasta
        path ref_fasta_index
        path ref_dict
        path input_cram
        val sample_name
  
    output:
        path "${sample_name}.bam", emit: outputBam
        path "${sample_name}.bai", emit: outputBai
  
    script:
    """
        set -eo pipefail
  
        samtools view -h -T $ref_fasta $input_cram |
        samtools view -b -o ${sample_name}.bam -
        samtools index -b ${sample_name}.bam
        mv ${sample_name}.bam.bai ${sample_name}.bai
    """
  }
  
  process ValidateSamFile {
    container "<account>.dkr.ecr.us-west-2.amazonaws.com/genomes-in-the-cloud"
  
    publishDir "/mnt/workflow/pubdir"
  
    input:
        file input_bam
  
    output:
        path "validation_report"
  
    script:
    """
        java -Xmx3G -jar /usr/gitc/picard.jar \
        ValidateSamFile \
        INPUT=${input_bam} \
        OUTPUT=validation_report \
        MODE=SUMMARY \
        IS_BISULFITE_SEQUENCED=false
    """
  }
```

# CWL 워크플로 정의 세부 정보
<a name="workflow-languages-cwl"></a>

공통 워크플로 언어 또는 CWL로 작성된 워크플로는 WDL 및 Nextflow로 작성된 워크플로와 유사한 기능을 제공합니다. Amazon S3 또는 HealthOmics 스토리지 URIs 입력 파라미터로 사용할 수 있습니다.

하위 워크플로의 secondaryFile에서 입력을 정의하는 경우 기본 워크플로에 동일한 정의를 추가합니다.

HealthOmics 워크플로는 작업 프로세스를 지원하지 않습니다. CWL 워크플로의 운영 프로세스에 대한 자세한 내용은 [CWL 설명서를](https://www.commonwl.org/user_guide/topics/operations.html) 참조하세요.

사용하는 각 컨테이너에 대해 별도의 CWL 워크플로를 정의하는 것이 좋습니다. 고정 Amazon ECR URI로 dockerPull 항목을 하드코딩하지 않는 것이 좋습니다.

**Topics**
+ [HealthOmics를 사용하도록 CWL 워크플로 변환](#workflow-cwl-convert)
+ [를 사용하여 작업 재시도 옵트아웃 `omicsRetryOn5xx`](#workflow-cwl-retry-5xx)
+ [워크플로 단계 반복](#workflow-cwl-loop)
+ [메모리가 증가한 상태에서 작업 재시도](#workflow-cwl-out-of-memory-retry)
+ [예제](#workflow-cwl-examples)

## HealthOmics를 사용하도록 CWL 워크플로 변환
<a name="workflow-cwl-convert"></a>

HealthOmics를 사용하도록 기존 CWL 워크플로 정의를 변환하려면 다음을 변경합니다.
+ 모든 Docker 컨테이너 URIs Amazon ECR URIs.
+ 모든 워크플로 파일이 기본 워크플로에서 입력으로 선언되고 모든 변수가 명시적으로 정의되었는지 확인합니다.
+ 모든 JavaScript 코드가 엄격한 모드 수신 거부인지 확인합니다.

## 를 사용하여 작업 재시도 옵트아웃 `omicsRetryOn5xx`
<a name="workflow-cwl-retry-5xx"></a>

HealthOmics는 서비스 오류(5XX HTTP 상태 코드)로 인해 작업이 실패한 경우 작업 재시도를 지원합니다. 기본적으로 HealthOmics는 실패한 작업을 최대 2회 재시도합니다. HealthOmics의 작업 재시도에 대한 자세한 내용은 섹션을 참조하세요[작업 재시도](monitoring-runs.md#run-status-task-retries).

서비스 오류에 대한 작업 재시도를 옵트아웃하려면 워크플로 정의에서 `omicsRetryOn5xx` 명령을 구성합니다. 요구 사항 또는 힌트에 따라이 지시문을 정의할 수 있습니다. 이식성을 위한 힌트로 지시문을 추가하는 것이 좋습니다.

```
requirements:
  ResourceRequirement:
    omicsRetryOn5xx: false

hints:
  ResourceRequirement:
    omicsRetryOn5xx: false
```

요구 사항은 힌트를 재정의합니다. 태스크 구현이 인클로징 워크플로의 요구 사항에서 제공하는 힌트에 리소스 요구 사항을 제공하는 경우 인클로징 요구 사항이 우선합니다.

워크플로의 다른 수준에서 동일한 작업 요구 사항이 나타나는 경우 HealthOmics는의 가장 구체적인 항목`requirements`(또는에 항목이 없는 `hints`경우 )을 사용합니다`requirements`. 다음 목록은 HealthOmics가 구성 설정을 적용하는 데 사용하는 우선 순위의 순서를 가장 낮은 우선 순위부터 가장 높은 우선 순위까지 보여줍니다.
+ 워크플로 수준
+ 단계 수준
+ 워크플로 정의의 작업 섹션

다음 예제에서는 워크플로의 다양한 수준에서 `omicsRetryOn5xx` 명령을 구성하는 방법을 보여줍니다. 이 예제에서는 워크플로 수준 요구 사항이 워크플로 수준 힌트를 재정의합니다. 작업 및 단계 수준의 요구 사항 구성은 힌트 구성을 재정의합니다.

```
class: Workflow
# Workflow-level requirement and hint
requirements:
  ResourceRequirement:
    omicsRetryOn5xx: false

hints:
  ResourceRequirement:
    omicsRetryOn5xx: false  # The value in requirements overrides this value 

steps:
  task_step:
    # Step-level requirement
    requirements:
      ResourceRequirement:
        omicsRetryOn5xx: false
    # Step-level hint
    hints:
      ResourceRequirement:
        omicsRetryOn5xx: false
    run:
      class: CommandLineTool
      # Task-level requirement
      requirements:
        ResourceRequirement:
          omicsRetryOn5xx: false
      # Task-level hint
      hints:
        ResourceRequirement:
          omicsRetryOn5xx: false
```

## 워크플로 단계 반복
<a name="workflow-cwl-loop"></a>

HealthOmics는 워크플로 단계 반복을 지원합니다. 루프를 사용하여 지정된 조건이 충족될 때까지 워크플로 단계를 반복적으로 실행할 수 있습니다. 이는 작업을 여러 번 반복해야 하거나 특정 결과가 달성될 때까지 반복 프로세스에 유용합니다.

**참고:** 루프 기능을 사용하려면 CWL 버전 1.2 이상이 필요합니다. 1.2 이전의 CWL 버전을 사용하는 워크플로는 루프 작업을 지원하지 않습니다.

CWL 워크플로에서 루프를 사용하려면 루프 요구 사항을 정의합니다. 다음 예제에서는 루프 요구 사항 구성을 보여줍니다.

```
requirements:
  - class: "http://commonwl.org/cwltool#Loop"
    loopWhen: $(inputs.counter < inputs.max)
    loop:
      counter:
        loopSource: result
        valueFrom: $(self)
    outputMethod: last
```

`loopWhen` 필드는 루프가 종료되는 시기를 제어합니다. 이 예제에서는 카운터가 최대값보다 작은 한 루프가 계속됩니다. `loop` 필드는 반복 간에 입력 파라미터를 업데이트하는 방법을 정의합니다. 는 이전 반복에서 다음 반복으로 피드되는 출력을 `loopSource` 지정합니다. 로 설정된 `outputMethod` 필드는 최종 반복의 출력만 `last` 반환합니다.

## 메모리가 증가한 상태에서 작업 재시도
<a name="workflow-cwl-out-of-memory-retry"></a>

HealthOmics는 out-of-memory 작업 실패의 자동 재시도를 지원합니다. 태스크가 코드 137(out-of-memory)로 종료되면 HealthOmics는 지정된 승수를 기반으로 메모리 할당을 늘려 새 태스크를 생성합니다.

**참고**  
HealthOmics는 out-of-memory 실패를 최대 3회 또는 메모리 할당이 1536GiB에 도달할 때까지 중 먼저 도달하는 쪽까지 재시도합니다.

다음 예제에서는 out-of-memory 재시도를 구성하는 방법을 보여줍니다.

```
hints:
  ResourceRequirement:
    ramMin: 4096
  http://arvados.org/cwl#OutOfMemoryRetry:
    memoryRetryMultiplier: 2.5
```

out-of-memory으로 인해 작업이 실패하면 HealthOmics는 공식을 사용하여 재시도 메모리 할당을 계산합니다`previous_run_memory × memoryRetryMultiplier`. 위 예제에서 메모리가 4,096MB인 작업이 실패하면 재시도는 4,096 × 2.5 = 10,240MB의 메모리를 사용합니다.

`memoryRetryMultiplier` 파라미터는 재시도에 할당할 추가 메모리의 양을 제어합니다.
+ **기본값:** 값을 지정하지 않으면 기본값은 입니다`2`(메모리의 두 배).
+ **유효한 범위:** 보다 큰 양수여야 합니다`1`. 값이 잘못되면 4XX 검증 오류가 발생합니다.
+ **최소 유효 값:** 의미 있는 메모리 증가를 보장하고 과도한 재시도를 방지하기 `1.5` 위해 `1`와 사이의 값이 로 `1.5` 자동 증가합니다.

## 예제
<a name="workflow-cwl-examples"></a>

다음은 CWL로 작성된 워크플로의 예입니다.

```
cwlVersion: v1.2
class: Workflow

inputs:
in_file:
type: File
secondaryFiles: [.fai]

out_filename: string
docker_image: string


outputs:
copied_file:
type: File
outputSource: copy_step/copied_file

steps:
copy_step:
in:
  in_file: in_file
  out_filename: out_filename
  docker_image: docker_image
out: [copied_file]
run: copy.cwl
```

다음 파일은 `copy.cwl` 작업을 정의합니다.

```
cwlVersion: v1.2
class: CommandLineTool
baseCommand: cp

inputs:
in_file:
type: File
secondaryFiles: [.fai]
inputBinding:
  position: 1

out_filename:
type: string
inputBinding:
  position: 2
docker_image:
type: string

outputs:
copied_file:
type: File
outputBinding:
    glob: $(inputs.out_filename)

requirements:
InlineJavascriptRequirement: {}
DockerRequirement:
dockerPull: "$(inputs.docker_image)"
```

다음은 GPU 요구 사항이 있는 CWL로 작성된 워크플로의 예입니다.

```
cwlVersion: v1.2
class: CommandLineTool
baseCommand: ["/bin/bash", "docm_haplotypeCaller.sh"]
$namespaces:
cwltool: http://commonwl.org/cwltool#
requirements:
cwltool:CUDARequirement:
cudaDeviceCountMin: 1
cudaComputeCapability: "nvidia-tesla-t4" 
cudaVersionMin: "1.0"
InlineJavascriptRequirement: {}
InitialWorkDirRequirement:
listing:
- entryname: 'docm_haplotypeCaller.sh'
  entry: |
          nvidia-smi --query-gpu=gpu_name,gpu_bus_id,vbios_version --format=csv   

inputs: []
outputs: []
```

# 워크플로 정의 예
<a name="workflow-definition-examples"></a>

다음 예제에서는 WDL, Nextflow 및 CWL에서 동일한 워크플로 정의를 보여줍니다.

------
#### [ WDL ]

```
version 1.1

task my_task {
   runtime { ... }
   inputs {
       File input_file
       String name
       Int threshold
   }
   
   command <<<
   my_tool --name ~{name} --threshold ~{threshold} ~{input_file}
   >>>
   
   output {
       File results = "results.txt"
   }
}

workflow my_workflow {
   inputs {
       File input_file
       String name
       Int threshold = 50
   }
   
   call my_task {
       input:
          input_file = input_file,
          name = name,
          threshold = threshold
   }
   outputs {
       File results = my_task.results
   }
}
```

------
#### [ Nextflow ]

```
nextflow.enable.dsl = 2

params.input_file = null
params.name = null
params.threshold = 50

process my_task {
   // <directives>
   
   input:
     path input_file
     val name
     val threshold
   
   output:
     path 'results.txt', emit: results
   
   script:
     """
     my_tool --name ${name} --threshold ${threshold} ${input_file}
     """
     
   
}

workflow MY_WORKFLOW {
   my_task(
       params.input_file,
       params.name,
       params.threshold
   )
}

workflow {
   MY_WORKFLOW()
}
```

------
#### [ CWL ]

```
cwlVersion: v1.2
class: Workflow

requirements:
    InlineJavascriptRequirement: {}

inputs:
   input_file: File
   name: string
   threshold: int

outputs:
    result:
        type: ...
        outputSource: ...

steps:
    my_task:
        run:
            class: CommandLineTool
            baseCommand: my_tool
            requirements:
                ...
            inputs:
                name:
                    type: string
                    inputBinding:
                        prefix: "--name"
                threshold:
                    type: int
                    inputBinding:
                        prefix: "--threshold"
                input_file:
                    type: File
                    inputBinding: {}
            outputs:
                results:
                    type: File
                    outputBinding:
                        glob: results.txt
```

------

# HealthOmics 워크플로용 파라미터 템플릿 파일
<a name="parameter-templates"></a>

파라미터 템플릿은 워크플로의 입력 파라미터를 정의합니다. 입력 파라미터를 정의하여 워크플로를 보다 유연하고 다양하게 만들 수 있습니다. 예를 들어 참조 유전체 파일의 Amazon S3 위치에 대한 파라미터를 정의할 수 있습니다. 파라미터 템플릿은 Git 기반 리포지토리 서비스 또는 로컬 드라이브를 통해 제공할 수 있습니다. 그런 다음 사용자는 다양한 데이터 세트를 사용하여 워크플로를 실행할 수 있습니다.

워크플로에 대한 파라미터 템플릿을 생성하거나 HealthOmics에서 파라미터 템플릿을 생성할 수 있습니다.

파라미터 템플릿은 JSON 파일입니다. 파일에서 각 입력 파라미터는 워크플로 입력의 이름과 일치해야 하는 명명된 객체입니다. 실행을 시작할 때 필요한 모든 파라미터에 값을 제공하지 않으면 실행이 실패합니다.

입력 파라미터 객체에는 다음 속성이 포함됩니다.
+ **description** -이 필수 속성은 콘솔이 **실행 시작** 페이지에 표시하는 문자열입니다. 이 설명은 실행 메타데이터로도 유지됩니다.
+ **optional** -이 선택적 속성은 입력 파라미터가 선택 사항인지 여부를 나타냅니다. **optional** 필드를 지정하지 않으면 입력 파라미터가 필요합니다.

다음 예제 파라미터 템플릿은 입력 파라미터를 지정하는 방법을 보여줍니다.

```
{
  "myRequiredParameter1": {
     "description": "this parameter is required",
  },
  "myRequiredParameter2": {
     "description": "this parameter is also required",
     "optional": false
  },
  "myOptionalParameter": {
     "description": "this parameter is optional",
     "optional": true
  }
}
```

## 파라미터 템플릿 생성
<a name="parameter-parsing"></a>

HealthOmics는 워크플로 정의를 구문 분석하여 입력 파라미터를 감지하여 파라미터 템플릿을 생성합니다. 워크플로에 파라미터 템플릿 파일을 제공하는 경우 파일의 파라미터가 워크플로 정의에서 감지된 파라미터를 재정의합니다.

다음 섹션에 설명된 대로 CWL, WDL 및 Nextflow 엔진의 구문 분석 로직에는 약간의 차이가 있습니다.

**Topics**
+ [CWL에 대한 파라미터 감지](#parameter-parsing-cwl)
+ [WDL에 대한 파라미터 감지](#parameter-parsing-wdl)
+ [Nextflow에 대한 파라미터 감지](#parameter-parsing-nextflow)

### CWL에 대한 파라미터 감지
<a name="parameter-parsing-cwl"></a>

CWL 워크플로 엔진에서 구문 분석 로직은 다음과 같이 가정합니다.
+ null이 가능한 지원되는 모든 유형은 선택적 입력 파라미터로 표시됩니다.
+ null이 아닌 지원 유형은 필수 입력 파라미터로 표시됩니다.
+ 기본값이 있는 모든 파라미터는 선택적 입력 파라미터로 표시됩니다.
+ 설명은 `main` 워크플로 정의의 `label` 섹션에서 추출됩니다. `label`를 지정하지 않으면 설명이 비어 있습니다(빈 문자열).

다음 표에는 CWL 보간 예제가 나와 있습니다. 각 예제의 파라미터 이름은 입니다`x`. 파라미터가 필요한 경우 파라미터 값을 제공해야 합니다. 파라미터가 선택 사항인 경우 값을 제공할 필요가 없습니다.

이 표에는 기본 유형에 대한 CWL 보간 예제가 나와 있습니다.


| 입력 | 입력/출력 예제 | 필수 | 
| --- | --- | --- | 
|  <pre>x:               <br />  type: int</pre>  | 1 또는 2 또는 ... | 예 | 
|  <pre>x:               <br />  type: int<br />  default: 2</pre>  | 기본값은 2입니다. 유효한 입력은 1 또는 2 또는 ...입니다. | 아니요 | 
|  <pre>x:               <br />  type: int?</pre>  | 유효한 입력은 없음, 1 또는 2 또는 ...입니다. | 아니요 | 
|  <pre>x:               <br />  type: int?<br />  default: 2</pre>  | 기본값은 2입니다. 유효한 입력은 없음, 1 또는 2 또는 ...입니다. | 아니요 | 

다음 표에는 복잡한 유형에 대한 CWL 보간 예제가 나와 있습니다. 복합 유형은 기본 유형의 모음입니다.


| 입력 | 입력/출력 예제 | 필수 | 
| --- | --- | --- | 
|  <pre>x:               <br />  type: array<br />  items: int</pre>  | [] 또는 [1,2,3]  | 예 | 
|  <pre>x:               <br />  type: array?<br />  items: int</pre>  | 없음 또는 [] 또는 [1,2,3]  | 아니요 | 
|  <pre>x:               <br />  type: array<br />  items: int?</pre>  |  [] 또는 [없음, 3, 없음]  | 예 | 
|  <pre>x:               <br />  type: array?<br />  items: int?</pre>  |  [없음] 또는 없음 또는 [1,2,3] 또는 [없음, 3]이지만 []는 아님  | 아니요 | 

### WDL에 대한 파라미터 감지
<a name="parameter-parsing-wdl"></a>

WDL 워크플로 엔진에서 구문 분석 로직은 다음과 같은 가정을 합니다.
+ null이 가능한 지원되는 모든 유형은 선택적 입력 파라미터로 표시됩니다.
+ Null링할 수 없는 지원되는 유형의 경우:
  + 리터럴 또는 표현식이 할당된 모든 입력 변수는 선택적 파라미터로 표시됩니다. 예:

    ```
     Int x = 2 
    Float f0 = 1.0 + f1
    ```
  + 입력 파라미터에 값 또는 표현식이 할당되지 않은 경우 필수 파라미터로 표시됩니다.
+ 설명은 `main` 워크플로 정의의 `parameter_meta`에서 추출됩니다. `parameter_meta`를 지정하지 않으면 설명이 비어 있습니다(빈 문자열). 자세한 내용은 [파라미터 메타데이터](https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#metadata-sections)에 대한 WDL 사양을 참조하세요.

다음 표에는 WDL 보간 예제가 나와 있습니다. 각 예제의 파라미터 이름은 입니다`x`. 파라미터가 필요한 경우 파라미터 값을 제공해야 합니다. 파라미터가 선택 사항인 경우 값을 제공할 필요가 없습니다.

이 표에는 기본 유형에 대한 WDL 보간 예제가 나와 있습니다.


| 입력 | 입력/출력 예제 | 필수 | 
| --- | --- | --- | 
| 정수 x | 1 또는 2 또는 ... | 예 | 
| 정수 x = 2 | 2 | 아니요 | 
| 정수 x = 1\$12 | 3 | 아니요 | 
| 정수 x = y\$1z | y\$1z | 아니요 | 
| 정수? x | 없음 또는 1 또는 2 또는 ... | 예 | 
| 정수? x = 2 | 없음 또는 2 | 아니요 | 
| 정수? x = 1\$12 | 없음 또는 3 | 아니요 | 
| 정수? x = y\$1z | 없음 또는 y\$1z | 아니요 | 

다음 표에는 복잡한 유형에 대한 WDL 보간 예제가 나와 있습니다. 복합 유형은 기본 유형의 모음입니다.


| 입력 | 입력/출력 예제 | 필수 | 
| --- | --- | --- | 
| 배열[Int] x | [1,2,3] 또는 [] | 예 | 
| 배열[Int]\$1 x | [1]이지만 []는 아님 | 예 | 
| 배열[Int]? x | 없음 또는 [] 또는 [1,2,3] | 아니요 | 
| 배열[Int?] x | [] 또는 [없음, 3, 없음] | 예 | 
| 배열[Int?]=? x | [없음] 또는 없음 또는 [1,2,3] 또는 [없음, 3]이지만 []는 아님 | 아니요 | 
| 구조 샘플 \$1문자열 a, 정수 y\$1 입력의 뒷부분: 샘플 mySample  |  <pre>String a = mySample.a<br />   Int y = mySample.y</pre>  | 예 | 
| 구조 샘플 \$1문자열 a, 정수 y\$1 입력의 후반부: 샘플? mySample |  <pre>if (defined(mySample)) { <br />     String a = mySample.a<br />     Int y = mySample.y<br />   } </pre>  | 아니요 | 

### Nextflow에 대한 파라미터 감지
<a name="parameter-parsing-nextflow"></a>

Nextflow의 경우 HealthOmics는 `nextflow_schema.json` 파일을 구문 분석하여 파라미터 템플릿을 생성합니다. 워크플로 정의에 스키마 파일이 포함되지 않은 경우 HealthOmics는 기본 워크플로 정의 파일을 구문 분석합니다.

**Topics**
+ [스키마 파일 구문 분석](#parameter-parsing-nextflow-schema)
+ [기본 파일 구문 분석](#parameter-parsing-nextflow-main)
+ [중첩 파라미터](#parameter-parsing-nextflow-nested)
+ [Nextflow 보간의 예](#parameter-parsing-nextflow-examples)

#### 스키마 파일 구문 분석
<a name="parameter-parsing-nextflow-schema"></a>

구문 분석이 올바르게 작동하려면 스키마 파일이 다음 요구 사항을 충족하는지 확인합니다.
+ 스키마 파일의 이름은 이며 기본 워크플로 파일`nextflow_schema.json`과 동일한 디렉터리에 있습니다.
+ 스키마 파일은 다음 스키마 중 하나에 정의된 유효한 JSON입니다.
  + [json-schema.org/draft/2020-12/schema](https://json-schema.org/draft/2020-12/schema).
  + [json-schema.org/draft-07/schema](https://json-schema.org/draft-07/schema).

HealthOmics는 `nextflow_schema.json` 파일을 구문 분석하여 파라미터 템플릿을 생성합니다.
+ 스키마에 **properties** 정의된 모든를 추출합니다.
+ 속성에 사용할 수 있는 **description** 경우 속성을 포함합니다.
+ 속성의 **required** 필드를 기반으로 각 파라미터가 선택 사항인지 필수인지 식별합니다.

다음 예제에서는 정의 파일과 생성된 파라미터 파일을 보여줍니다.

```
{
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "$defs": {
        "input_options": {
            "title": "Input options",
            "type": "object",
            "required": ["input_file"],
            "properties": {
                "input_file": {
                    "type": "string",
                    "format": "file-path",
                    "pattern": "^s3://[a-z0-9.-]{3,63}(?:/\\S*)?$",
                    "description": "description for input_file"
                },
                "input_num": {
                    "type": "integer",
                    "default": 42,
                    "description": "description for input_num"
                }
            }
        },
        "output_options": {
            "title": "Output options",
            "type": "object",
            "required": ["output_dir"],
            "properties": {
                "output_dir": {
                    "type": "string",
                    "format": "file-path",
                    "description": "description for output_dir",
                }
            }
        }
    },
    "properties": {
        "ungrouped_input_bool": {
            "type": "boolean",
            "default": true
        }
    },
    "required": ["ungrouped_input_bool"],
    "allOf": [
        { "$ref": "#/$defs/input_options" },
        { "$ref": "#/$defs/output_options" }
    ]
}
```

생성된 파라미터 템플릿:

```
{
    "input_file": {
        "description": "description for input_file",
        "optional": False
    },
    "input_num": {
        "description": "description for input_num",
        "optional": True
    },
    "output_dir": {
        "description": "description for output_dir",
        "optional": False
    },
    "ungrouped_input_bool": {
        "description": None,
        "optional": False
    }
}
```

#### 기본 파일 구문 분석
<a name="parameter-parsing-nextflow-main"></a>

워크플로 정의에 `nextflow_schema.json` 파일이 포함되지 않은 경우 HealthOmics는 기본 워크플로 정의 파일을 구문 분석합니다.

HealthOmics는 기본 워크플로 정의 파일 및 `nextflow.config` 파일에 있는 `params` 표현식을 분석합니다. 기본값이 `params` 있는 모든는 선택 사항으로 표시됩니다.

구문 분석이 올바르게 작동하려면 다음 요구 사항에 유의하세요.
+ HealthOmics는 기본 워크플로 정의 파일만 구문 분석합니다. 모든 파라미터를 캡처하려면 모든 하위 모듈과 가져온 워크플로에 **params** 모든 파라미터를 연결하는 것이 좋습니다.
+ 구성 파일은 선택 사항입니다. 정의한 경우 이름을 지정`nextflow.config`하고 기본 워크플로 정의 파일과 동일한 디렉터리에 배치합니다.

다음 예제에서는 정의 파일과 생성된 파라미터 템플릿을 보여줍니다.

```
params.input_file = "default.txt"
params.threads = 4
params.memory = "8GB"

workflow {
    if (params.version) {
        println "Using version: ${params.version}"
    }
}
```

생성된 파라미터 템플릿:

```
{
    "input_file": {
        "description": None,
        "optional": True
    },
    "threads": {
        "description": None,
        "optional": True
    },
    "memory": {
        "description": None,
        "optional": True
    },
    "version": {
        "description": None,
        "optional": False
    }
}
```

nextflow.config에 정의된 기본값의 경우 HealthOmics는 다음 예제`params {}`와 같이 내에 선언된 `params` 할당 및 파라미터를 수집합니다. 할당 문에서는 문 왼쪽에 나타나`params`야 합니다.

```
params.alpha = "alpha"
params.beta = "beta"

params {
    gamma = "gamma"
    delta = "delta"
}

env {
   // ignored, as this assignment isn't in the params block
   VERSION = "TEST"  
}

// ignored, as params is not on the left side
interpolated_image = "${params.cli_image}"
```

생성된 파라미터 템플릿:

```
{
    // other params in your main workflow defintion
    "alpha": {
        "description": None,
        "optional": True
    },
    "beta": {
        "description": None,
        "optional": True
    },
    "gamma": {
        "description": None,
        "optional": True
    },
    "delta": {
        "description": None,
        "optional": True
    }
}
```

#### 중첩 파라미터
<a name="parameter-parsing-nextflow-nested"></a>

`nextflow_schema.json` 및 모두 중첩된 파라미터를 `nextflow.config` 허용합니다. 그러나 HealthOmics 파라미터 템플릿에는 최상위 파라미터만 필요합니다. 워크플로에서 중첩 파라미터를 사용하는 경우 JSON 객체를 해당 파라미터의 입력으로 제공해야 합니다.

##### 스키마 파일의 중첩 파라미터
<a name="parameter-parsing-schema-nested"></a>

HealthOmics는 `nextflow_schema.json` 파일을 구문 분석할 **params** 때 중첩된를 건너뜁니다. 예를 들어 다음 `nextflow_schema.json` 파일을 정의하는 경우:

```
{
    "properties": {
        "input": {
            "properties": {
                "input_file": { ... },
                "input_num": { ... }
            }
        },
        "input_bool": { ... }
    }
}
```

HealthOmics는 파라미터 템플릿을 생성할 `input_num` 때 `input_file` 및를 무시합니다.

```
{
    "input": {
        "description": None,
        "optional": True
    },
    "input_bool": {
        "description": None,
        "optional": True
    }
}
```

이 워크플로를 실행하면 HealthOmics는 다음과 유사한 `input.json` 파일을 예상합니다.

```
{
   "input": {
       "input_file": "s3://bucket/obj",
       "input_num": 2
   },
   "input_bool": false
}
```

##### 구성 파일의 중첩 파라미터
<a name="parameter-parsing-config-nested"></a>

HealthOmics는 `nextflow.config` 파일에 중첩된 **params**를 수집하지 않으며 구문 분석 중에 이를 건너뜁니다. 예를 들어 다음 `nextflow.config` 파일을 정의하는 경우:

```
params.alpha = "alpha"
  params.nested.beta = "beta"
  
  params {
      gamma = "gamma"
      group {
          delta = "delta"
      }
  }
```

HealthOmics는 파라미터 템플릿을 생성할 `params.group.delta` 때 `params.nested.beta` 및를 무시합니다.

```
{
    "alpha": {
        "description": None,
        "optional": True
    },
    "gamma": {
        "description": None,
        "optional": True
    }
}
```

#### Nextflow 보간의 예
<a name="parameter-parsing-nextflow-examples"></a>

다음 표에는 기본 파일의 파라미터에 대한 Nextflow 보간 예제가 나와 있습니다.


| 파라미터 | 필수 | 
| --- | --- | 
| params.input\$1file | 예 | 
| params.input\$1file = "s3://bucket/data.json" | 아니요 | 
| params.nested.input\$1file | N/A | 
| params.nested.input\$1file = "s3://bucket/data.json" | N/A | 

다음 표에는 `nextflow.config` 파일의 파라미터에 대한 Nextflow 보간 예제가 나와 있습니다.


| 파라미터 | 필수 | 
| --- | --- | 
|  <pre>params.input_file = "s3://bucket/data.json"</pre>  | 아니요 | 
|  <pre>params {<br />   input_file = "s3://bucket/data.json"<br />}</pre>  | 아니요 | 
|  <pre>params {<br />   nested {<br />     input_file = "s3://bucket/data.json"    <br />   }<br />}</pre>  | N/A | 
|  <pre>input_file = params.input_file</pre>  | N/A | 

# 프라이빗 워크플로용 컨테이너 이미지
<a name="workflows-ecr"></a>

HealthOmics는 Amazon ECR 프라이빗 리포지토리에서 호스팅되는 컨테이너 이미지를 지원합니다. 컨테이너 이미지를 생성하여 프라이빗 리포지토리에 업로드할 수 있습니다. Amazon ECR 프라이빗 레지스트리를 풀스루 캐시로 사용하여 업스트림 레지스트리의 콘텐츠를 동기화할 수도 있습니다.

Amazon ECR 리포지토리는 서비스를 호출하는 계정과 동일한 AWS 리전에 있어야 합니다. 소스 이미지 리포지토리가 적절한 권한을 제공하는 한 다른가 컨테이너 이미지를 소유할 AWS 계정 수 있습니다. 자세한 내용은 [교차 계정 Amazon ECR 액세스에 대한 정책](permissions-ecr.md#permissions-cross-account) 단원을 참조하십시오.

실행이 시작되기 전에 액세스를 확인할 수 있도록 Amazon ECR 컨테이너 이미지 URIs를 워크플로의 파라미터로 정의하는 것이 좋습니다. 또한 리전 파라미터를 변경하여 새 리전에서 워크플로를 더 쉽게 실행할 수 있습니다.

**참고**  
HealthOmics는 ARM 컨테이너를 지원하지 않으며 퍼블릭 리포지토리에 대한 액세스를 지원하지 않습니다.

HealthOmics가 Amazon ECR에 액세스하도록 IAM 권한을 구성하는 방법에 대한 자세한 내용은 섹션을 참조하세요[HealthOmics 리소스 권한](permissions-resource.md).

**Topics**
+ [타사 컨테이너 레지스트리와 동기화](#ecr-pull-through)
+ [Amazon ECR 컨테이너 이미지에 대한 일반 고려 사항](#ecr-considerations)
+ [HealthOmics 워크플로의 환경 변수](#ecr-env-vars)
+ [Amazon ECR 컨테이너 이미지에서 Java 사용](#ecr-java-considerations)
+ [Amazon ECR 컨테이너 이미지에 작업 입력 추가](#ecr-tasks)

## 타사 컨테이너 레지스트리와 동기화
<a name="ecr-pull-through"></a>

Amazon ECR 풀스루 캐시 규칙을 사용하여 지원되는 업스트림 레지스트리의 리포지토리를 Amazon ECR 프라이빗 리포지토리와 동기화할 수 있습니다. 자세한 내용은 *Amazon ECR 사용 설명서*의 [업스트림 레지스트리 동기화](https://docs.aws.amazon.com/AmazonECR/latest/userguide/pull-through-cache.html)를 참조하세요.

풀스루 캐시는 캐시를 생성할 때 프라이빗 레지스트리에 이미지 리포지토리를 자동으로 생성하고 업스트림 이미지가 변경될 때 캐시된 이미지와 자동으로 동기화됩니다.

HealthOmics는 다음 업스트림 레지스트리에 대한 풀스루 캐시를 지원합니다.
+ Amazon ECR 퍼블릭
+ Kubernetes 컨테이너 이미지 레지스트리
+ Quay
+ Docker Hub 
+ Microsoft Azure 컨테이너 레지스트리
+ GitHub 컨테이너 레지스트리 
+ GitLab 컨테이너 레지스트리 

HealthOmics는 업스트림 Amazon ECR 프라이빗 리포지토리에 대한 풀스루 캐시를 지원하지 않습니다.

Amazon ECR 풀스루 캐시 사용의 이점은 다음과 같습니다.

1. 컨테이너 이미지를 Amazon ECR로 수동으로 마이그레이션하거나 타사 리포지토리에서 업데이트를 동기화할 필요가 없습니다.

1. 워크플로는 프라이빗 리포지토리의 동기화된 컨테이너 이미지에 액세스하며, 이는 퍼블릭 레지스트리에서 런타임에 콘텐츠를 다운로드하는 것보다 더 안정적입니다.

1. Amazon ECR 풀스루 캐시는 예측 가능한 URI 구조를 사용하기 때문에 HealthOmics 서비스는 Amazon ECR 프라이빗 URI를 업스트림 레지스트리 URI와 자동으로 매핑할 수 있습니다. 워크플로 정의에서 URI 값을 업데이트하고 바꿀 필요는 없습니다.

**Topics**
+ [풀스루 캐시 구성](#ecr-pull-through-configure)
+ [레지스트리 매핑](#ecr-pull-through-registry-mapping)
+ [이미지 매핑](#ecr-pull-through-mapping-format)

### 풀스루 캐시 구성
<a name="ecr-pull-through-configure"></a>

Amazon ECR은 각 리전 AWS 계정 에서에 대한 레지스트리를 제공합니다. 워크플로를 실행하려는 리전과 동일한 리전에서 Amazon ECR 구성을 생성해야 합니다.

다음 섹션에서는 풀스루 캐시의 구성 작업에 대해 설명합니다.

**Topics**
+ [풀스루 캐시 규칙 생성](#create-ecr-ptc)
+ [업스트림 레지스트리에 대한 레지스트리 권한](#reg-ecr-ptc)
+ [리포지토리 생성 템플릿](#repo-create-templates-ptc)
+ [워크플로 생성](#reg-mapping-ecr-ptc)

#### 풀스루 캐시 규칙 생성
<a name="create-ecr-ptc"></a>

캐시하려는 이미지가 있는 각 업스트림 레지스트리에 대해 Amazon ECR 풀스루 캐시 규칙을 생성합니다. 규칙은 업스트림 레지스트리와 Amazon ECR 프라이빗 리포지토리 간의 매핑을 지정합니다.

인증이 필요한 업스트림 레지스트리의 경우 AWS Secrets Manager를 사용하여 자격 증명을 제공합니다.

**참고**  
활성 실행이 프라이빗 리포지토리를 사용하는 동안에는 풀스루 캐시 규칙을 변경하지 마십시오. 실행이 실패하거나 더 심각하게는 예상치 못한 이미지를 사용하는 파이프라인이 발생할 수 있습니다.

자세한 내용은 *Amazon Elastic Container Registry 사용 설명서*의 [풀스루 캐시 규칙 생성을](https://docs.aws.amazon.com/AmazonECR/latest/userguide/pull-through-cache-creating-rule.html) 참조하세요.

##### 콘솔을 사용하여 풀스루 캐시 규칙 생성
<a name="create-ecr-ptc-console"></a>

풀스루 캐시를 구성하려면 Amazon ECR 콘솔을 사용하여 다음 단계를 따릅니다.

1. Amazon ECR 콘솔 열기: https://console.aws.amazon.com/ecr

1. 왼쪽 메뉴의 **프라이빗 레지스트리**에서 **기능 및 설정을** 확장한 다음 **캐시 풀스루**를 선택합니다.

1. **풀스루 캐시** 페이지에서 **규칙 추가**를 선택합니다.

1. **업스트림 레지스트리** 패널에서 프라이빗 레지스트리와 동기화할 업스트림 레지스트리를 선택한 **후 다음을** 선택합니다.

1. 업스트림 레지스트리에 인증이 필요한 경우 보안 인증 정보가 포함된 SageMaker AI 보안 암호를 지정하는 새 페이지가 콘솔에 열립니다. **다음**을 선택합니다.

1. **네임스페이스 지정**의 **캐시 네임**스페이스 패널에서 특정 리포지토리 접두사를 사용하거나 접두사 없이 프라이빗 리포지토리를 생성할지 여부를 선택합니다. 접두사를 사용하도록 선택한 경우 **캐시 리포지토리 접두사에 접두사** 이름을 지정합니다.

1. **업스트림 네임스페이스** 패널에서 특정 리포지토리 접두사를 사용하거나 접두사 없이 업스트림 리포지토리에서 가져올지 여부를 선택합니다. 접두사를 사용하도록 선택한 경우 **Upstream 리포지토리 접두사에 접두사** 이름을 지정합니다.

   **네임스페이스 예제** 패널에는 예제 풀 요청, 업스트림 URL 및 생성된 캐시 리포지토리의 URL이 표시됩니다.

1. **다음**을 선택합니다.

1. 구성을 검토하고 **생성을** 선택하여 규칙을 생성합니다.

자세한 내용은 [ 풀스루 캐시 규칙 생성(AWS 관리 콘솔)을 참조하세요](https://docs.aws.amazon.com/AmazonECR/latest/userguide/pull-through-cache-creating-rule.html#pull-through-cache-creating-rule-console).

##### CLI를 사용하여 풀스루 캐시 규칙 생성
<a name="create-ecr-ptc-cli"></a>

Amazon ECR **create-pull-through-cache-rule** 명령을 사용하여 풀스루 캐시 규칙을 생성합니다. 인증이 필요한 업스트림 레지스트리의 경우 Secrets Manager 보안 암호에 자격 증명을 저장합니다.

다음 섹션에서는 지원되는 각 업스트림 레지스트리의 예를 제공합니다.

##### Amazon ECR 퍼블릭의 경우
<a name="ecr-ptc-cli-public-ecr"></a>

다음 예제에서는 Amazon ECR 퍼블릭 레지스트리에 대한 풀스루 캐시 규칙을 생성합니다. 리포지토리 접두사를 `ecr-public`으로 지정합니다. 이렇게 하면 풀스루 캐시 규칙을 통해 생성한 각 리포지토리가 `ecr-public/upstream-repository-name`의 명명 체계를 사용하게 됩니다.

```
aws ecr create-pull-through-cache-rule \
     --ecr-repository-prefix ecr-public \
     --upstream-registry-url public.ecr.aws \
     --region us-east-1
```

##### Kubernetes Container Registry의 경우
<a name="ecr-ptc-cli-kubernetes"></a>

다음 예제에서는 Kubernetes 퍼블릭 레지스트리에 대한 풀스루 캐시 규칙을 생성합니다. 리포지토리 접두사를 `kubernetes`으로 지정합니다. 이렇게 하면 풀스루 캐시 규칙을 통해 생성한 각 리포지토리가 `kubernetes/upstream-repository-name`의 명명 체계를 사용하게 됩니다.

```
aws ecr create-pull-through-cache-rule \
     --ecr-repository-prefix kubernetes \
     --upstream-registry-url registry.k8s.io \
     --region us-east-1
```

##### Quay의 경우
<a name="ecr-ptc-cli-quay"></a>

다음 예제에서는 Quay 퍼블릭 레지스트리에 대한 풀스루 캐시 규칙을 생성합니다. 리포지토리 접두사를 `quay`로 지정합니다. 이렇게 하면 풀스루 캐시 규칙을 통해 생성한 각 리포지토리가 `quay/upstream-repository-name`의 명명 체계를 사용하게 됩니다.

```
aws ecr create-pull-through-cache-rule \
     --ecr-repository-prefix quay \
     --upstream-registry-url quay.io \
     --region us-east-1
```

##### Docker Hub의 경우
<a name="ecr-ptc-cli-docker-hub"></a>

다음 예제에서는 Docker Hub 레지스트리에 대한 풀스루 캐시 규칙을 생성합니다. 리포지토리 접두사를 `docker-hub`으로 지정합니다. 이렇게 하면 풀스루 캐시 규칙을 통해 생성한 각 리포지토리가 `docker-hub/upstream-repository-name`의 명명 체계를 사용하게 됩니다. Docker Hub 보안 인증 정보가 포함된 보안 암호의 전체 Amazon 리소스 이름(ARN)을 지정해야 합니다.

```
aws ecr create-pull-through-cache-rule \
     --ecr-repository-prefix docker-hub \
     --upstream-registry-url registry-1.docker.io \
     --credential-arn arn:aws:secretsmanager:us-east-1:111122223333:secret:ecr-pullthroughcache/example1234 \
     --region us-east-1
```

##### GitHub Container Registry의 경우
<a name="ecr-ptc-cli-public-github"></a>

다음 예제에서는 GitHub 컨테이너 레지스트리에 대한 풀스루 캐시 규칙을 생성합니다. 리포지토리 접두사를 `github`으로 지정합니다. 이렇게 하면 풀스루 캐시 규칙을 통해 생성한 각 리포지토리가 `github/upstream-repository-name`의 명명 체계를 사용하게 됩니다. GitHub 컨테이너 레지스트리 보안 인증 정보가 포함된 보안 암호의 전체 Amazon 리소스 이름(ARN)을 지정해야 합니다.

```
aws ecr create-pull-through-cache-rule \
     --ecr-repository-prefix github \
     --upstream-registry-url ghcr.io \
     --credential-arn arn:aws:secretsmanager:us-east-1:111122223333:secret:ecr-pullthroughcache/example1234 \
     --region us-east-1
```

##### Microsoft Azure 컨테이너 레지스트리의 경우
<a name="ecr-ptc-cli-azure"></a>

다음 예제에서는 Microsoft Azure 컨테이너 레지스트리에 대한 풀스루 캐시 규칙을 생성합니다. 리포지토리 접두사를 `azure`으로 지정합니다. 이렇게 하면 풀스루 캐시 규칙을 통해 생성한 각 리포지토리가 `azure/upstream-repository-name`의 명명 체계를 사용하게 됩니다. Microsoft Azure 컨테이너 레지스트리 보안 인증 정보가 포함된 보안 암호의 전체 Amazon 리소스 이름(ARN)을 지정해야 합니다.

```
aws ecr create-pull-through-cache-rule \
     --ecr-repository-prefix azure \
     --upstream-registry-url myregistry.azurecr.io \
     --credential-arn arn:aws:secretsmanager:us-east-1:111122223333:secret:ecr-pullthroughcache/example1234 \
     --region us-east-1
```

##### GitLab 컨테이너 레지스트리의 경우
<a name="ecr-ptc-cli-gitlab"></a>

다음 예제에서는 GitLab 컨테이너 레지스트리에 대한 풀스루 캐시 규칙을 생성합니다. 리포지토리 접두사를 `gitlab`으로 지정합니다. 이렇게 하면 풀스루 캐시 규칙을 통해 생성한 각 리포지토리가 `gitlab/upstream-repository-name`의 명명 체계를 사용하게 됩니다. GitLab 컨테이너 레지스트리 보안 인증 정보가 포함된 보안 암호의 전체 Amazon 리소스 이름(ARN)을 지정해야 합니다.

```
aws ecr create-pull-through-cache-rule \
     --ecr-repository-prefix gitlab \
     --upstream-registry-url registry.gitlab.com \
     --credential-arn arn:aws:secretsmanager:us-east-1:111122223333:secret:ecr-pullthroughcache/example1234 \
     --region us-east-1
```

자세한 내용은 *Amazon ECR 사용 설명서*의 [ 풀스루 캐시 규칙(CLI) 생성을](https://docs.aws.amazon.com/AmazonECR/latest/userguide/pull-through-cache-creating-rule.html#pull-through-cache-creating-rule-cli) 참조하세요.

**get-run-task** CLI 명령을 사용하여 특정 작업에 사용되는 컨테이너 이미지에 대한 정보를 검색할 수 있습니다.

```
 aws omics get-run-task --id 1234567 --task-id <task_id> 
```

출력에는 컨테이너 이미지에 대한 다음 정보가 포함됩니다.

```
 "imageDetails": {
    "image": "string",
    "imageDigest": "string",
    "sourceImage": "string", 
          ...
 }
```

#### 업스트림 레지스트리에 대한 레지스트리 권한
<a name="reg-ecr-ptc"></a>

레지스트리 권한을 사용하여 HealthOmics가 풀스루 캐시를 사용하고 컨테이너 이미지를 Amazon ECR 프라이빗 레지스트리로 가져올 수 있도록 허용합니다. 실행에 사용되는 컨테이너를 제공하는 Amazon ECR 레지스트리 정책을 레지스트리에 추가합니다.

다음 정책은 HealthOmics 서비스가 지정된 풀스루 캐시 접두사(들)로 리포지토리를 생성하고 이러한 리포지토리로 업스트림 풀을 시작할 수 있는 권한을 부여합니다.

1. Amazon ECR 콘솔에서 왼쪽 메뉴를 열고 **프라이빗 레지스트리**에서 **레지스트리 권한을** 확장한 다음 **명령문 생성을** 선택합니다.

1. 오른쪽 상단에서 JSON을 선택합니다. 다음과 유사한 정책을 입력합니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "AllowPTCinRegPermissions",
               "Effect": "Allow",
               "Principal": {
                   "Service": "omics.amazonaws.com"
               },
               "Action": [
                   "ecr:CreateRepository",
                   "ecr:BatchImportUpstreamImage"
               ],
               "Resource": [
                   "arn:aws:ecr:us-east-1:123456789012:repository/ecr-public/*",
                   "arn:aws:ecr:us-east-1:123456789012:repository/docker-hub/*"
               ] 
           }
       ]
   }
   ```

------

#### 리포지토리 생성 템플릿
<a name="repo-create-templates-ptc"></a>

HealthOmics에서 풀스루 캐싱을 사용하려면 Amazon ECR 리포지토리에 리포지토리 생성 템플릿이 있어야 합니다. 템플릿은 사용자 또는 Amazon ECR이 업스트림 레지스트리에 대한 프라이빗 리포지토리를 생성할 때의 구성 설정을 정의합니다.

각 템플릿에는 Amazon ECR이 새 리포지토리를 특정 템플릿과 일치시키는 데 사용하는 리포지토리 네임스페이스 접두사가 포함되어 있습니다. 템플릿은 리소스 기반 액세스 정책, 태그 불변성, 암호화 및 수명 주기 정책을 포함한 모든 리포지토리 설정에 대한 구성을 지정합니다.

자세한 내용은 *Amazon Elastic Container Registry 사용 설명서의 *[리포지토리 생성 템플릿을](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-creation-templates.html) 참조하세요.

리포지토리 생성 템플릿을 생성하는 방법:

1. Amazon ECR 콘솔에서 왼쪽 메뉴를 열고 **프라이빗 레지스트리**에서 **기능 및 설정을** 확장한 다음 **리포지토리 생성 템플릿을** 선택합니다.

1. **템플릿 생성**을 선택합니다.

1. **템플릿 세부 정보**에서 **풀스루 캐시**를 선택합니다.

1. 이 템플릿을 특정 접두사에 적용할지 아니면 다른 템플릿과 일치하지 않는 모든 리포지토리에 적용할지 선택합니다.

   **특정 접두사를** 선택하는 경우 접두사에 네임스페이스 **접**두사 값을 입력합니다. PTC 규칙을 생성할 때이 접두사를 지정했습니다.

1. **다음**을 선택합니다.

1. **리포지토리 생성 구성 추가** 페이지에서 **리포지토리 권한을** 입력합니다. 샘플 정책 설명 중 하나를 사용하거나 다음 예제와 유사한 명령문을 입력합니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "PTCRepoCreationTemplate",
               "Effect": "Allow",
               "Principal": {
                   "Service": "omics.amazonaws.com"
               },
               "Action": [
                   "ecr:BatchGetImage",
                   "ecr:GetDownloadUrlForLayer"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 선택적으로 수명 주기 정책 및 태그와 같은 리포지토리 설정을 추가할 수 있습니다. Amazon ECR은 지정된 접두사를 사용하는 풀스루 캐시용으로 생성된 모든 컨테이너 이미지에 이러한 규칙을 적용합니다.

1. **다음**을 선택합니다.

1. 구성을 검토하고 **다음을** 선택합니다.

#### 워크플로 생성
<a name="reg-mapping-ecr-ptc"></a>

새 워크플로 또는 워크플로 버전을 생성할 때 레지스트리 매핑을 검토하고 필요한 경우 업데이트합니다. 자세한 내용은 [프라이빗 워크플로 생성](create-private-workflow.md)을 참조하세요.

### 레지스트리 매핑
<a name="ecr-pull-through-registry-mapping"></a>

프라이빗 Amazon ECR 레지스트리의 접두사와 업스트림 레지스트리 이름 간에 매핑하도록 레지스트리 매핑을 정의합니다.

Amazon ECR 레지스트리 매핑에 대한 자세한 내용은 [ Amazon ECR에서 풀스루 캐시 규칙 생성을](https://docs.aws.amazon.com/AmazonECR/latest/userguide/pull-through-cache-creating-rule.html) 참조하세요.

다음 예제에서는 Docker Hub, Quay 및 Amazon ECR Public에 대한 레지스트리 매핑을 보여줍니다.

```
{
    "registryMappings": [
        {
            "upstreamRegistryUrl": "registry-1.docker.io",
            "ecrRepositoryPrefix": "docker-hub"
        },
        {
            "upstreamRegistryUrl": "quay.io",
            "ecrRepositoryPrefix": "quay"
        },
        {
            "upstreamRegistryUrl": "public.ecr.aws",
            "ecrRepositoryPrefix": "ecr-public"
        }
    ]
}
```

### 이미지 매핑
<a name="ecr-pull-through-mapping-format"></a>

프라이빗 Amazon ECR 워크플로에 정의된 이미지 이름과 업스트림 레지스트리의 이미지 이름 간에 매핑하도록 이미지 매핑을 정의합니다.

풀스루 캐시를 지원하는 레지스트리에서 이미지 매핑을 사용할 수 있습니다. HealthOmics 않는 업스트림 레지스트리에서 이미지 매핑을 사용할 수도 있습니다. 업스트림 레지스트리를 프라이빗 리포지토리와 수동으로 동기화해야 합니다.

Amazon ECR 이미지 매핑에 대한 자세한 내용은 [ Amazon ECR에서 풀스루 캐시 규칙 생성을](https://docs.aws.amazon.com/AmazonECR/latest/userguide/pull-through-cache-creating-rule.html) 참조하세요.

다음 예제에서는 프라이빗 Amazon ECR 이미지에서 퍼블릭 게놈 이미지 및 최신 Ubuntu 이미지로의 매핑을 보여줍니다.

```
{
    "imageMappings": [
        {
            "sourceImage": "public.ecr.aws/aws-genomics/broadinstitute/gatk:4.6.0.2",
            "destinationImage": "123456789012.dkr.ecr.us-east-1.amazonaws.com/broadinstitute/gatk:4.6.0.2"
        },
        {
            "sourceImage": "ubuntu:latest",
            "destinationImage": "123456789012.dkr.ecr.us-east-1.amazonaws.com/custom/ubuntu:latest",
        }
    ]
}
```

## Amazon ECR 컨테이너 이미지에 대한 일반 고려 사항
<a name="ecr-considerations"></a>
+ 아키텍처

  HealthOmics는 x86\$164 컨테이너를 지원합니다. 로컬 시스템이 Apple Mac과 같은 ARM 기반인 경우 다음과 같은 명령을 사용하여 x86\$164 컨테이너 이미지를 빌드합니다.

  ```
  docker build --platform amd64 -t my_tool:latest .
  ```
+ 진입점 및 쉘

  HealthOmics 워크플로 엔진은 워크플로 작업에 사용되는 컨테이너 이미지에 대한 명령 재정의로 bash 스크립트를 삽입합니다. 따라서 컨테이너 이미지는 bash 쉘이 기본값이 되도록 지정된 ENTRYPOINT 없이 빌드해야 합니다.
+ 탑재된 경로

  공유 파일 시스템은 /tmp에서 컨테이너 작업에 마운트됩니다. 이 위치의 컨테이너 이미지에 내장된 모든 데이터 또는 도구는 재정의됩니다.

  워크플로 정의는 /mnt/workflow의 읽기 전용 탑재를 통해 태스크에 사용할 수 있습니다.
+ 이미지 크기

  최대 컨테이너 이미지 크기는 [HealthOmics 워크플로 고정 크기 할당량](fixed-quotas.md#fixed-quotas-workflows) 섹션을 참조하세요.

## HealthOmics 워크플로의 환경 변수
<a name="ecr-env-vars"></a>

HealthOmics는 컨테이너에서 실행되는 워크플로에 대한 정보가 있는 환경 변수를 제공합니다. 워크플로 작업의 로직에서 이러한 변수의 값을 사용할 수 있습니다.

모든 HealthOmics 워크플로 변수는 `AWS_WORKFLOW_` 접두사로 시작합니다. 이 접두사는 보호된 환경 변수 접두사입니다. 워크플로 컨테이너에서 자체 변수에이 접두사를 사용하지 마세요.

HealthOmics는 다음과 같은 워크플로 환경 변수를 제공합니다.

**AWS\$1REGION**  
이 변수는 컨테이너가 실행 중인 리전입니다.

**AWS\$1WORKFLOW\$1RUN**  
이 변수는 현재 실행의 이름입니다.

**AWS\$1WORKFLOW\$1RUN\$1ID**  
이 변수는 현재 실행의 실행 식별자입니다.

**AWS\$1WORKFLOW\$1RUN\$1UUID**  
이 변수는 현재 실행의 실행 UUID입니다.

**AWS\$1WORKFLOW\$1TASK**  
이 변수는 현재 작업의 이름입니다.

**AWS\$1WORKFLOW\$1TASK\$1ID**  
이 변수는 현재 작업의 작업 식별자입니다.

**AWS\$1WORKFLOW\$1TASK\$1UUID**  
이 변수는 현재 작업의 작업 UUID입니다.

다음 예제에서는 각 환경 변수의 일반적인 값을 보여줍니다.

```
AWS Region: us-east-1
Workflow Run: arn:aws:omics:us-east-1:123456789012:run/6470304
Workflow Run ID: 6470304
Workflow Run UUID: f4d9ed47-192e-760e-f3a8-13afedbd4937
Workflow Task: arn:aws:omics:us-east-1:123456789012:task/4192063
Workflow Task ID: 4192063
Workflow Task UUID: f0c9ed49-652c-4a38-7646-60ad835e0a2e
```

## Amazon ECR 컨테이너 이미지에서 Java 사용
<a name="ecr-java-considerations"></a>

워크플로 태스크가 GATK와 같은 Java 애플리케이션을 사용하는 경우 컨테이너에 대한 다음 메모리 요구 사항을 고려하세요.
+ Java 애플리케이션은 스택 메모리와 힙 메모리를 사용합니다. 기본적으로 최대 힙 메모리는 컨테이너에서 사용 가능한 총 메모리의 백분율입니다. 이 기본값은 특정 JVM 배포 및 JVM 버전에 따라 달라지므로 JVM 관련 설명서를 참조하거나 Java 명령줄 옵션(예: `-Xmx`)을 사용하여 힙 메모리 최대값을 명시적으로 설정합니다.
+ JVM 스택에도 메모리가 필요하므로 최대 힙 메모리를 컨테이너 메모리 할당의 100%로 설정하지 마세요. 메모리는 JVM 가비지 수집기 및 컨테이너에서 실행되는 기타 운영 체제 프로세스에도 필요합니다.
+ GATK와 같은 일부 Java 애플리케이션은 기본 메서드 호출 또는 메모리 매핑 파일과 같은 기타 최적화를 사용할 수 있습니다. 이러한 기법에는 JVM 최대 힙 파라미터로 제어되지 않는 "오프 힙"으로 수행되는 메모리 할당이 필요합니다.

  Java 애플리케이션이 오프 힙 메모리를 할당한다는 것을 알고 있는 경우(또는 의심하는 경우) 태스크 메모리 할당에 오프 힙 메모리 요구 사항이 포함되어 있는지 확인합니다.

  이러한 오프 힙 할당으로 인해 컨테이너의 메모리가 부족해지는 경우 일반적으로 JVM이이 메모리를 제어하지 않기 때문에 Java **OutOfMemory** 오류가 표시되지 않습니다.

## Amazon ECR 컨테이너 이미지에 작업 입력 추가
<a name="ecr-tasks"></a>

워크플로 작업을 실행하는 데 필요한 모든 실행 파일, 라이브러리 및 스크립트를 작업을 실행하는 데 사용되는 Amazon ECR 이미지에 추가합니다.

작업 컨테이너 이미지 외부에 있는 스크립트, 바이너리 및 라이브러리를 사용하지 않는 것이 좋습니다. 이는 `bin` 디렉터리를 `nf-core` 워크플로 패키지의 일부로 사용하는 워크플로를 사용할 때 특히 중요합니다. 이 디렉터리는 워크플로 작업에 사용할 수 있지만 읽기 전용 디렉터리로 마운트됩니다. 이 디렉터리의 필수 리소스는 작업 이미지에 복사해야 하며 런타임 시 또는 작업에 사용되는 컨테이너 이미지를 빌드할 때 사용할 수 있어야 합니다.

HealthOmics가 지원하는 컨테이너 이미지의 최대 크기는 [HealthOmics 워크플로 고정 크기 할당량](fixed-quotas.md#fixed-quotas-workflows) 섹션을 참조하세요. HealthOmics 

# HealthOmics 워크플로 README 파일
<a name="workflows-readme"></a>

워크플로에 대한 지침, 다이어그램 및 필수 정보가 포함된 README.md 파일을 업로드할 수 있습니다. 각 워크플로 버전은 언제든지 업데이트할 수 있는 README 파일 하나를 지원합니다.

**README 요구 사항은 다음과 같습니다.**
+ README 파일은 마크다운(.md) 형식이어야 합니다.
+ 최대 파일 크기: 500KiB

**Topics**
+ [기존 README 사용](#workflows-add-readme)
+ [렌더링 조건](#workflows-rendering-readme)

## 기존 README 사용
<a name="workflows-add-readme"></a>

Git 리포지토리에서 내보낸 READMEs에는 일반적으로 리포지토리 외부에서 작동하지 않는 상대 링크가 포함되어 있습니다. HealthOmics Git 통합은 콘솔에서 적절한 렌더링을 위해 이를 절대 링크로 자동 변환하므로 수동 URL 업데이트가 필요하지 않습니다.

Amazon S3 또는 로컬 드라이브에서 가져온 READMEs 경우 이미지와 링크는 퍼블릭 URLs 사용하거나 적절한 렌더링을 위해 상대 경로를 업데이트해야 합니다.

**참고**  
HealthOmics 콘솔에 표시하려면 이미지를 공개적으로 호스팅해야 합니다. GitHub Enterprise Server 또는 GitLab Self-Managed리포지토리에 저장된 이미지는 렌더링할 수 없습니다.

## 렌더링 조건
<a name="workflows-rendering-readme"></a>

HealthOmics 콘솔은 절대 경로를 사용하여 공개적으로 액세스할 수 있는 이미지와 링크를 보간합니다. 프라이빗 리포지토리에서 URLs을 렌더링하려면 사용자가 리포지토리에 액세스할 수 있어야 합니다. 사용자 지정 도메인을 사용하는 GitHub Enterprise Server 또는 GitLab Self-Managed리포지토리의 경우 HealthOmics는 이러한 프라이빗 리포지토리에 저장된 상대 링크를 확인하거나 이미지를 렌더링할 수 없습니다.

다음 표에는 AWS 콘솔 README 뷰에서 지원하는 마크다운 요소가 나와 있습니다.


| 요소 | AWS 콘솔 | 
| --- | --- | 
| 알림 | 예, 하지만 아이콘은 없습니다. | 
| 배지 | 예 | 
| 기본 텍스트 형식 지정 | 예 | 
| [코드 블록](https://www.markdownguide.org/basic-syntax/#code-blocks) | 예, 하지만 [구문 강조](https://www.markdownguide.org/extended-syntax/#syntax-highlighting) 표시 및 복사 버튼 기능이 없습니다. | 
| 축소 가능한 섹션 | 예 | 
| [제목](https://www.markdownguide.org/basic-syntax/#headings) | 예 | 
| [이미지 형식](https://www.markdownguide.org/basic-syntax/#images-1) | 예 | 
| [이미지(클릭 가능)](https://www.markdownguide.org/basic-syntax/#linking-images) | 예 | 
| [줄 바꿈](https://www.markdownguide.org/basic-syntax/#line-breaks) | 예 | 
| Mermaid 다이어그램 | 만 그래프를 열고, 그래프 위치를 이동하고, 코드를 복사할 수 있습니다. | 
| 견적 | 예 | 
| [Subscript](https://www.markdownguide.org/extended-syntax/#subscript) 및 [Superscript](https://www.markdownguide.org/extended-syntax/#superscript) | 예 | 
| [테이블](https://www.markdownguide.org/extended-syntax/#tables) | 예, 하지만 텍스트 정렬을 지원하지 않습니다. | 
| 텍스트 정렬 | 예 | 

### 이미지 및 링크 URLs 사용
<a name="workflows-urls-readme"></a>

소스 공급자에 따라 페이지 및 이미지URLs을 다음 형식으로 구성합니다.
+ `{username}`: 리포지토리가 호스팅되는 사용자 이름입니다.
+ `{repo}`: 리포지토리 이름입니다.
+ `{ref}`: 소스 참조(브랜치, 태그 및 커밋 ID).
+ `{path}`: 리포지토리의 페이지 또는 이미지에 대한 파일 경로입니다.


| 소스 공급자 | 페이지 URL | 이미지 URL | 
| --- | --- | --- | 
| GitHub | https://github.com/\$1username\$1/\$1repo\$1/blob/\$1ref\$1/\$1path\$1 |  `https://github.com/{username}/{repo}/blob/{ref}/{path}?raw=true` `https://raw.githubusercontent.com/{username}/{repo}/{ref}/{path}`  | 
| GitLab | https://gitlab.com/\$1username\$1/\$1repo\$1/-/blob/\$1ref\$1/\$1path\$1 | https://gitlab.com/\$1username\$1/\$1repo\$1/-/raw/\$1ref\$1/\$1path\$1 | 
| Bitbucket | https://bitbucket.org/\$1username\$1/\$1repo\$1/src/\$1ref\$1/\$1path\$1 | https://bitbucket.org/\$1username\$1/\$1repo\$1/raw/\$1ref\$1/\$1path\$1 | 

GitHub, GitLab및는 퍼블릭 리포지토리에 연결되는 페이지 및 이미지 URLs을 모두 Bitbucket 지원합니다. 다음 표에는 프라이빗 리포지토리에 대한 이미지 및 링크 URLs 렌더링에 대한 각 소스 공급자의 지원이 나와 있습니다.


| 프라이빗 리포지토리 지원 | 소스 공급자 | 페이지 URL | 이미지 URL | 
| --- | --- | --- | --- | 
| GitHub | 리포지토리에 액세스할 수 있는 경우에만 | 아니요 | 
| GitLab | 리포지토리에 액세스할 수 있는 경우에만 | 아니요 | 
| Bitbucket | 리포지토리에 액세스할 수 있는 경우에만 | 아니요 | 

# 프라이빗 워크플로에 대한 Sentieon 라이선스 요청
<a name="private-workflows-subscribe"></a>

프라이빗 워크플로에서 Sentieon 소프트웨어를 사용하는 경우 Senieon 라이선스가 필요합니다. 다음 단계에 따라 Sentieon 소프트웨어에 대한 라이선스를 요청하고 설정합니다.
+ Sentieon 라이선스 요청 
  + Sentieon 지원 그룹(support@sentieon.com)에 이메일을 보내 소프트웨어 라이선스를 요청합니다.
    + 이메일에 AWS 정식 사용자 ID를 입력합니다.
    + [ 다음 지침에](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-identifiers.html#FindCanonicalId) 따라 AWS 정식 사용자 ID를 찾습니다.
+ HealthOmics 서비스 역할을 업데이트하여 해당 리전의 Sentieon 라이선스 서버 프록시 및 Sentieon Omics 버킷에 대한 액세스 권한을 부여합니다. 다음 예제에서는에서 액세스 권한을 부여합니다`us-east-1`. 필요한 경우이 텍스트를 해당 리전으로 바꿉니다.

------
#### [ JSON ]

****  

  ```
  {
             "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "s3:GetObjectAcl",
                  "s3:GetObject"
              ],
              "Resource": [
                  "arn:aws:s3:::omics-ap-us-east-1/*",
                  "arn:aws:s3:::sentieon-omics-license-us-east-1/*"
              ]
          }
      ]
   }
  ```

------
+  AWS 지원 사례를 생성하여 Sentieon 라이선스 서버 프록시에 액세스합니다.
  + 지원 사례를 생성하려면 [ support.console.aws.amazon.com 이동합니다.](https://support.console.aws.amazon.com)
  + 지원 사례에 AWS 계정 및 리전을 제공합니다. 계정이 라이선스 서버 프록시의 허용 목록에 추가됩니다.
+ Sentieon 컨테이너와 Sentieon 라이선스 스크립트를 사용하여 프라이빗 워크플로를 빌드합니다.
  + 프라이빗 워크플로 내에서 Sentieon 도구를 사용하는 방법에 대한 추가 지침은 GitHub의 [Sentieon-Amazon-Omics](https://github.com/Sentieon/sentieon-amazon-omics)를 참조하세요.
+ Sentieon 소프트웨어 버전 202112.07 이상은 HealthOmics 라이선스 서버 프록시를 지원합니다. 202112.07 이전의 Sentieon 소프트웨어 버전을 사용하려면 Sentieon 지원팀에 문의하십시오.

# HealthOmics의 워크플로 린터
<a name="workflows-linter"></a>

워크플로를 생성한 후에는 첫 번째 실행을 시작하기 전에 워크플로에서 린터를 실행하는 것이 좋습니다. 린터는 실행이 실패할 수 있는 오류를 감지합니다.

WDL의 경우 워크플로를 생성할 때 HealthOmics가 자동으로 린터를 실행합니다. 린터 출력은 **get-workflow** 응답의 `statusMessage` 필드에서 사용할 수 있습니다. 다음 CLI 명령을 사용하여 상태 출력을 검색합니다(생성한 WDL 워크플로의 워크플로 ID 사용).

```
aws omics get-workflow 
   —id 123456 
   —query 'statusMessage'
```

HealthOmics는 워크플로를 생성하기 전에 워크플로 정의에서 실행할 수 있는 린터를 제공합니다. HealthOmics로 마이그레이션하려는 기존 파이프라인에서 이러한 린터를 실행합니다.
+ **WDL** - [WDL 린터](https://gallery.ecr.aws/aws-genomics/healthomics-linter)를 실행하는 퍼블릭 Amazon ECR 이미지입니다.
+ **Nextflow** - [Nextflow에 대한 Linter 규칙을]( https://gallery.ecr.aws/aws-genomics/linter-rules-for-nextflow) 실행하는 퍼블릭 Amazon ECR 이미지입니다. [GitHub](https://github.com/awslabs/linter-rules-for-nextflow)에서이 린터의 소스 코드에 액세스할 수 있습니다.
+ **CWL** - 사용할 수 없음

# HealthOmics 워크플로 작업
<a name="creating-private-workflows"></a>

프라이빗 워크플로를 생성하려면 다음이 필요합니다.
+  **Workflow definition file:** WDL, Nextflow또는 로 작성된 워크플로 정의 파일입니다CWL. 워크플로 정의는 워크플로를 사용하는 실행에 대한 입력 및 출력을 지정합니다. 또한 컴퓨팅 및 메모리 요구 사항을 포함하여 워크플로의 실행 및 실행 작업에 대한 사양도 포함되어 있습니다. 워크플로 정의 파일은 `.zip` 형식이어야 합니다. 자세한 내용은 HealthOmics의 [워크플로 정의 파일을](workflow-definition-files.md) 참조하세요. HealthOmics
  + [Amazon Q CLI](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/what-is.html)를 사용하여 WDL, Nextflow 및 CWL에서 워크플로 정의 파일을 빌드하고 검증할 수 있습니다. 자세한 내용은 [Amazon Q CLI에 대한 프롬프트 예제](getting-started.md#omics-q-prompts) 및 GitHub의 [HealthOmics Agentic 생성형 AI 자습](https://github.com/aws-samples/aws-healthomics-tutorials/tree/main/generative-ai)서를 참조하세요.
+  **(Optional) Parameter template file:**에 작성된 파라미터 템플릿 파일입니다JSON. 파일을 생성하여 실행 파라미터를 정의하거나 HealthOmics가 파라미터 템플릿을 생성합니다. 자세한 내용은 [ HealthOmics 워크플로용 파라미터 템플릿 파일을 참조하세요](parameter-templates.md).
+ **Amazon ECR container images:** 워크플로에 사용되는 각 컨테이너에 대해 프라이빗 Amazon ECR 리포지토리를 생성합니다. 워크플로용 컨테이너 이미지를 생성하여 프라이빗 리포지토리에 저장하거나 지원되는 업스트림 레지스트리의 콘텐츠를 ECR 프라이빗 리포지토리와 동기화합니다.
+  **(Optional) Sentieon licenses:** 프라이빗 워크플로에서 Sentieon 소프트웨어를 사용할 수 있는 Sentieon 라이선스를 요청합니다.

4MiB(압축)보다 큰 워크플로 정의 파일의 경우 워크플로 생성 중에 다음 옵션 중 하나를 선택합니다.
+ Amazon Simple Storage Service 폴더에 업로드하고 위치를 지정합니다.
+ 외부 리포지토리(최대 크기 1GiB)에 업로드하고 리포지토리 세부 정보를 지정합니다.

워크플로를 생성한 후 `UpdateWorkflow` 작업으로 다음 워크플로 정보를 업데이트할 수 있습니다.
+ 명칭
+ 설명
+ 기본 스토리지 유형
+ 기본 스토리지 용량(워크플로 ID 사용)
+ README.md 파일

워크플로의 다른 정보를 변경하려면 새 워크플로 또는 워크플로 버전을 생성합니다.

워크플로 버전 관리를 사용하여 워크플로를 구성하고 구조화합니다. 버전은 반복 워크플로 업데이트의 도입을 관리하는 데도 도움이 됩니다. 버전에 대한 자세한 내용은 [워크플로 버전 생성](workflows-version-create.md)을 참조하십시오.

**Topics**
+ [프라이빗 워크플로 생성](create-private-workflow.md)
+ [프라이빗 워크플로 업데이트](update-private-workflow.md)
+ [프라이빗 워크플로 삭제](delete-private-workflow.md)
+ [워크플로 상태 확인](using-get-workflow.md)
+ [워크플로 정의에서 게놈 파일 참조](create-ref-files.md)

# 프라이빗 워크플로 생성
<a name="create-private-workflow"></a>

HealthOmics 콘솔, AWS CLI 명령 또는 AWS SDKs 중 하나를 사용하여 워크플로를 생성합니다.

**참고**  
워크플로 이름에 개인 식별 정보(PII)를 포함하지 마십시오. 이러한 이름은 CloudWatch 로그에 표시됩니다.

워크플로를 생성할 때 HealthOmics는 워크플로에 범용 고유 식별자(UUID)를 할당합니다. 워크플로 UUID는 워크플로 및 워크플로 버전에서 고유한 글로벌 고유 식별자(guid)입니다. 데이터 출처를 위해 워크플로 UUID를 사용하여 워크플로를 고유하게 식별하는 것이 좋습니다.

워크플로 작업에서 외부 도구(실행 파일, 라이브러리 또는 스크립트)를 사용하는 경우 이러한 도구를 컨테이너 이미지에 빌드합니다. 컨테이너 이미지를 호스팅하는 옵션은 다음과 같습니다.
+ ECR 프라이빗 레지스트리에서 컨테이너 이미지를 호스팅합니다. 이 옵션의 사전 조건:
  + ECR 프라이빗 리포지토리를 생성하거나 기존 리포지토리를 선택합니다.
  + 에 설명된 대로 ECR 리소스 정책을 구성합니다[Amazon ECR 권한](permissions-ecr.md).
  + 컨테이너 이미지를 프라이빗 리포지토리에 업로드합니다.
+ 컨테이너 이미지를 지원되는 타사 레지스트리의 콘텐츠와 동기화합니다. 이 옵션의 사전 조건:
  + ECR 프라이빗 레지스트리에서 각 업스트림 레지스트리에 대한 풀스루 캐시 규칙을 구성합니다. 자세한 내용은 [이미지 매핑](workflows-ecr.md#ecr-pull-through-mapping-format) 단원을 참조하십시오.
  + 에 설명된 대로 ECR 리소스 정책을 구성합니다[Amazon ECR 권한](permissions-ecr.md).
  + 리포지토리 생성 템플릿을 생성합니다. 템플릿은 Amazon ECR이 업스트림 레지스트리에 대한 프라이빗 리포지토리를 생성하는 시기에 대한 설정을 정의합니다.
  + 접두사 매핑을 생성하여 워크플로 정의의 컨테이너 이미지 참조를 ECR 캐시 네임스페이스에 다시 매핑합니다.

워크플로를 생성할 때 워크플로, 실행 및 작업에 대한 정보가 포함된 워크플로 정의를 제공합니다. HealthOmics는 워크플로 정의를 로컬 또는 Amazon S3 버킷 또는 지원되는 Git 기반 리포지토리에 저장된 .zip 아카이브로 검색할 수 있습니다.

**Topics**
+ [콘솔을 사용하여 워크플로 생성](#console-create-workflows)
+ [CLI를 사용하여 워크플로 생성](#api-create-workflows)
+ [SDK를 사용하여 워크플로 생성](#sdk-create-workflows)

## 콘솔을 사용하여 워크플로 생성
<a name="console-create-workflows"></a>

**워크플로를 생성하는 단계**

1. [HealthOmics 콘솔](https://console.aws.amazon.com/omics/)을 엽니다.

1.  필요한 경우 왼쪽 탐색 창(™)을 엽니다. **프라이빗 워크플로**를 선택합니다.

1. **프라이빗 워크플로** 페이지에서 **워크플로 생성을** 선택합니다.

1. **워크플로 정의** 페이지에서 다음 정보를 제공합니다.

   1. **워크플로 이름**:이 워크플로의 고유한 이름입니다. AWS HealthOmics 콘솔 및 CloudWatch 로그에서 실행을 구성하려면 워크플로 이름을 설정하는 것이 좋습니다.

   1. **설명**(선택 사항):이 워크플로에 대한 설명입니다.

1. **워크플로 정의** 패널에서 다음 정보를 제공합니다.

   1. **워크플로 언어**(선택 사항): 워크플로의 사양 언어를 선택합니다. 그렇지 않으면 HealthOmics가 워크플로 정의에서 언어를 결정합니다.

   1. **워크플로 정의 소스**에서 Git 기반 리포지토리, Amazon S3 위치 또는 로컬 드라이브에서 정의 폴더를 가져오도록 선택합니다.

      1. **리포지토리 서비스에서 가져오기의** 경우:
**참고**  
HealthOmics는 GitHub, , , GitLab, Bitbucket에 대한 퍼블릭 및 프라이빗 리포지토리GitHub self-managed를 지원합니다GitLab self-managed.

         1. **연결을** 선택하여 AWS 리소스를 외부 리포지토리에 연결합니다. 연결을 생성하려면 섹션을 참조하세요[외부 코드 리포지토리와 연결](setting-up-new.md#setting-up-omics-repository).
**참고**  
TLV 리전의 고객은 워크플로를 생성하려면 IAD (us-east-1) 리전에서 연결을 생성해야 합니다.

         1. **전체 리포지토리 ID**에 리포지토리 ID를 user-name/repo-name으로 입력합니다. 이 리포지토리의 파일에 액세스할 수 있는지 확인합니다.

         1. **소스 참조**(선택 사항)에 리포지토리 소스 참조(브랜치, 태그 또는 커밋 ID)를 입력합니다. HealthOmics는 소스 참조가 지정되지 않은 경우 기본 브랜치를 사용합니다.

         1. **파일 패턴 제외**에 파일 패턴을 입력하여 특정 폴더, 파일 또는 확장자를 제외합니다. 이렇게 하면 리포지토리 파일을 가져올 때 데이터 크기를 관리하는 데 도움이 됩니다. 패턴은 최대 50개이며 패턴은 [glob 패턴 구문](https://fossil-scm.org/home/doc/tip/www/globs.md)을 따라야 합니다. 예제: 

            1. `tests/`

            1. `*.jpeg`

            1. `large_data.zip`

      1. **S3에서 정의 폴더 선택**의 경우:

         1. 압축된 워크플로 정의 폴더가 포함된 Amazon S3 위치를 입력합니다. Amazon S3 버킷은 워크플로와 동일한 리전에 있어야 합니다.

         1. 계정이 Amazon S3 버킷을 소유하지 않은 경우 S3 버킷 소유자의 AWS 계정 ID에 버킷 소유자의 계정 ID를 입력합니다. **S3 ** 이 정보는 HealthOmics가 버킷 소유권을 확인할 수 있도록 하기 위해 필요합니다.

      1. **로컬 소스에서 정의 폴더 선택의** 경우:

         1. 압축된 워크플로 정의 폴더의 로컬 드라이브 위치를 입력합니다.

   1. **기본 워크플로 정의 파일 경로**(선택 사항): 압축된 워크플로 정의 폴더 또는 리포지토리에서 파일로의 `main` 파일 경로를 입력합니다. 워크플로 정의 폴더에 파일이 하나만 있거나 기본 파일의 이름이 "main"인 경우에는이 파라미터가 필요하지 않습니다.

1. **README 파일**(선택 사항) 패널에서 **README 파일의 소스를** 선택하고 다음 정보를 제공합니다.
   + **리포지토리 서비스에서 가져오기**의 **README 파일 경로**에 리포지토리 내의 README 파일 경로를 입력합니다.
   + **S3에서 파일 선택**의 S3**의 README 파일에 README 파일의 Amazon S3 URI를 S3**입력합니다. Amazon S3 
   + **로컬 소스에서 파일 선택**: **README - 선택** 사항에서 **파일 선택을** 선택하여 업로드할 마크다운(.md) 파일을 선택합니다.

1. **기본 실행 스토리지 구성** 패널에서이 워크플로를 사용하는 실행에 대한 기본 실행 스토리지 유형 및 용량을 제공합니다.

   1. **실행 스토리지 유형**: 정적 또는 동적 스토리지를 임시 실행 스토리지의 기본값으로 사용할지 여부를 선택합니다. 기본값은 정적 스토리지입니다.

   1. **스토리지 용량 실행**(선택 사항): 정적 실행 스토리지 유형의 경우이 워크플로에 필요한 기본 실행 스토리지 양을 입력할 수 있습니다. 이 파라미터의 기본값은 1200GiB입니다. 실행을 시작할 때 이러한 기본값을 재정의할 수 있습니다.

1. **태그**(선택 사항):이 워크플로에 최대 50개의 태그를 연결할 수 있습니다.

1. **다음**을 선택합니다.

1. **워크플로 파라미터 추가**(선택 사항) 페이지에서 **파라미터 소스를** 선택합니다.

   1. **워크플로 정의 파일에서 구문 분석**의 경우 HealthOmics는 워크플로 정의 파일에서 워크플로 파라미터를 자동으로 구문 분석합니다.

   1. **Git 리포지토리에서 파라미터 템플릿 제공**에서 리포지토리의 파라미터 템플릿 파일 경로를 사용합니다.

   1. **로컬 소스에서 JSON 파일 선택**에서 파라미터를 지정하는 로컬 소스에서 JSON 파일을 업로드합니다.

   1. **워크플로 파라미터를 수동으로 입력**하려면 파라미터 이름과 설명을 수동으로 입력합니다.

1. **파라미터 미리 보기** 패널에서이 워크플로 버전의 파라미터를 검토하거나 변경할 수 있습니다. JSON 파일을 복원하면 로컬 변경 사항이 손실됩니다.

1. **다음**을 선택합니다.

1. **컨테이너 URI 다시 매핑** 페이지의 **매핑 규칙** 패널에서 워크플로에 대한 URI 매핑 규칙을 정의할 수 있습니다.

   **매핑 파일 소스**에서 다음 옵션 중 하나를 선택합니다.
   + **없음** - 매핑 규칙이 필요하지 않습니다.
   + **S3에서 JSON 파일 선택** - 매핑 파일의 S3 위치를 지정합니다.
   + **로컬 소스에서 JSON 파일 선택** - 로컬 디바이스에서 매핑 파일 위치를 지정합니다.
   + **수동으로 매핑 입력 **- 매핑 패널에 레지스트리 매핑 및 이미지 **매핑을** 입력합니다.

1.  콘솔에 **매핑 패널이** 표시됩니다. 매핑 소스 파일을 선택한 경우 콘솔에 파일의 값이 표시됩니다.

   1. **레지스트리 매핑**에서 매핑을 편집하거나 매핑을 추가할 수 있습니다(최대 20개의 레지스트리 매핑).

      각 레지스트리 매핑에는 다음 필드가 포함됩니다.
      + **업스트림 레지스트리 URL** - 업스트림 레지스트리의 URI입니다.
      + **ECR 리포지토리 접두사** - Amazon ECR 프라이빗 리포지토리에서 사용할 리포지토리 접두사입니다.
      + (선택 사항) **업스트림 리포지토리 접두사** - 업스트림 레지스트리에 있는 리포지토리의 접두사입니다.
      + (선택 사항) **ECR 계정 ID** - 업스트림 컨테이너 이미지를 소유한 계정의 계정 ID입니다.

   1. **이미지 매핑**에서 이미지 매핑을 편집하거나 매핑을 추가할 수 있습니다(최대 100개의 이미지 매핑).

      각 이미지 매핑에는 다음 필드가 포함됩니다.
      + **소스 이미지** - 업스트림 레지스트리에서 소스 이미지의 URI를 지정합니다.
      + **대상 이미지** - 프라이빗 Amazon ECR 레지스트리에서 해당 이미지의 URI를 지정합니다.

1. **다음**을 선택합니다.

1. 워크플로 구성을 검토한 다음 **워크플로 생성을** 선택합니다.

## CLI를 사용하여 워크플로 생성
<a name="api-create-workflows"></a>

워크플로 파일과 파라미터 템플릿 파일이 로컬 시스템에 있는 경우 다음 CLI 명령을 사용하여 워크플로를 생성할 수 있습니다.

```
aws omics create-workflow  \
  --name "my_workflow"   \
  --definition-zip fileb://my-definition.zip \
  --parameter-template file://my-parameter-template.json
```

`create-workflow` 작업은 다음 응답을 반환합니다.

```
{
  "arn": "arn:aws:omics:us-west-2:....",
  "id": "1234567",
  "status": "CREATING",
  "tags": {
      "resourceArn": "arn:aws:omics:us-west-2:...."
  },
  "uuid": "64c9a39e-8302-cc45-0262-2ea7116d854f"
}
```

### 워크플로를 생성할 때 사용할 선택적 파라미터
<a name="other-create-parameters"></a>

워크플로를 생성할 때 선택적 파라미터를 지정할 수 있습니다. 구문 세부 정보는 AWS HealthOmics API 참조의 [CreateWorkflow](https://docs.aws.amazon.com/omics/latest/api/API_CreateWorkflow.html)를 참조하세요.

**Topics**
+ [워크플로 정의 Amazon S3 위치 지정](#create-defn-uri-parameter)
+ [Git 기반 리포지토리에서 워크플로 정의 사용](#create-defn-uri-git)
+ [Readme 파일 지정](#specify-readme-file)
+ [**main** 정의 파일 지정](#create-main-parameter)
+ [실행 스토리지 유형 지정](#create-run-storage-parameter)
+ [GPU 구성 지정](#create-accelerator-parameter)
+ [풀스루 캐시 매핑 파라미터 구성](#create-prefix-mapping-parameters)

#### 워크플로 정의 Amazon S3 위치 지정
<a name="create-defn-uri-parameter"></a>

워크플로 정의 파일이 Amazon S3 폴더에 있는 경우 다음 예제와 같이 `definition-uri` 파라미터를 사용하여 위치를 지정합니다. 계정이 Amazon S3 버킷을 소유하지 않은 경우 소유자의 AWS 계정 ID를 입력합니다.

```
aws omics create-workflow  \
  --name Test  \
  --definition-uri s3://omics-bucket/workflow-definition/  \
  --owner-id  123456789012 
    ...
```

#### Git 기반 리포지토리에서 워크플로 정의 사용
<a name="create-defn-uri-git"></a>

지원되는 Git 기반 리포지토리의 워크플로 정의를 사용하려면 요청에 `definition-repository` 파라미터를 사용합니다. 입력 소스가 두 개 이상 포함된 경우 요청이 실패하므로 다른 `definition` 파라미터를 제공하지 마십시오.

`definition-respository` 파라미터에는 다음 필드가 포함됩니다.
+ **connectionArn** - AWS 리소스를 외부 리포지토리에 연결하는 코드 연결의 ARN입니다.
+ **fullRepositoryId** - 리포지토리 ID를 로 입력합니다`owner-name/repo-name`. 이 리포지토리의 파일에 액세스할 수 있는지 확인합니다.
+ **sourceReference** (선택 사항) - 리포지토리 참조 유형(BRANCH, TAG 또는 COMMIT)과 값을 입력합니다.

  소스 참조를 지정하지 않으면 HealthOmics는 기본 브랜치에서 최신 커밋을 사용합니다.
+ **excludeFilePatterns** (선택 사항) - 파일 패턴을 입력하여 특정 폴더, 파일 또는 확장자를 제외합니다. 이렇게 하면 리포지토리 파일을 가져올 때 데이터 크기를 관리하는 데 도움이 됩니다. 최대 50개의 패턴을 제공합니다. 패턴은 [ glob 패턴 구문](https://fossil-scm.org/home/doc/tip/www/globs.md)을 따라야 합니다. 예제:
  + `tests/`
  + `*.jpeg`
  + `large_data.zip`

Git 기반 리포지토리에서 워크플로 정의를 지정할 때를 사용하여 파라미터 템플릿 파일을 `parameter-template-path` 지정합니다. 이 파라미터를 제공하지 않으면 HealthOmics는 파라미터 템플릿 없이 워크플로를 생성합니다.

다음 예제는 Git 기반 프라이빗 리포지토리의 콘텐츠와 관련된 파라미터를 보여줍니다.

```
aws omics create-workflow \
    --name custom-variant \
    --description "Custom variant calling pipeline" \
    --engine "WDL" \
    --definition-repository '{
            "connectionArn": "arn:aws:codeconnections:us-east-1:123456789012:connection/abcd1234-5678-90ab-cdef-1234567890ab",
            "fullRepositoryId": "myorg/my-genomics-workflows",
            "sourceReference": {
                "type": "BRANCH",            
                "value": "main"        
            },        
            "excludeFilePatterns": ["tests/**", "*.log"]   
      }' \
    --main "workflows/variant-calling/main.wdl" \
    --parameter-template-path "parameters/variant-calling-params.json" \
    --readme-path "docs/variant-calling-README.md" \
    --storage-type "DYNAMIC" \
```

자세한 예제는 블로그 게시물 [ How To Create a AWS HealthOmics Workflows from Content in Git를 참조하세요](https://repost.aws/articles/ARCEN7AjhaRSmteczRoc_QsA/how-to-create-an-aws-healthomics-workflows-from-content-in-git).

#### Readme 파일 지정
<a name="specify-readme-file"></a>

다음 파라미터 중 하나를 사용하여 README 파일 위치를 지정할 수 있습니다.
+ **readme-markdown** - 로컬 시스템의 문자열 입력 또는 파일입니다.
+ **readme-uri** - S3에 저장된 파일의 URI입니다.
+ **readme-path ** - 리포지토리의 README 파일 경로입니다.

readme-path는 **정의 리포지토리**와 함께 사용해야 합니다. README 파라미터를 지정하지 않으면 HealthOmics는 루트 수준 README.md 파일을 리포지토리에 가져옵니다(있는 경우).

다음 예제에서는 readme-path 및 readme-uri를 사용하여 README 파일 위치를 지정하는 방법을 보여줍니다.

```
# Using README from repository
aws omics create-workflow \
    --name "documented-workflow" \
    --definition-repository '...' \
    --readme-path "docs/workflow-guide.md"

# Using README from S3
aws omics create-workflow \
    --name "s3-readme-workflow" \
    --definition-repository '...' \
    --readme-uri "s3://my-bucket/workflow-docs/readme.md"
```

자세한 내용은 [HealthOmics 워크플로 README 파일](workflows-readme.md) 단원을 참조하십시오.

#### **main** 정의 파일 지정
<a name="create-main-parameter"></a>

여러 워크플로 정의 파일을 포함하는 경우 `main` 파라미터를 사용하여 워크플로의 기본 정의 파일을 지정합니다.

```
aws omics create-workflow  \
  --name Test  \
  --main multi_workflow/workflow2.wdl  \
    ...
```

#### 실행 스토리지 유형 지정
<a name="create-run-storage-parameter"></a>

기본 실행 스토리지 유형(DYNAMIC 또는 STATIC) 및 실행 스토리지 용량(정적 스토리지에 필요)을 지정할 수 있습니다. 실행 스토리지 유형에 대한 자세한 내용은 섹션을 참조하세요[HealthOmics 워크플로에서 스토리지 유형 실행](workflows-run-types.md).

```
aws omics create-workflow  \
  --name my_workflow   \
  --definition-zip fileb://my-definition.zip \
  --parameter-template file://my-parameter-template.json   \
  --storage-type 'STATIC'  \
  --storage-capacity 1200  \
```

#### GPU 구성 지정
<a name="create-accelerator-parameter"></a>

액셀러레이터 파라미터를 사용하여 가속 컴퓨팅 인스턴스에서 실행되는 워크플로를 생성합니다. 다음 예제에서는 `accelerators` 파라미터를 사용하는 방법을 보여줍니다. 워크플로 정의에서 GPU 구성을 지정합니다. [가속 컴퓨팅 인스턴스](memory-and-compute-tasks.md#workflow-task-accelerated-computing-instances)을(를) 참조하세요.

```
aws omics create-workflow --name workflow name \
   --definition-uri s3://amzn-s3-demo-bucket1/GPUWorkflow.zip \
   --accelerators GPU
```

#### 풀스루 캐시 매핑 파라미터 구성
<a name="create-prefix-mapping-parameters"></a>

Amazon ECR 풀스루 캐시 매핑 기능을 사용하는 경우 기본 매핑을 재정의할 수 있습니다. 컨테이너 설정 파라미터에 대한 자세한 내용은 섹션을 참조하세요[프라이빗 워크플로용 컨테이너 이미지](workflows-ecr.md).

다음 예제에서 파일에는이 콘텐츠가 `mappings.json` 포함되어 있습니다.

```
{
    "registryMappings": [
        {
            "upstreamRegistryUrl": "registry-1.docker.io",
            "ecrRepositoryPrefix": "docker-hub"
        },
        {
            "upstreamRegistryUrl": "quay.io",
            "ecrRepositoryPrefix": "quay",
            "accountId": "123412341234"
        },
        {

            "upstreamRegistryUrl": "public.ecr.aws",
            "ecrRepositoryPrefix": "ecr-public"
        }
    ],
    "imageMappings": [{
            "sourceImage": "docker.io/library/ubuntu:latest",
            "destinationImage": "healthomics-docker-2/custom/ubuntu:latest",
            "accountId": "123412341234"
        },
        {
            "sourceImage": "nvcr.io/nvidia/k8s/dcgm-exporter",
            "destinationImage": "healthomics-nvidia/k8s/dcgm-exporter"
        }
    ]
}
```

create-workflow 명령에서 매핑 파라미터를 지정합니다.

```
aws omics create-workflow  \
     ...
--container-registry-map-file file://mappings.json
    ...
```

매핑 파라미터 파일의 S3 위치를 지정할 수도 있습니다.

```
aws omics create-workflow  \
     ...
--container-registry-map-uri s3://amzn-s3-demo-bucket1/test.zip
    ...
```

## SDK를 사용하여 워크플로 생성
<a name="sdk-create-workflows"></a>

SDKs. 다음 예제에서는 Python SDK를 사용하여 워크플로를 생성하는 방법을 보여줍니다.

```
import boto3

omics = boto3.client('omics')

with open('definition.zip', 'rb') as f:
   definition = f.read()

response = omics.create_workflow(
   name='my_workflow',
   definitionZip=definition,
   parameterTemplate={ ... }
)
```

# 프라이빗 워크플로 업데이트
<a name="update-private-workflow"></a>

HealthOmics 콘솔, AWS CLI 명령 또는 AWS SDKs.

**참고**  
워크플로 이름에 개인 식별 정보(PII)를 포함하지 마세요. 이러한 이름은 CloudWatch 로그에 표시됩니다.

**Topics**
+ [콘솔을 사용하여 워크플로 업데이트](#console-update-workflows)
+ [CLI를 사용하여 워크플로 업데이트](#api-update-workflows)
+ [SDK를 사용하여 워크플로 업데이트](#sdk-update-workflows)

## 콘솔을 사용하여 워크플로 업데이트
<a name="console-update-workflows"></a>

**워크플로를 업데이트하는 단계**

1. [HealthOmics 콘솔](https://console.aws.amazon.com/omics/)을 엽니다.

1.  필요한 경우 왼쪽 탐색 창(™)을 엽니다. **프라이빗 워크플로**를 선택합니다.

1. **프라이빗 워크플로** 페이지에서 업데이트할 워크플로를 선택합니다.

1. **워크플로** 페이지에서:
   + 워크플로에 버전이 있는 경우 **기본 버전을** 선택해야 합니다.
   + **작업** 목록에서 **선택한 편집**을 선택합니다.

1. **워크플로 편집** 페이지에서 다음 값 중 하나를 변경할 수 있습니다.
   + **워크플로 이름**입니다.
   + **워크플로 설명**.
   + 워크플로의 기본 **실행 스토리지 유형**입니다.
   + 기본 **실행 스토리지 용량**(실행 스토리지 유형이 정적 스토리지인 경우). 기본 실행 스토리지 구성에 대한 자세한 내용은 섹션을 참조하세요[콘솔을 사용하여 워크플로 생성](create-private-workflow.md#console-create-workflows).

1. **변경 사항 저장**을 선택하여 변경 사항을 적용합니다.

## CLI를 사용하여 워크플로 업데이트
<a name="api-update-workflows"></a>

다음 예제와 같이 워크플로 이름과 설명을 업데이트할 수 있습니다. 기본 실행 스토리지 유형(STATIC 또는 DYNAMIC)과 실행 스토리지 용량(정적 스토리지 유형의 경우)을 변경할 수도 있습니다. 실행 스토리지 유형에 대한 자세한 내용은 섹션을 참조하세요[HealthOmics 워크플로에서 스토리지 유형 실행](workflows-run-types.md).

```
aws omics update-workflow    \
  --id 1234567    \
  --name my_workflow      \
  --description "updated workflow"    \
  --storage-type 'STATIC'    \
  --storage-capacity 1200
```

`update-workflow` 요청에 대한 응답을 받지 못합니다.

## SDK를 사용하여 워크플로 업데이트
<a name="sdk-update-workflows"></a>

SDKs.

다음 예제에서는 Python SDK를 사용하여 워크플로를 업데이트하는 방법을 보여줍니다.

```
import boto3

omics = boto3.client('omics')

response = omics.update_workflow(
   name='my_workflow',
   description='updated workflow'
)
```

# 프라이빗 워크플로 삭제
<a name="delete-private-workflow"></a>

워크플로가 더 이상 필요하지 않은 경우 HealthOmics 콘솔, AWS CLI 명령 또는 AWS SDKs. 다음 기준을 충족하는 워크플로를 삭제할 수 있습니다.
+ 상태는 ACTIVE 또는 FAILED입니다.
+ 활성 공유가 없습니다.
+ 모든 워크플로 버전을 삭제했습니다.

워크플로를 삭제해도 워크플로를 사용하는 진행 중인 실행에는 영향을 주지 않습니다.

**Topics**
+ [콘솔을 사용하여 워크플로 삭제](#console-delete-workflows)
+ [CLI를 사용하여 워크플로 삭제](#api-delete-workflows)
+ [SDK를 사용하여 워크플로 삭제](#sdk-delete-workflows)

## 콘솔을 사용하여 워크플로 삭제
<a name="console-delete-workflows"></a>

**워크플로 삭제**

1. [HealthOmics 콘솔](https://console.aws.amazon.com/omics/)을 엽니다.

1.  필요한 경우 왼쪽 탐색 창(™)을 엽니다. **프라이빗 워크플로**를 선택합니다.

1. **프라이빗 워크플로** 페이지에서 삭제할 워크플로를 선택합니다.

1. **워크플로** 페이지의 **작업** 목록에서 **선택한 삭제**를 선택합니다.

1. **워크플로 삭제** 모달에 "확인"을 입력하여 삭제를 확인합니다.

1. **삭제**를 선택합니다.

## CLI를 사용하여 워크플로 삭제
<a name="api-delete-workflows"></a>

다음 예제에서는 AWS CLI 명령을 사용하여 워크플로를 삭제하는 방법을 보여줍니다. 예제를 실행하려면를 삭제하려는 워크플로의 ID`workflow id`로 바꿉니다.

```
aws omics delete-workflow 
  --id workflow id
```

HealthOmics는 `delete-workflow` 요청에 대한 응답을 보내지 않습니다.

## SDK를 사용하여 워크플로 삭제
<a name="sdk-delete-workflows"></a>

SDKs.

다음 예제에서는 Python SDK를 사용하여 워크플로를 삭제하는 방법을 보여줍니다.

```
import boto3

omics = boto3.client('omics')

response = omics.delete_workflow(
   id='1234567'
)
```

# 워크플로 상태 확인
<a name="using-get-workflow"></a>

워크플로를 생성한 후 다음과 같이 **get-workflow**를 사용하여 워크플로의 상태를 확인하고 다른 세부 정보를 볼 수 있습니다.

```
aws omics get-workflow --id 1234567 
```

응답에는 다음과 같이 상태를 포함한 워크플로 세부 정보가 포함됩니다.

```
{
    "arn": "arn:aws:omics:us-west-2:....",
    "creationTime": "2022-07-06T00:27:05.542459" 
    "id": "1234567",
    "engine": "WDL",
    "status": "ACTIVE",
    "type": "PRIVATE",
    "main": "workflow-crambam.wdl",
    "name": "workflow_name",
    "storageType": "STATIC",
    "storageCapacity": "1200",
    "uuid": "64c9a39e-8302-cc45-0262-2ea7116d854f"   
  }
```

상태가 로 전환된 후이 워크플로를 사용하여 실행을 시작할 수 있습니다`ACTIVE`.

# 워크플로 정의에서 게놈 파일 참조
<a name="create-ref-files"></a>

HealthOmics 참조 스토어 객체는 다음과 같은 URI를 사용하여 참조할 수 있습니다. 필요한 `reference ID` 경우 자체 `reference store ID`, 및 `account ID`를 사용합니다.

```
omics://account ID.storage.us-west-2.amazonaws.com/reference store id/reference/id            
```

일부 워크플로에는 참조 유전체에 대한 `SOURCE` 및 `INDEX` 파일이 모두 필요합니다. 이전 URI는 기본 짧은 양식이며 기본적으로 SOURCE 파일로 설정됩니다. 두 파일 중 하나를 지정하려면 다음과 같이 긴 URI 양식을 사용할 수 있습니다.

```
omics://account ID.storage.us-west-2.amazonaws.com/reference store id/reference/id/source
omics://account ID.storage.us-west-2.amazonaws.com/reference store id/reference/id/index
```

시퀀스 읽기 세트를 사용하면 다음과 같이 유사한 패턴을 갖게 됩니다.

```
aws omics create-workflow \
     --name workflow name \
     --main sample workflow.wdl \
     --definition-uri omics://account ID.storage.us-west-2.amazonaws.com/sequence_store_id/readSet/id \
     --parameter-template file://parameters_sample_description.json
```

FASTQ 기반 읽기 세트와 같은 일부 읽기 세트에는 페어링된 읽기가 포함될 수 있습니다. 다음 예제에서는 이를 SOURCE1 및 SOURCE2라고 합니다. BAM 및 CRAM과 같은 형식에는 SOURCE1 파일만 있습니다. 일부 읽기 세트에는 `bai` 또는 파일과 같은 INDEX `crai` 파일이 포함됩니다. 앞의 URI는 기본 짧은 양식이며 SOURCE1 파일로 기본 설정됩니다. 다음과 같이 긴 URI 양식을 사용하여 정확한 파일 또는 인덱스를 지정할 수 있습니다.

```
omics://123456789012.storage.us-west-2.amazonaws.com/<sequence_store_id>/readSet/<id>/source1
omics://123456789012.storage.us-west-2.amazonaws.com/<sequence_store_id>/readSet/<id>/source2
omics://123456789012.storage.us-west-2.amazonaws.com/<sequence_store_id>/readSet/<id>/index
```

다음은 두 개의 Omics Storage URIs.

```
{
   "input_fasta": "omics://123456789012.storage.us-west-2.amazonaws.com/<reference_store_id>/reference/<id>",
   "input_cram": "omics://123456789012.storage.us-west-2.amazonaws.com/<sequence_store_id>/readSet/<id>"
}
```

**시작 실행** 요청에를 AWS CLI 추가하여의 입력 JSON 파일을 참조`--inputs file://<input_file.json>`합니다.