

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 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 中建置和驗證工作流程定義檔案。如需詳細資訊，請參閱 GitHub [上 Amazon Q CLI 的範例提示](getting-started.md#omics-q-prompts)和 [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。**linter** 主題說明 HealthOmics 中可用的 linter。

**Topics**
+ [HealthOmics 工作流程與 Git 型儲存庫整合](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)

# HealthOmics 工作流程與 Git 型儲存庫整合
<a name="workflows-git-integration"></a>

當您建立工作流程 （或工作流程版本） 時，您會提供工作流程定義，以指定工作流程、執行和任務的相關資訊。HealthOmics 可以將工作流程定義擷取為 .zip 封存檔 （儲存在本機或 Amazon S3 儲存貯體中），或從支援的 Git 型儲存庫擷取。

HealthOmics 與 Git 型儲存庫整合可啟用下列功能：
+ 從公有、私有和自我管理執行個體直接建立工作流程。
+ 從 儲存庫整合工作流程 README 檔案和參數範本。
+ 支援 GitHub、GitLab 和 Bitbucket 儲存庫。

透過使用 Git 型儲存庫，您可以避免手動下載工作流程定義檔案和輸入參數範本檔案、建立 .zip 封存，然後將封存暫存到 S3。這可簡化案例的工作流程建立，例如下列範例：

1. 您想要使用常見的開放原始碼工作流程快速開始使用，例如 nf-core。HealthOmics 會自動從 GitHub 上的 nf 核心儲存庫擷取所有工作流程定義和輸入參數範本檔案，並使用這些檔案來建立新的工作流程。

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 使用此連線來存取您的原始碼儲存庫。

**注意**  
AWS CodeConnections 服務不適用於 il-central-1 區域。在此區域中，設定 service 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`之前，請確定連線狀態為 。

如需範例，請參閱部落格文章[如何從 Git 中的內容建立 AWS HealthOmics 工作流程](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 文件*中的[個人存取字符](https://docs.gitlab.com/user/profile/personal_access_tokens/)。

1. 建立主機

   1. 導覽至 **CodePipeline>Settings>Connections**。

   1. 選擇**主機**索引標籤，然後選擇**建立主機**。

   1. 設定下列欄位：
      + 輸入主機名稱
      + 針對提供者類型，選擇 **GitLab 自我管理**
      + 輸入**主機 URL** 
      + 如果在 VPC 中定義主機，請輸入 VPC 資訊

   1. 選擇**建立主機**，以建立處於待定狀態的主機。

   1. 若要完成設定，請選擇**設定主機**。

   1. 輸入管理員使用者的個人存取字符 (PAT)，然後選擇**繼續**。

1. 建立連線

   1. 在**連線索引標籤上選擇建立****連線**。

   1. 針對提供者類型，選取 **GitLab 自我管理**。

   1. 在**連線設定＞輸入連線名稱**下，輸入您先前建立的主機 URL。

   1. 如果您的 GitLab 自我管理執行個體只能透過 VPC 存取，請設定 VPC 詳細資訊。

   1. 選擇**更新待定連線**。模態視窗會將您重新導向至 GitLab 登入頁面。

   1. 輸入客戶帳戶的使用者名稱和密碼，並完成授權程序。

   1.  第一次設定時，請選擇**授權 Gitlab 自我管理的 AWS 連接器**。

## 與外部程式碼儲存庫相關的配額
<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>
  + 您的工作流程可以存取來自 AWS 資源的輸入資料，例如 Amazon S3。
  + 您的工作流程可以在需要時存取外部儲存庫服務。
+ 在工作流程定義中宣告輸出檔案。若要將中繼執行檔案複製到輸出位置，請將它們宣告為工作流程輸出。
+ 輸入和輸出位置必須與工作流程位於相同的區域。
+ HealthOmics 儲存工作流程輸入必須處於 `ACTIVE` 狀態。HealthOmics 不會匯入`ARCHIVED`狀態為 的輸入，導致工作流程失敗。如需 Amazon S3 物件輸入的資訊，請參閱 [HealthOmics 執行輸入](workflows-run-inputs.md)。
+ 如果您的 ZIP 封存包含單一工作流程定義或名為「主要」的檔案，則工作流程**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 不支援引擎產生的凹陷、追蹤和執行報告。您可以使用 GetRun 和 GetRunTask API 呼叫的組合來產生追蹤和執行報告的替代方案。

其他 CWL 考量事項：
+ **Container image uri interpolation**

  HealthOmics 允許 DockerRequirement 的 dockerPull 屬性成為內嵌 javascript 表達式。 DockerRequirement 例如：

  ```
  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 通常會每六個月發行一個穩定的版本。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 v23 遷移到 v24 時有一些重大變更，如 Nextflow 遷移指南的以下章節所述：
+ [ 中斷 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，HealthOmics 會執行 Nextflow v23.10.0，除非您指定 Nextflow v22.04.0 或 v24.10.8。
+ 如果您指定 DSL 1，HealthOmics 會執行 Nextflow v22.04 DSL1 （唯一支援執行 DSL 1 的版本）。
+ 如果您未指定 DSL 版本，或者 HealthOmics 因任何原因無法剖析 DSL 資訊 （例如工作流程定義檔案中的語法錯誤），HealthOmics 會預設為 DSL 2 並執行 Nextflow v23.10.0。
+ 若要將工作流程從 DSL 1 升級到 DSL 2，以利用最新的 Nextflow 版本和軟體功能，請參閱[從 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 會引發例外狀況，並使執行失敗。如果您想要嚴格處理版本請求，請考慮使用此選項，如果請求包含不支援的版本，則快速失敗。
+ 如果您指定某個版本範圍，HealthOmics 會使用該範圍中最新的支援版本，除非該範圍包含 v24.10.8。在此情況下，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 操作的回應包含欄位 (`engineVersion`)，其中包含 HealthOmics 用於執行的實際 Nextflow 版本。例如：

  ```
  "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 會配置最小的 omics 執行個體，以容納請求的記憶體和 vCPUs。例如，如果任務需要 64 GiB 的記憶體和 8 vCPUs，HealthOmics 會選取 `omics.r.2xlarge`。

我們建議您檢閱執行個體類型，並設定請求vCPUs 和記憶體大小，以符合最符合您需求的執行個體。任務容器會使用您在工作流程定義檔案中指定的 vCPUs 數量和記憶體大小，即使執行個體類型具有額外的 vCPUs和記憶體。

下列清單包含有關 vCPU 和記憶體配置的其他資訊：
+ 容器資源配置是硬性限制。如果任務用盡記憶體或嘗試使用其他 vCPUs任務會產生錯誤日誌並結束。
+ 如果您未指定任何運算或記憶體需求，HealthOmics 會選取**omics.c.large**並預設為具有 1 個 vCPU 和 1 GiB 記憶體的組態。
+ 您可以請求的最小組態為 1 個 vCPU 和 1 GiB 的記憶體。
+ 如果您指定的 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)

**注意**  
 對於標準、運算和記憶體最佳化執行個體，如果執行個體需要更高的輸送量，請增加執行個體頻寬大小。少於 16 個 vCPUs 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 執行個體：美國西部 （奧勒岡） 和美國東部 （維吉尼亞北部）。


| 執行個體 | vCPUs數量 | 記憶體 | 
| --- | --- | --- | 
| omics.m.large | 2 | 8 GiB | 
| omics.m.xlarge | 4 | 16 GiB | 
| omics.m.2xlarge | 8 | 32 GiB | 
| omics.m.4xlarge | 16 | 64 GiB | 
| omics.m.8xlarge | 32 | 128 GiB | 
| omics.m.12xlarge | 48 | 192 GiB | 
| omics.m.16xlarge | 64 | 256 GiB | 
| omics.m.24xlarge | 96 | 384 GiB | 
| omics.m.32xlarge | 128 | 512 GiB | 
| omics.m.48xlarge | 192 | 768 GiB | 

## 運算最佳化執行個體
<a name="workflow-task-compute-optimized-instances"></a>

對於運算最佳化執行個體類型，組態具有更多的運算能力和更少的記憶體。

HealthOmics 支援這些區域中的 32xlarge 和 48xlarge 執行個體：美國西部 （奧勒岡） 和美國東部 （維吉尼亞北部）。


| 執行個體 | vCPUs數量 | 記憶體 | 
| --- | --- | --- | 
| omics.c.large | 2 | 4 GiB | 
| omics.c.xlarge | 4 | 8 GiB | 
| omics.c.2xlarge | 8 | 16 GiB | 
| omics.c.4xlarge | 16 | 32 GiB | 
| omics.c.8xlarge | 32 | 64 GiB | 
| omics.c.12xlarge | 48 | 96 GiB | 
| omics.c.16xlarge | 64 | 128 GiB | 
| omics.c.24xlarge | 96 | 192 GiB | 
| omics.c.32xlarge | 128 | 256 GiB | 
| omics.c.48xlarge | 192 | 384 GiB | 

## 記憶體最佳化執行個體
<a name="workflow-task-memory-optimized-instances"></a>

對於記憶體最佳化執行個體類型，組態具有較少的運算能力和更多記憶體。

HealthOmics 支援這些區域中的 32xlarge 和 48xlarge 執行個體：美國西部 （奧勒岡） 和美國東部 （維吉尼亞北部）。


| 執行個體 | vCPUs數量 | 記憶體 | 
| --- | --- | --- | 
| omics.r.large | 2 | 16 GiB | 
| omics.r.xlarge | 4 | 32 GiB | 
| omics.r.2xlarge | 8 | 64 GiB | 
| omics.r.4xlarge | 16 | 128 GiB | 
| omics.r.8xlarge | 32 | 256 GiB | 
| omics.r.12xlarge | 48 | 384 GiB | 
| omics.r.16xlarge | 64 | 512 GiB | 
| omics.r.24xlarge | 96 | 768 GiB | 
| omics.r.32xlarge | 128 | 1024 GiB | 
| omics.r.48xlarge | 192 | 1536 GiB | 

## 加速運算執行個體
<a name="workflow-task-accelerated-computing-instances"></a>

您可以選擇性地為工作流程中的每個任務指定 GPU 資源，以便 HealthOmics 為任務配置加速運算執行個體。如需如何在工作流程定義檔案中指定 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 執行個體：美國西部 （奧勒岡） 和美國東部 （維吉尼亞北部）。


| 執行個體 | vCPUs數量 | 記憶體 | GPUs 數量 | 記憶體 | 
| --- | --- | --- | --- | --- | 
| omics.g6.xlarge | 4 | 16 GiB | 1 | 24 GiB | 
| omics.g6.2xlarge | 8 | 32 GiB | 1 | 24 GiB | 
| omics.g6.4xlarge | 16 | 64 GiB | 1 | 24 GiB | 
| omics.g6.8xlarge | 32 | 128 GiB | 1 | 24 GiB | 
| omics.g6.12xlarge | 48 | 192 GiB | 4 | 96 GiB | 
| omics.g6.16xlarge | 64 | 256 GiB | 1 | 24 GiB | 
| omics.g6.24xlarge | 96 | 384 GiB | 4 | 96 GiB | 

所有 omics.g6e 執行個體都使用 Nvidia L40s GPUs。


| 執行個體 | vCPUs數量 | 記憶體 | GPUs 數量 | 記憶體 | 
| --- | --- | --- | --- | --- | 
| omics.g6e.xlarge | 4 | 32 GiB | 1 | 48 GiB | 
| omics.g6e.2xlarge | 8 | 64 GiB | 1 | 48 GiB | 
| omics.g6e.4xlarge | 16 | 128 GiB | 1 | 48 GiB | 
| omics.g6e.8xlarge | 32 | 256 GiB | 1 | 48 GiB | 
| omics.g6e.12xlarge | 48 | 384 GiB | 4 | 192 GiB | 
| omics.g6e.16xlarge | 64 | 512 GiB | 1 | 48 GiB | 
| omics.g6e.24xlarge | 96 | 768 GiB | 4 | 192 GiB | 

### G4 和 G5 執行個體
<a name="workflow-task-accelerated-accelerated-g45"></a>

HealthOmics 支援下列 G4 和 G5 加速運算執行個體組態。

所有 omics.g5 執行個體都使用 Nvidia Tesla A10G GPUs。


| 執行個體 | vCPUs數量 | 記憶體 | GPUs 數量 | 記憶體 | 
| --- | --- | --- | --- | --- | 
| omics.g5.xlarge | 4 | 16 GiB | 1 | 24 GiB | 
| omics.g5.2xlarge | 8 | 32 GiB | 1 | 24 GiB | 
| omics.g5.4xlarge | 16 | 64 GiB | 1 | 24 GiB | 
| omics.g5.8xlarge | 32 | 128 GiB | 1 | 24 GiB | 
| omics.g5.12xlarge | 48 | 192 GiB | 4 | 96 GiB | 
| omics.g5.16xlarge | 64 | 256 GiB | 1 | 24 GiB | 
| omics.g5.24xlarge | 96 | 384 GiB | 4 | 96 GiB | 

所有 omics.g4dn 執行個體都使用 Nvidia Tesla T4 GPUs。


| 執行個體 | vCPUs數量 | 記憶體 | GPUs 數量 | 記憶體 | 
| --- | --- | --- | --- | --- | 
| omics.g4dn.xlarge | 4 | 16 GiB | 1 | 16 GiB | 
| omics.g4dn.2xlarge | 8 | 32 GiB | 1 | 16 GiB | 
| omics.g4dn.4xlarge | 16 | 64 GiB | 1 | 16 GiB | 
| omics.g4dn.8xlarge | 32 | 128 GiB | 1 | 16 GiB | 
| omics.g4dn.12xlarge | 48 | 192 GiB | 4 | 64 GiB | 
| omics.g4dn.16xlarge | 64 | 256 GiB | 1 | 24 GiB | 

# 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>

此範例會建立名為 的任務`SayHello`，將 STDOUT 內容回應至任務輸出檔案。WDL **stdout**函數會擷取檔案 中的 STDOUT 內容 （在此範例中為 **Hello World！** 輸入字串）**stdout\$1file**。

由於 HealthOmics 會為所有 STDOUT 內容建立日誌，因此輸出也會出現在 CloudWatch Logs 中，以及任務的其他 STDERR 記錄資訊。

```
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>

此範例會建立名為 的任務`SayHello`，將 STDERR 內容回應至任務輸出檔案。WDL **stderr**函數會擷取檔案 中的 STDERR 內容 （在此範例中為 **Hello World！** 輸入字串）**stderr\$1file**。

由於 HealthOmics 會為所有 STDERR 內容建立日誌，因此輸出會出現在 CloudWatch Logs 中，以及任務的其他 STDERR 記錄資訊。

```
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！**。

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

`outputs` 指令指定輸出名稱為 ，**example\$1out**其類型為 `stdout`。若要讓下游任務消耗此任務的輸出，它會將輸出稱為 `example_out`。

由於 HealthOmics 會為所有 STDERR 和 STDOUT 內容建立日誌，因此輸出也會出現在 CloudWatch Logs 中，以及任務的其他 STDERR 日誌記錄資訊。

```
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**。任務會修改 ，`baseCommand`讓 `echo`寫入 STDERR （而非 STDOUT)。

`outputs` 指令指定輸出名稱為 ，**stderr\$1out**其類型為 `stderr`。

由於 HealthOmics 會為所有 STDERR 和 STDOUT 內容建立日誌，因此輸出會出現在 CloudWatch Logs 中，以及任務的其他 STDERR 日誌記錄資訊。

```
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 會針對因服務錯誤而失敗的任務嘗試最多兩次重試 (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 支援下列加速器規格值，以及支援的執行個體類型：


| 加速器規格 | 運作狀態執行個體類型 | 
| --- | --- | 
| 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)清單中下列項目的類型轉換：
+ 浮動至 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。

在 主控台中，工作流程引擎參數名為**語言**。在 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 中，因此您需要將 version development新增至 WDL 檔案的 標頭。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 | N/A | N/A | N/A | WDL Object類型已過期，Struct應該在所有情況下取代為 。 | 

## WDL 中的指令
<a name="workflow-wdl-directives"></a>

HealthOmics 在 HealthOmics 支援的所有 WDL 版本中支援下列指令。

### 設定 GPU 資源
<a name="workflow-wdl-directive-gpu"></a>

HealthOmics 支援執行期屬性**acceleratorType****acceleratorCount**，以及所有支援的 [GPU 執行個體](https://docs.aws.amazon.com/omics/latest/dev/task-accelerators.html)。HealthOmics 也支援名為 **gpuType**和 的別名**gpuCount**，其功能與其加速器相同。如果 WDL 定義包含兩個指令，HealthOmics 會使用加速器值。

下列範例示範如何使用這些指令：

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

### 設定任務重試是否有服務錯誤
<a name="workflow-wdl-task-retry"></a>

HealthOmics 最多可為因服務錯誤 (5XX HTTP 狀態碼） 而失敗的任務支援兩次重試。您可以設定重試次數上限 (1 或 2)，也可以選擇不重試服務錯誤。根據預設，HealthOmics 最多會嘗試兩次重試。

下列範例會設定 `preemptible`以選擇不重試服務錯誤：

```
{
  preemptible: 0 
}
```

如需 HealthOmics 中任務重試的詳細資訊，請參閱 [任務重試](monitoring-runs.md#run-status-task-retries)。

### 設定記憶體不足的任務重試
<a name="workflow-wdl-retries"></a>

HealthOmics 支援因記憶體不足而失敗的任務重試 （容器結束碼 137、4XX HTTP 狀態碼）。HealthOmics 會將每次重試嘗試的記憶體量加倍。

根據預設，HealthOmics 不會針對此類型的失敗重試。使用 `maxRetries`指令來指定重試次數上限。

下列範例會將 `maxRetries`設為 3，讓 HealthOmics 嘗試完成任務最多四次 （初次嘗試加上三次重試）：

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

**注意**  
記憶體不足的任務重試需要 GNU findutils 4.2.3\$1。預設 HealthOmics 映像容器包含此套件。如果您在 WDL 定義中指定自訂映像，請確定映像包含 GNU findutils 4.2.3\$1。

### 設定傳回碼
<a name="workflow-wdl-directive-returnCodes"></a>

**returnCodes** 屬性提供指定傳回碼或一組傳回碼的機制，表示任務成功執行。WDL 引擎會遵守您在 WDL 定義**執行時間**區段中指定的傳回代碼，並相應地設定任務狀態。

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

HealthOmics 也支援名為 **continueOnReturnCode** 的別名，其功能與 **returnCodes** 相同。如果您指定這兩個屬性，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 `CRAM``BAM`中從 轉換為 的私有工作流程定義。`CRAM` 工作流程的 `BAM`定義了兩個任務，並使用來自 `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 模式。在工作流程定義中使用 Glob 模式來建立 `path`或 `file`頻道。如需預期的行為和確切案例，請參閱 [Amazon S3 輸入中 Glob 模式的下一個流程處理](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`指令來定義任務錯誤的策略。根據預設，當任務傳回錯誤指示 （非零結束狀態） 時，任務會停止，且 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`。若要增加重試次數上限，請將 `errorStrategy`設定為 `retry`，並使用 `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，如果任務因服務錯誤 (5XX HTTP 狀態碼） 失敗，HealthOmics 支援任務重試。根據預設，HealthOmics 最多會嘗試兩次失敗任務的重試。

您可以設定 `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. 在任務逾時時，HealthOmics 會將執行和任務狀態設定為失敗，並取消執行中的其他任務 （適用於處於啟動、待定或執行狀態的任務）。HealthOmics 從逾時前完成的任務匯出輸出至您指定的 S3 輸出位置。

1. 任務花費在待定狀態的時間不會計入任務持續時間。

1. 如果執行是執行群組的一部分，且執行群組比任務計時器快逾時，則執行和任務會轉換為失敗狀態。

使用下列一或多個單位指定逾時持續時間：`ms`、`m``h`、 `s`或 `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**
+ [將 CWL 工作流程轉換為使用 HealthOmics](#workflow-cwl-convert)
+ [使用 選擇退出任務重試 `omicsRetryOn5xx`](#workflow-cwl-retry-5xx)
+ [循環工作流程步驟](#workflow-cwl-loop)
+ [重試記憶體增加的任務](#workflow-cwl-out-of-memory-retry)
+ [範例](#workflow-cwl-examples)

## 將 CWL 工作流程轉換為使用 HealthOmics
<a name="workflow-cwl-convert"></a>

若要將現有的 CWL 工作流程定義轉換為使用 HealthOmics，請進行下列變更：
+ 將所有 Docker 容器 URIs取代為 Amazon ECR URIs。
+ 請確保在主要工作流程中將所有工作流程檔案宣告為輸入，並明確定義所有變數。
+ 確保所有 JavaScript 程式碼都是嚴格模式投訴。

## 使用 選擇退出任務重試 `omicsRetryOn5xx`
<a name="workflow-cwl-retry-5xx"></a>

如果任務因服務錯誤 (5XX HTTP 狀態碼） 失敗，HealthOmics 支援任務重試。根據預設，HealthOmics 最多會嘗試兩次失敗任務的重試。如需 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 次，或直到記憶體配置達到 1536 GiB，以先達到者為準。

下列範例示範如何設定out-of-memory重試：

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

當任務因out-of-memory而失敗時，HealthOmics 會使用公式計算重試記憶體配置：`previous_run_memory × memoryRetryMultiplier`。在上述範例中，如果具有 4096 MB 記憶體的任務失敗，重試嘗試會使用 4096 × 2.5 = 10，240 MB 記憶體。

`memoryRetryMultiplier` 參數控制要為重試嘗試配置多少額外記憶體：
+ **預設值：**如果您未指定值，則預設為 `2`（記憶體的兩倍）
+ **有效範圍：**必須是大於 的正數`1`。無效值會導致 4XX 驗證錯誤
+ **最低有效值：** `1` 和 之間的值`1.5`會自動增加到 `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)"
```

以下是以 CWL 撰寫且具有 GPU 需求的工作流程範例。

```
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 插補範例。


| 輸入 | 輸入/輸出範例 | 必要 | 
| --- | --- | --- | 
| Int x | 1 或 2 或 ... | 是 | 
| Int x = 2 | 2 | 否 | 
| Int x = 1\$12 | 3 | 否 | 
| Int x = y\$1z | y\$1z | 否 | 
| Int？ x | 無 或 1 或 2 或 ... | 是 | 
| Int？ x = 2 | 無或 2 | 否 | 
| Int？ x = 1\$12 | 無或 3 | 否 | 
| Int？ x = y\$1z | 無或 y\$1z | 否 | 

下表顯示複雜類型的 WDL 插補範例。複雜類型是基本類型的集合。


| 輸入 | 輸入/輸出範例 | 必要 | 
| --- | --- | --- | 
| Array【Int】 x | 【1，2，3】 或 【】 | 是 | 
| Array【Int】\$1 x | 【1】，但不是 【】 | 是 | 
| Array【Int】？ x | 無 或 【】 或 【1，2，3】 | 否 | 
| Array【Int？】 x | 【】 或 【無、3、無】 | 是 | 
| Array【Int？】=？ x | 【無】 或 無 或 【1，2，3】 或 【無，3】 但 【】 | 否 | 
| 結構範例 \$1String a， Int y\$1 稍後在輸入中：mySample 範例  |  <pre>String a = mySample.a<br />   Int y = mySample.y</pre>  | 是 | 
| 結構範例 \$1String a， Int y\$1 稍後在輸入中：Sample？ 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，如下列任一結構描述所定義：
  + https：//[json-schema.org/draft/2020-12/schema](https://json-schema.org/draft/2020-12/schema)。
  + https：//[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 Public
+ Kubernetes 容器映像登錄檔
+ Quay
+ Docker Hub 
+ Microsoft Azure Container Registry
+ GitHub Container Registry 
+ 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：//https://console.aws.amazon.com/ecr

1. 在左側選單的**私有登錄**檔下，展開**功能和設定**。然後選擇**提取快取**。

1. 從**提取快取**頁面中，選擇**新增規則**。

1. 在**上游登錄**檔面板中，選擇要與您的私有登錄檔同步的上游登錄檔，然後選擇**下一步**。

1. 如果上游登錄檔需要身分驗證，主控台會開啟新頁面，您可以在其中指定包含登入資料的 SageMaker AI 秘密。選擇**下一步**。

1. 在**指定命名空間**下，在**快取命名空間**面板中，選擇使用特定儲存庫字首或沒有字首來建立私有儲存庫。如果您選擇使用字首，請在**快取儲存庫字首中指定字首**名稱。

1. 在**上游命名空間**面板中，選擇使用特定儲存庫字首或無字首從上游儲存庫提取。如果您選擇使用字首，請在**上游儲存庫字首中指定字首**名稱。

   **命名空間範例**面板顯示提取請求、上游 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 Public
<a name="ecr-ptc-cli-public-ecr"></a>

下列範例會為 Amazon ECR Public 登錄檔建立提取快取規則。其會指定 `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 Resource Name (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 Container Registry 的提取快取規則。其會指定 `github` 的儲存庫字首，這會導致使用提取快取規則建立的每個儲存庫具有 `github/upstream-repository-name` 的命名規則。您必須指定秘密包含 GitHub Container Registry 憑證的完整 Amazon Resource Name (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 Container Registry
<a name="ecr-ptc-cli-azure"></a>

下列範例會建立 Microsoft Azure Container Registry 的提取快取規則。其會指定 `azure` 的儲存庫字首，這會導致使用提取快取規則建立的每個儲存庫具有 `azure/upstream-repository-name` 的命名規則。您必須指定秘密包含 Microsoft Azure Container Registry 憑證的完整 Amazon Resource Name (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 Container Registry 的提取快取規則。其會指定 `gitlab` 的儲存庫字首，這會導致使用提取快取規則建立的每個儲存庫具有 `gitlab/upstream-repository-name` 的命名規則。您必須指定包含 GitLab Container Registry 登入資料之秘密的完整 Amazon Resource Name (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>
+ Architecture

  HealthOmics 支援 x86\$164 容器。如果您的本機機器以 ARM 為基礎，例如 Apple Mac，請使用下列命令來建置 x86\$164 容器映像：

  ```
  docker build --platform amd64 -t my_tool:latest .
  ```
+ 進入點和 shell

  HealthOmics 工作流程引擎會將 bash 指令碼做為命令覆寫注入工作流程任務所使用的容器映像。因此，應該在沒有指定 ENTRYPOINT 的情況下建置容器映像，使得 bash shell 為預設值。
+ 掛載路徑

  共用檔案系統掛載到位於 /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>

如果工作流程任務使用 Java 應用程式，例如 GATK，請考慮容器的下列記憶體需求：
+ Java 應用程式使用堆疊記憶體和堆積記憶體。根據預設，堆積記憶體上限是容器中可用記憶體總數的百分比。此預設值取決於特定的 JVM 分佈和 JVM 版本，因此請參閱 JVM 的相關文件，或使用 Java 命令列選項 （例如 `-Xmx`) 明確設定堆積記憶體上限。
+ 請勿將堆積記憶體上限設定為容器記憶體配置的 100%，因為 JVM 堆疊也需要記憶體。JVM 垃圾收集器和容器內執行的任何其他作業系統程序也需要記憶體。
+ 有些 Java 應用程式，例如 GATK，可以使用原生方法叫用或其他最佳化，例如記憶體映射檔案。這些技術需要執行「關閉堆積」的記憶體配置，這些配置不受 JVM 最大堆積參數控制。

  如果您知道 （或懷疑） Java 應用程式配置堆積外記憶體，請確定任務記憶體配置包含堆積外記憶體需求。

  如果這些堆積外配置導致容器耗盡記憶體，您通常不會看到 Java **OutOfMemory**錯誤，因為 JVM 無法控制此記憶體。

## 將任務輸入新增至 Amazon ECR 容器映像
<a name="ecr-tasks"></a>

將執行工作流程任務所需的所有可執行檔、程式庫和指令碼新增至用於執行任務的 Amazon ECR 映像。

最佳實務是避免使用任務容器映像外部的指令碼、二進位檔和程式庫。這在使用將`bin`目錄做為`nf-core`工作流程套件一部分的工作流程時特別重要。雖然此目錄可供工作流程任務使用，但會掛載為唯讀目錄。此目錄中的必要資源應複製到任務映像中，並在執行時間或建置用於任務的容器映像時提供。

[HealthOmics 工作流程固定大小配額](fixed-quotas.md#fixed-quotas-workflows) 如需 HealthOmics 支援的容器映像大小上限，請參閱 。

# HealthOmics 工作流程 README 檔案
<a name="workflows-readme"></a>

您可以上傳 README.md 檔案，其中包含工作流程的指示、圖表和重要資訊。每個工作流程版本都支援一個 README 檔案，您可以隨時更新。

**README 要求包括：**
+ README 檔案必須為 Markdown (.md) 格式
+ 檔案大小上限：500 KiB

**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 檢視支援的 Markdown 元素。


| Element | AWS 主控台 | 
| --- | --- | 
| Alerts (提醒) | 是，但沒有圖示 | 
| 徽章 | 是 | 
| 基本文字格式 | 是 | 
| [程式碼區塊](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) | 是 | 
| 美人魚圖 | 只有 可以開啟圖形、移動圖形位置和複製程式碼 | 
| 報價 | 是 | 
| [下標](https://www.markdownguide.org/extended-syntax/#subscript)和[上標](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 | 

GitHubGitLab、 和 Bitbucket支援連結至公有儲存庫的頁面和映像 URLs。下表顯示每個來源提供者對私有儲存庫轉譯映像和連結 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 授權伺服器代理。
  + 若要建立支援案例，請導覽至 [ https：//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>

建立工作流程之後，建議您先在工作流程上執行 linter，再開始第一次執行。linter 偵測到可能導致執行失敗的錯誤。

對於 WDL，HealthOmics 會在您建立工作流程時自動執行 linter。回應的 `statusMessage` 欄位提供 linter 輸出**get-workflow**。使用下列 CLI 命令擷取狀態輸出 （使用您建立之 WDL 工作流程的工作流程 ID)：

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

HealthOmics 提供 linter，您可以在建立工作流程之前在工作流程棄用上執行。在您要遷移至 HealthOmics 的現有管道上執行這些文字。
+ **WDL** – 執行 [WDL linter](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) 存取此 linter 的原始碼。
+ **CWL** – 無法使用

# HealthOmics 工作流程操作
<a name="creating-private-workflows"></a>

若要建立私有工作流程，您需要：
+  **Workflow definition file:** 以 WDL、 Nextflow或 編寫的工作流程定義檔案CWL。工作流程定義會指定使用工作流程之執行的輸入和輸出。它還包含工作流程執行和執行任務的規格，包括運算和記憶體需求。工作流程定義檔案必須為 `.zip` 格式。如需詳細資訊，請參閱 HealthOmics 中的[工作流程定義檔案](workflow-definition-files.md)。
  + 您可以使用 [Amazon Q CLI](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/what-is.html) 在 WDL、Nextflow 和 CWL 中建置和驗證工作流程定義檔案。如需詳細資訊，請參閱 GitHub [上 Amazon Q CLI 的範例提示](getting-started.md#omics-q-prompts)和 [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軟體。

對於大於 4 MiB （壓縮） 的工作流程定義檔案，請在工作流程建立期間選擇下列其中一個選項：
+ 上傳至 Amazon Simple Storage Service 資料夾並指定位置。
+ 上傳至外部儲存庫 （大小上限為 1 GiB)，並指定儲存庫詳細資訊。

建立工作流程之後，您可以使用 `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 儲存貯體中的 .zip 封存檔，或從支援的 Git 型儲存庫擷取。

**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-managedGitLab 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`檔案的檔案路徑。如果工作流程定義資料夾中只有一個檔案，或主要檔案名為「主要」，則不需要此參數。

1. 在 **README 檔案** （選用） 面板中，選取 **README 檔案的來源**，並提供下列資訊：
   + 對於**從儲存庫服務匯入**，在 **README 檔案路徑**中，輸入儲存庫中 README 檔案的路徑。
   + 針對**從 S3 選取檔案**，在 ** S3 的 README 檔案中**，輸入 README 檔案的 Amazon S3 URI。
   + 對於**從本機來源選取檔案**：在 **README - 選用**中，選擇**選擇檔案**以選取要上傳的 Markdown (.md) 檔案。

1. 在**預設執行儲存組態**面板中，為使用此工作流程的執行提供預設執行儲存類型和容量：

   1. **執行儲存體類型**：選擇是否使用靜態或動態儲存體做為暫時執行儲存體的預設值。預設為靜態儲存。

   1. **執行儲存容量** （選用）：對於靜態執行儲存類型，您可以輸入此工作流程所需的預設執行儲存量。此參數的預設值為 1200 GiB。您可以在開始執行時覆寫這些預設值。

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)
+ [指定讀我檔案](#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** – Code Connection 的 ARN，可將您的 AWS 資源連線至外部儲存庫。
+ **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" \
```

如需更多範例，請參閱部落格文章[如何從 Git 中的內容建立 AWS HealthOmics 工作流程](https://repost.aws/articles/ARCEN7AjhaRSmteczRoc_QsA/how-to-create-an-aws-healthomics-workflows-from-content-in-git)。

#### 指定讀我檔案
<a name="specify-readme-file"></a>

您可以使用下列其中一個參數來指定 README 檔案位置：
+ **readme-markdown** – 字串輸入或本機電腦上的檔案。
+ **readme-uri** – 存放在 S3 上的檔案的 URI。
+ **readme-path ** – 儲存庫中 README 檔案的路徑。

僅使用 readme-path 搭配 **definition-respository**。如果您未指定任何 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 命令來刪除工作流程。若要執行範例，`workflow id`請以您要刪除的工作流程 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 檔案。有些讀取集將包含 INDEX 檔案，例如 `bai`或 `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 儲存 URIs 的輸入 JSON 檔案範例。

```
{
   "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>"
}
```

將 `--inputs file://<input_file.json>`新增至您的**開始執行**請求 AWS CLI ，以參考 中的輸入 JSON 檔案。