

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在中创建私有工作流程 HealthOmics
<a name="workflows-setup"></a>

*私有工作流程*取决于您在创建工作流程之前创建和配置的各种资源：
+ **Workflow definition file:**用WDL、Nextflow或写入的工作流程定义文件CWL。工作流定义为使用该工作流的运行指定输入和输出。它还包括工作流程的运行和运行任务规范，包括计算和内存要求。工作流程定义文件必须采用`.zip`格式。有关更多信息，请参阅[工作流程定义文件](workflow-definition-files.md)。
  + 您可以使用 [Amazon Q CLI](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/what-is.html) 在 WDL、Nextflow 和 CWL 中构建和验证您的工作流程定义文件。有关更多信息，请参阅 [Amazon Q CLI 的示例提示](getting-started.md#omics-q-prompts)和上 GitHub的 A [HealthOmics gentic 生成人工智能教程](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**主题描述了中可用的linter。 HealthOmics

**Topics**
+ [HealthOmics 与基于 Git 的存储库的工作流程集成](workflows-git-integration.md)
+ [中的工作流程定义文件 HealthOmics](workflow-definition-files.md)
+ [HealthOmics 工作流程的参数模板文件](parameter-templates.md)
+ [私有工作流程的容器镜像](workflows-ecr.md)
+ [HealthOmics 工作流程自述文件](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 的存储库中检索。

与基于 Git 的存储库的 HealthOmics 集成支持以下功能：
+ 直接从公共、私有和自行管理的实例创建工作流程。
+ 集成存储库中的工作流程自述文件和参数模板。
+ 支持 GitHub GitLab、和 Bitbucket 存储库。

通过使用基于 Git 的存储库，您可以避免手动步骤，例如下载工作流程定义文件和输入参数模板文件、创建.zip 存档，然后将存档暂存到 S3。这简化了以下示例等场景的工作流程创建：

1. 您想使用常见的开源工作流程（例如 nf-core）快速入门。 HealthOmics自动从 nf-core 存储库中检索所有工作流程定义和输入参数模板文件， GitHub 并使用这些文件创建新的工作流程。

1. 您正在使用来自的公共工作流程 GitHub，并且有一些新的更新可用。您可以使用更新的 HealthOmics 工作流程定义 GitHub 作为源来轻松创建新的工作流程版本。您的工作流程的用户可以在原始工作流程或您创建的新工作流程版本之间进行选择。

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 将您的工作流程连接到基于 Git 的存储库。 CodeConnection HealthOmics 使用此连接访问您的源代码存储库。

**注意**  
AWS CodeConnections 服务不在 il-central-1 区域提供。对于此区域，请将服务 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>设置>连接**。

   1. 选择 “**主机**” 选项卡，然后选择 “**创建主机**”。

   1. 配置以下字段：
      + 输入主机的名称
      + 对于提供商类型，请选择**GitLab 自我管理**
      + 输入**主机 URL** 
      + 如果主机是在 VPC 中定义的，请输入 VPC 信息

   1. 选择**创建主机**，这将创建处于 PENDING 状态的主机。

   1. 要完成设置，请选择**设置主机**。

   1. 输入管理员用户的个人访问令牌 (PAT)，然后选择**继续**。

1. 创建连接

   1. 在 “**连接” 选项卡上选择 “创建****连接**”。

   1. 对于提供商类型，请选择**GitLab 自我管理**。

   1. 在 “**连接设置” > “输入连接名称**” 下，输入您之前创建的主机 URL。

   1. 如果您的 GitLab 自管理实例只能通过 VPC 访问，请配置 VPC 详细信息。

   1. 选择 “**更新待处理的连接**”。模态窗口将您重定向到 GitLab 登录页面。

   1. 输入客户账户的用户名和密码并完成授权过程。

   1.  首次设置时，请选择 “**授权 AWS Connector 用于 Gitlab 自助管理**”。

## 与外部代码存储库相关的配额
<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 中的隐式类型转换](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 流定义文件必须满足以下要求：
+ 任务必须定义 input/output 参数、Amazon ECR 容器存储库和运行时规范，例如内存或 CPU 分配。
+ 验证您的 IAM 角色是否具有所需的权限。<a name="lower"></a>
  + 您的工作流程可以访问来自 AWS 资源（例如 Amazon S3）的输入数据。
  + 您的工作流程可以在需要时访问外部存储库服务。
+ 在工作流程定义中声明输出文件。要将中间运行文件复制到输出位置，请将其声明为工作流程输出。
+ 输入和输出位置必须与工作流程位于同一区域。
+ HealthOmics 存储工作流输入必须处于`ACTIVE`状态。 HealthOmics 不会导入带有`ARCHIVED`状态的输入，从而导致工作流程失败。有关 Amazon S3 对象输入的信息，请参阅[HealthOmics 运行输入](workflows-run-inputs.md)。
+ 如果您的 ZIP 存档包含单个工作流程定义或名为 “main” 的文件，则工作流程的**main**位置是可选的。<a name="lower"></a>
  + 路径示例：`workflow-definition/main-file.wdl`
+ 在通过 Amazon S3 或本地驱动器创建工作流程之前，请创建包含工作流程定义文件和任何依赖项（例如子工作流程）的 zip 存档。
+ 我们建议您在工作流程中声明 Amazon ECR 容器作为验证亚马逊 ECR 权限的输入参数。

Nextflow 的其他
+ **/bin**

  Nextflow 工作流程定义可能包括带有可执行脚本的 /bin 文件夹。此路径对任务具有只读权限和可执行访问权限。依赖这些脚本的任务应使用由相应脚本解释器构建的容器。最佳做法是直接给口译员打电话。例如：

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

  基于 NextFlow 的工作流程定义可以包括有助于抽象参数定义或流程资源配置文件的 nextflow.config 文件。要支持在多个环境中开发和执行 Nextflow 管道，请使用 HealthOmics特定的配置，使用 includeConfig 指令将其添加到全局配置中。要保持可移植性，请使用以下代码将工作流程配置为仅在 HealthOmics 运行时包含文件：

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

  HealthOmics 不支持引擎生成的 dag、跟踪和执行报告。您可以使用和 GetRunTask API 调用的组合生成跟踪报告 GetRun 和执行报告的替代方案。

其他 CWL 注意事项：
+ **Container image uri interpolation**

  HealthOmics 允许的 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 支持 WDL 规范的 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)，请按照 [Next](https://nextflow.io/docs/latest/migrations/24-10.html) flow 升级指南进行操作。

从 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)。

#### 下一流版本
<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，则选择 v23.10.0。 HealthOmics 
+ 如果没有请求的版本，或者请求的版本无效或由于任何原因无法解析：
  + 如果你指定了 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/)页面。

对于工作流中的任务，您可以在工作流定义文件CPUs 中指定所需的内存和 v。当工作流任务运行时， HealthOmics 分配最小的组学实例，以容纳请求的内存和 v. CPUs 例如，如果任务需要 64 GiB 内存和 8 vCPUs， HealthOmics 则选择。`omics.r.2xlarge`

我们建议您查看实例类型并设置请求的 v CPUs 和内存大小，使其与最能满足您需求的实例相匹配。即使实例类型有额外的 v CPUs 和内存，任务容器也会使用您在工作流程定义文件中指定的数量CPUs 和内存大小。

以下列表包含有关 vCPU 和内存分配的其他信息：
+ 容器资源分配是硬性限制。如果任务内存不足或尝试使用其他 vCPUs ，则该任务会生成错误日志并退出。
+ 如果您未指定任何计算或内存要求，请 HealthOmics 选择**omics.c.large**并默认为具有 1 个 vCPU 和 1 GiB 内存的配置。
+ 您可以请求的最低配置为 1 个 vCPU 和 1 GiB 的内存。
+ 如果您指定 v CPUs、memory 或 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)

**注意**  
 对于标准、计算和内存优化型实例，如果实例需要更高的吞吐量，请增加实例带宽大小。vCPU 少于 16 个（大小为 4xl 及更小）的 Amazon EC2 实例可能会出现吞吐量激增的情况。有关 Amazon EC2 实例吞吐量的更多信息，请参阅 [Amazon EC2 可用实例带宽](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-network-bandwidth.html#available-instance-bandwidth)。

## 标准实例类型
<a name="workflow-task-standard-instances"></a>

对于标准实例类型，配置旨在平衡计算能力和内存。

HealthOmics 支持以下区域的 32xlarge 和 48xlarge 实例：美国西部（俄勒冈）和美国东部（弗吉尼亚北部）。


| 实例 | v 的数量 CPUs | 内存 | 
| --- | --- | --- | 
| 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 实例：美国西部（俄勒冈）和美国东部（弗吉尼亚北部）。


| 实例 | v 的数量 CPUs | 内存 | 
| --- | --- | --- | 
| 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 实例：美国西部（俄勒冈）和美国东部（弗吉尼亚北部）。


| 实例 | v 的数量 CPUs | 内存 | 
| --- | --- | --- | 
| 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 实例：美国西部（俄勒冈）和美国东部（弗吉尼亚北部）。


| 实例 | v 的数量 CPUs | 内存 | 的数量 GPUs | GPU 内存 | 
| --- | --- | --- | --- | --- | 
| 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 L40。 GPUs


| 实例 | v 的数量 CPUs | 内存 | 的数量 GPUs | GPU 内存 | 
| --- | --- | --- | --- | --- | 
| 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


| 实例 | v 的数量 CPUs | 内存 | 的数量 GPUs | GPU 内存 | 
| --- | --- | --- | --- | --- | 
| 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


| 实例 | v 的数量 CPUs | 内存 | 的数量 GPUs | GPU 内存 | 
| --- | --- | --- | --- | --- | 
| 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)
+ [下一流的任务输出](#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 内容创建日志，因此输出也会与任务的其他 STDERR CloudWatch 日志信息一起显示在 “日志” 中。

```
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 内容创建日志，因此输出将与任务的其他 STDERR CloudWatch 日志信息一起显示在日志中。

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

## 下一流的任务输出
<a name="workflow-task-outputs-nextflow"></a>

对于在 Nextflow 中编写的工作流程定义，请定义 P **ublishDir** 指令以将任务内容导出到您的输出 Amazon S3 存储桶。将 p **ublishDir** 值设置为。`/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>

此示例创建了一个`CommandLineTool`任务，该任务将 STDOUT 内容回显到名为的文本输出文件中。**output.txt**例如，如果您提供以下输入，则生成的任务输出为 **Hello World！** 在**output.txt**文件中。

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

该`outputs`指令指定输出名称为**example\$1out**，其类型为`stdout`。要使下游任务消耗此任务的输出，它将输出称为`example_out`。

由于 HealthOmics 会为所有 STDERR 和 STDOUT 内容创建日志，因此输出也会与任务的其他 STDERR CloudWatch 日志信息一起显示在日志中。

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

此示例创建了一个`CommandLineTool`任务，该任务将 STDERR 内容回显到名为的文本输出文件中。**stderr.txt**该任务会修改，`baseCommand`以便`echo`写入 STDERR（而不是 STDOUT）。

该`outputs`指令指定输出名称为**stderr\$1out**，其类型为`stderr`。

由于 HealthOmics 会为所有 STDERR 和 STDOUT 内容创建日志，因此输出将与任务的其他 STDERR CloudWatch 日志信息一起显示在日志中。

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

此示例创建了一个`CommandLineTool`任务，该任务根据输入文件创建压缩的 tar 存档。您可以将档案的名称作为输入参数 (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 支持以下加速器规格值以及支持的实例类型：


| 加速器规格 | 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>

以下主题提供了有关可用于 WDL 工作流定义的类型和指令的 HealthOmics详细信息。

**Topics**
+ [宽松的 WDL 中的隐式类型转换](#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 中的隐式类型转换
<a name="workflow-wdl-type-conversion"></a>

HealthOmics 支持 input.json 文件和工作流程定义中的隐式类型转换。要使用隐式类型转换，请在创建工作流时将工作流引擎指定为 WDL 宽松。WDL lenient 旨在处理从 Cromwell 迁移的工作流程。它支持客户的 Cromwell 指令和一些不合规的逻辑。

[WDL lenient 支持 WDL 有限例外列表中以下项目的类型转换：](https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#-limited-exceptions)
+ Float 到 Int，其中强制转换不会导致精度损失（例如 1.0 映射到 1）。
+ 字符串到 Int/Float，其中强制转换不会导致精度损失。
+ 将 [W, X] 映射到数组 [Pair [Y, Z]]，如果 W 可以强制转换为 Y，X 可以强制到 Z。
+ 数组 [将 [W, X]] 与 Map [Y, Z] 配对，前提是 W 可以强制转换为 Y，X 可以强制转换为 Z（例如 1.0 映射到 1）。

要使用隐式类型转换，请在创建工作流或工作流版本时将工作流引擎指定为 WDL\$1LENIENT。

在控制台中，工作流引擎参数名为 “**语言**”。在 API 中，工作流引擎参数名为 en **g** ine。有关更多信息，请参阅 [创建私有工作流程](create-private-workflow.md)或 [创建工作流程版本](workflows-version-create.md)。

## input.json 中的命名空间定义
<a name="workflow-wdl-namespace-defn"></a>

HealthOmics 支持 input.json 中的完全限定变量。例如，如果您在工作流程中声明了两个名为 number1 和 number2 的输入变量：**SumWorkflow**

```
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" | 只要为工作流程提供 URIs 的 IAM 角色具有对这些对象的读取权限，就会导入 Amazon S3 和 HealthOmics 存储。不支持其他 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 | 不适用 | 不适用 | 不适用 | WDL Object 类型已过时，Struct在所有情况下都应替换为。 | 

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

HealthOmics 在所有支持的 WDL 版本中都 HealthOmics 支持以下指令。

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

R **eturnCodes** 属性提供了一种机制，用于指定表示任务成功执行的返回码或一组返回码。WDL 引擎使用您在 WDL 定义的**运行时**部分中指定的返回码，并相应地设置任务状态。

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

HealthOmics 还支持名为 C **continueOnReturnode** 的别名，该别名与 **ReturnC** odes 具有相同的功能。如果您同时指定了这两个属性，则 HealthOmics 使用 **returnCodes 值**。

## WDL 中的任务元数据
<a name="workflow-wdl-task-metadata"></a>

HealthOmics 支持 WDL 任务的以下元数据选项。

### 使用 volatile 属性禁用任务级缓存
<a name="workflow-wdl-volatile-attribute"></a>

v **olatil** e 属性允许您禁用 WDL 工作流程中特定任务的呼叫缓存。当任务被标记为 volatile 时，即使为运行启用了缓存，它也将始终执行并且永远不会使用缓存的结果。

将 v **olatil** e 属性添加到任务定义的**元数据**部分：

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

## WDL 工作流程定义示例
<a name="wdl-example"></a>

以下示例显示了在 WDL `BAM` 中从`CRAM`转换为的私有工作流程定义。t `CRAM` o `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 支持 Next DSL1 flow 和。 DSL2有关更多信息，请参阅 [Nextflow版本支持](workflows-lang-versions.md#workflows-lang-versions-nextflow)。

Nextflow 基 DSL2 于 Groovy 编程语言，因此参数是动态的，并且可以使用与 Groovy 相同的规则进行类型强制。输入 JSON 提供的参数和值可在工作流程的参数 (`params`) 映射中找到。

**Topics**
+ [使用 nf 架构和 nf 验证插件](#schema-and-validation-plugins-nextflow)
+ [指定存储空间 URIs](#storage-uris-nextflow)
+ [下一页流指令](#workflow-nexflow-directives)
+ [导出任务内容](#exporting-task-content-nextflow)

## 使用 nf 架构和 nf 验证插件
<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`插件的新版本。有关更多信息，请参阅 [Next GitHub flow 存储库中的 nf-schema](https://github.com/nextflow-io/nf-schema)。

## 指定存储空间 URIs
<a name="storage-uris-nextflow"></a>

使用 Amazon S3 或 HealthOmics URI 构建 Nextflow 文件或路径对象时，只要授予读取权限，它就会使匹配的对象可供工作流程使用。Amazon S3 URIs 允许使用前缀或目录。有关示例，请参阅 [亚马逊 S3 输入参数格式](workflows-run-inputs.md#s3-run-input-formats)。

HealthOmics 部分支持在 Amazon S3 URIs 或 HealthOmics 存储 URIs中使用全局模式。在工作流程定义中使用 Glob 模式来创建`path`或`file`频道。有关预期行为和确切情况，请参阅[Nextflow 处理 Amazon S3 输入中的 Glob 模式](workflows-run-inputs.md#wd-nextflow-s3-formats)。

## 下一页流指令
<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 终止整个运行。如果设置为`retry`，则 HealthOmics 尝试`errorStrategy`对失败的任务进行一次重试。要增加重试次数，请参阅[使用任务重试尝试 `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``s`、`m`、`h`、或`d`。

以下示例说明如何在 Nextflow 配置文件中指定全局配置。它将全局超时设置为 1 小时 30 分钟。

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

以下示例说明如何在工作流定义的任务部分中指定时间指令。此示例将超时设置为 3 天、5 小时和 4 分钟。此值优先于配置文件中的全局值，但不优先于配置文件`my_label`中特定于任务的时间指令。

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

以下示例说明如何根据名称或标签选择器在 Nextflow 配置文件中指定特定于任务的时间指令。此示例将全局任务超时值设置为 30 分钟。它将任务的值设置为 2 小时`myTask`，将带有标签的任务的值设置为 3 小时`my_label`。对于与选择器匹配的任务，这些值优先于全局值和工作流定义中的值。

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

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

## 导出任务内容
<a name="exporting-task-content-nextflow"></a>

对于用 Nextflow 编写的工作流程，请定义 **PublishDir** 指令以将任务内容导出到输出 Amazon S3 存储桶。如以下示例所示，将 p **ublishDir** 值设置为。`/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 工作流程。我们建议您不要使用固定的亚马逊 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 替换为亚马逊 EC URIs R。
+ 确保在主工作流程中将所有工作流文件声明为输入，并且所有变量都已明确定义。
+ 确保所有 JavaScript 代码都是严格模式投诉。

## 使用选择退出任务重试 `omicsRetryOn5xx`
<a name="workflow-cwl-retry-5xx"></a>

HealthOmics 如果任务由于服务错误而失败（5XX HTTP 状态代码），则支持任务重试。默认情况下，最多 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 类型都被标记为必填的输入参数。
+ 任何具有默认值的参数都被标记为可选的输入参数。
+ 描述是从`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 工作流引擎中，解析逻辑做出了以下假设：
+ 任何支持为空的类型都被标记为可选的输入参数。
+ 对于支持不可为空的类型：
  + 任何具有字面值或表达式赋值的输入变量都被标记为可选参数。例如：

    ```
     Int x = 2 
    Float f0 = 1.0 + f1
    ```
  + 如果没有为输入参数分配任何值或表达式，则它们将被标记为必填参数。
+ 描述是从`main`工作流程定义`parameter_meta`中提取的。如果`parameter_meta`未指定，则描述将为空（空字符串）。有关更多信息，请参阅[参数元数据](https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#metadata-sections)的 WDL 规范。

下表显示了 WDL 插值示例。对于每个示例，参数名称均为`x`。如果参数为必填项，则必须为该参数提供一个值。如果参数是可选的，则无需提供值。

下表显示了基元类型的 WDL 插值示例。


| 输入 | 输入/输出示例 | 必需 | 
| --- | --- | --- | 
| 整数 x | 1 或 2 或... | 是 | 
| 整数 x = 2 | 2 | 否 | 
| Int x = 1\$12 | 3 | 否 | 
| 整数 x = y\$1z | y\$1z | 否 | 
| 整数？ x | 无、1 或 2 或... | 是 | 
| 整数？ x = 2 | 无或 2 | 否 | 
| 整数？ x = 1\$12 | 无或 3 | 否 | 
| 整数？ x = y\$1z | 无或 y\$1z | 否 | 

下表显示了复杂类型的 WDL 插值示例。复杂类型是原始类型的集合。


| 输入 | 输入/输出示例 | 必需 | 
| --- | --- | --- | 
| 数组 [整数] x | [1,2,3] 或 [] | 是 | 
| 数组 [整数] \$1 x | [1]，但不是 [] | 是 | 
| 数组 [整数]？ x | 无或 [] 或 [1,2,3] | 否 | 
| 数组 [整数？] x | [] 或 [无、3、无] | 是 | 
| 数组 [整数？] =？ x | [无] 或 “无” 或 [1,2,3] 或 [无，3] 但不是 [] | 否 | 
| 结构示例 \$1字符串 a，整数 y\$1 稍后在输入中：示例 mySample  |  <pre>String a = mySample.a<br />   Int y = mySample.y</pre>  | 是 | 
| 结构示例 \$1字符串 a，整数 y\$1 稍后在输入中：样本？ 我的样本 |  <pre>if (defined(mySample)) { <br />     String a = mySample.a<br />     Int y = mySample.y<br />   } </pre>  | 否 | 

### Nextflow 参数检测
<a name="parameter-parsing-nextflow"></a>

对于 Nextflow，通过解析文件来 HealthOmics 生成参数模板。`nextflow_schema.json`如果工作流定义不包括架构文件，则 HealthOmics 解析主工作流定义文件。

**Topics**
+ [解析架构文件](#parameter-parsing-nextflow-schema)
+ [解析主文件](#parameter-parsing-nextflow-main)
+ [嵌套参数](#parameter-parsing-nextflow-nested)
+ [Nextflow 插值示例](#parameter-parsing-nextflow-examples)

#### 解析架构文件
<a name="parameter-parsing-nextflow-schema"></a>

为了使解析正常工作，请确保架构文件满足以下要求：
+ 架构文件名为`nextflow_schema.json`，与主工作流文件位于同一目录中。
+ 架构文件是有效的 JSON，如以下任一架构所定义：
  + [json 架构。 org/draft/2020-12/schema](https://json-schema.org/draft/2020-12/schema)。
  + [json 架构。 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 分析在主工作流定义文件和文件中找到的`params``nextflow.config`表达式。所有`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 解析文件**params**时会跳过嵌套。`nextflow_schema.json`例如，如果您定义了以下`nextflow_schema.json`文件：

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

HealthOmics 忽略`input_file`，`input_num`当它生成参数模板时：

```
{
    "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 不收集嵌套**params**在`nextflow.config`文件中，并在解析过程中跳过它们。例如，如果您定义了以下`nextflow.config`文件：

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

HealthOmics 忽略`params.nested.beta`，`params.group.delta`当它生成参数模板时：

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

#### Nextflow 插值示例
<a name="parameter-parsing-nextflow-examples"></a>

下表显示了主文件中参数的 Nextflow 插值示例。


| 参数 | 必需 | 
| --- | --- | 
| params.input\$1fil | 是 | 
| params.input\$1file = “s3://bucket/data.json” | 否 | 
| params.nested.input\$1file | 不适用 | 
| params.nested.input\$1file = “s3://bucket/data.json” | 不适用 | 

下表显示了文件中参数的 Nextflow 插值示例。`nextflow.config`


| 参数 | 必需 | 
| --- | --- | 
|  <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>  | 不适用 | 
|  <pre>input_file = params.input_file</pre>  | 不适用 | 

# 私有工作流程的容器镜像
<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 像定义为工作流程中的参数，以便在运行开始之前可以验证访问权限。通过更改 Region 参数，还可以更轻松地在新区域中运行工作流程。

**注意**  
HealthOmics 不支持 ARM 容器，也不支持访问公共仓库。

有关为访问 Amazon ECR 配置 IAM 权限的信息，请参阅[HealthOmics 资源权限](permissions-resource.md)。 HealthOmics 

**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 容器注册表
+ GitHub 容器注册表 
+ GitLab 容器注册表 

HealthOmics 不支持上游 Amazon ECR 私有存储库的直通缓存。

使用 Amazon ECR 直通缓存的好处包括：

1. 您无需手动将容器映像迁移到 Amazon ECR 或同步来自第三方存储库的更新。

1. 工作流程可以访问私有存储库中的同步容器镜像，这比在运行时从公共注册表下载内容更可靠。

1. 由于 Amazon ECR 提取缓存使用可预测的 URI 结构，因此该 HealthOmics 服务可以自动将 Amazon ECR 私有 URI 与上游注册表 URI 映射。您无需更新和替换工作流程定义中的 URI 值。

**Topics**
+ [配置直通缓存](#ecr-pull-through-configure)
+ [注册表映射](#ecr-pull-through-registry-mapping)
+ [镜像映射](#ecr-pull-through-mapping-format)

### 配置直通缓存
<a name="ecr-pull-through-configure"></a>

Amazon ECR AWS 账户 在每个区域都为您提供了一个注册表。请务必在计划运行工作流程的同一区域创建 Amazon ECR 配置。

以下各节描述了直通缓存的配置任务。

**Topics**
+ [创建直通缓存规则](#create-ecr-ptc)
+ [上游注册表的注册表权限](#reg-ecr-ptc)
+ [存储库创建模板](#repo-create-templates-ptc)
+ [创建工作流](#reg-mapping-ecr-ptc)

#### 创建直通缓存规则
<a name="create-ecr-ptc"></a>

为每个包含要缓存的图像的上游注册表创建 Amazon ECR 拉取缓存规则。规则指定了上游注册表和 Amazon ECR 私有存储库之间的映射。

对于需要身份验证的上游注册表，您可以使用 AWS Secrets Manager 提供证书。

**注意**  
当活动运行使用私有存储库时，请勿更改拉取缓存规则。运行可能会失败，或者更严重的是，会导致您的管道使用意想不到的图像。

有关更多信息，请参阅 *Amazon Elastic Container Registry 用户指南*[中的创建直通缓存规则](https://docs.aws.amazon.com/AmazonECR/latest/userguide/pull-through-cache-creating-rule.html)。

##### 使用控制台创建直通缓存规则
<a name="create-ecr-ptc-console"></a>

要配置直通缓存，请使用 Amazon ECR 控制台执行以下步骤：

1. 打开 Amazon ECR 控制台： https://console.aws.amazon.com/ecr

1. 在左侧菜单的 “**私有注册表**” 下，展开 “**功能和设置”**。然后选择 P **ull through cache**。

1. 从 P **ull through 缓存**页面中，选择**添加规则**。

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 公有注册表创建一个缓存提取规则。它指定了存储库前缀 `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 容器注册表
<a name="ecr-ptc-cli-kubernetes"></a>

以下示例为 Kubernetes 公有注册表创建了一个缓存提取规则。它指定了存储库前缀 `kubernetes`，这导致使用缓存提取规则创建的每个存储库都具有 `kubernetes/upstream-repository-name` 命名方案。

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

##### 对于 Quay
<a name="ecr-ptc-cli-quay"></a>

以下示例为 Quay 公有注册表创建了一个缓存提取规则。它指定了存储库前缀 `quay`，这导致使用推送缓存规则创建的每个存储库都具有命名方案 `quay/upstream-repository-name`。

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

##### 对于 Docker Hub
<a name="ecr-ptc-cli-docker-hub"></a>

以下示例为 Docker Hub 注册表创建了一个缓存提取规则。它指定了存储库前缀 `docker-hub`，这导致使用缓存提取规则创建的每个存储库都具有 `docker-hub/upstream-repository-name` 命名方案。您必须指定包含 Docker Hub 凭证的密钥的完整 Amazon 资源名称（ARN）。

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

##### 对于 GitHub 容器注册表
<a name="ecr-ptc-cli-public-github"></a>

以下示例为 GitHub 容器注册表创建了通过缓存规则。它指定了存储库前缀 `github`，这导致使用缓存提取规则创建的每个存储库都具有 `github/upstream-repository-name` 命名方案。您必须指定包含您的 GitHub 容器注册凭证的密钥的完整 Amazon 资源名称 (ARN)。

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

##### 对于 Microsoft Azure 容器注册表
<a name="ecr-ptc-cli-azure"></a>

以下示例为 Microsoft Azure 容器注册表创建了一个缓存提取规则。它指定了存储库前缀 `azure`，这导致使用缓存提取规则创建的每个存储库都具有 `azure/upstream-repository-name` 命名方案。您必须指定包含 Microsoft Azure 容器注册表凭证的密钥的完整 Amazon 资源名称（ARN）。

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

##### 对于 GitLab 容器注册表
<a name="ecr-ptc-cli-gitlab"></a>

以下示例为 GitLab 容器注册表创建了通过缓存规则。它指定了存储库前缀 `gitlab`，这导致使用缓存提取规则创建的每个存储库都具有 `gitlab/upstream-repository-name` 命名方案。您必须指定包含您的 GitLab 容器注册凭证的密钥的完整 Amazon 资源名称 (ARN)。

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

有关更多信息，请参阅 *Amazon ECR 用户指南*中的[创建直通缓存规则 (CLI)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/pull-through-cache-creating-rule.html#pull-through-cache-creating-rule-cli)。

您可以使用 **get-run-task** CLI 命令来检索有关用于特定任务的容器镜像的信息：

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

输出包含有关容器镜像的以下信息：

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

#### 上游注册表的注册表权限
<a name="reg-ecr-ptc"></a>

使用注册表权限 HealthOmics 允许使用直通缓存并将容器映像提取到 Amazon ECR 私有注册表中。将 Amazon ECR 注册表策略添加到提供运行中使用的容器的注册表。

以下策略授予该 HealthOmics 服务创建具有指定拉取缓存前缀的存储库以及启动对这些存储库的上游拉取的权限。

1. 在 Amazon ECR 控制台中，打开左侧菜单，在 “**私有注册表**” 下，展开 “**注册表权限**”。然后选择 “**生成声明**”。

1. 在右上角，选择 JSON。输入类似于以下内容的策略：

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

****  

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

------

#### 存储库创建模板
<a name="repo-create-templates-ptc"></a>

要在中使用拉取缓存 HealthOmics，Amazon ECR 存储库必须具有存储库创建模板。该模板定义了您或 Amazon ECR 为上游注册表创建私有存储库时的配置设置。

每个模板都包含存储库命名空间前缀，Amazon ECR 使用该前缀将新存储库与特定模板进行匹配。模板指定所有存储库设置的配置，包括基于资源的访问策略、标签不可变性、加密和生命周期策略。

有关更多信息，请参阅 *Amazon 弹性容器注册表用户指南*中的[存储库创建模板](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 注册表映射的更多信息，请参阅在 A [mazon 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 图像映射的更多信息，请参阅在 A [mazon ECR 中创建直通缓存规则](https://docs.aws.amazon.com/AmazonECR/latest/userguide/pull-through-cache-creating-rule.html)。

以下示例显示了从私有 Amazon ECR 映像到公共基因组学映像和最新 Ubuntu 映像的映射。

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

## Amazon ECR 容器镜像的一般注意事项
<a name="ecr-considerations"></a>
+ 架构

  HealthOmics 支持 x86\$164 容器。如果您的本地计算机基于 ARM，例如 Apple Mac，请使用以下命令来构建 x86\$164 容器镜像：

  ```
  docker build --platform amd64 -t my_tool:latest .
  ```
+ 入口点和外壳

  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\$1任务**  
此变量是当前任务的名称。

**AWS\$1WORKFLOW\$1任务\$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 工作流程自述文件
<a name="workflows-readme"></a>

您可以上传一个 README.md 文件，其中包含工作流程的说明、图表和基本信息。每个工作流程版本都支持一个 README 文件，您可以随时更新该文件。

**自述文件要求包括：**
+ 自述文件必须采用 markdown (.md) 格式
+ 最大文件大小：500 KiB

**Topics**
+ [使用现有的自述文件](#workflows-add-readme)
+ [渲染条件](#workflows-rendering-readme)

## 使用现有的自述文件
<a name="workflows-add-readme"></a>

READMEs 从 Git 存储库导出的内容包含相对链接，这些链接通常在仓库之外不起作用。 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 控制台自述文件视图支持的 markdown 元素。


| 元素 | AWS 控制台 | 
| --- | --- | 
| 警报 | 是的，但没有图标 | 
| 徽章 | 是 | 
| 基本文本格式 | 是 | 
| [代码块](https://www.markdownguide.org/basic-syntax/#code-blocks) | 是的，但没有[语法突出显示](https://www.markdownguide.org/extended-syntax/#syntax-highlighting)和复制按钮功能  | 
| 可折叠部分 | 是 | 
| [标题](https://www.markdownguide.org/basic-syntax/#headings) | 是 | 
| [图像格式](https://www.markdownguide.org/basic-syntax/#images-1) | 是 | 
| [图片（可点击）](https://www.markdownguide.org/basic-syntax/#linking-images) | 是 | 
| [换行符](https://www.markdownguide.org/basic-syntax/#line-breaks) | 是 | 
| 美人鱼图 | 只能打开图表、移动图表位置和复制代码 | 
| 报价 | 是 | 
| [https://www.markdownguide.org/extended-syntax/#subscript](https://www.markdownguide.org/extended-syntax/#subscript) | 是 | 
| [表](https://www.markdownguide.org/extended-syntax/#tables) | 是，但不支持文本对齐 | 
| 文本对齐方式 | 是 | 

### 使用图片和链接 URLs
<a name="workflows-urls-readme"></a>

根据您的来源提供商，请按以下格式构建页面和图像的基础 URLs 。
+ `{username}`：存储库所在的用户名。
+ `{repo}`：存储库名称。
+ `{ref}`: 源引用（分支、标签和提交 ID）。
+ `{path}`：存储库中页面或图像的文件路径。


| 源提供商 | 页面网址 | 图片网址 | 
| --- | --- | --- | 
| 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 的支持。


| 私有存储库支持 | 源提供商 | 页面网址 | 图片网址 | 
| --- | --- | --- | --- | 
| GitHub | 只能访问存储库 | 否 | 
| GitLab | 只能访问存储库 | 否 | 
| Bitbucket | 只能访问存储库 | 否 | 

# 为私有工作流程申请 Sentieon 许可证
<a name="private-workflows-subscribe"></a>

如果您的私人工作流程使用Sentieon软件，则需要Senieon许可证。请按照以下步骤申请和设置 Sentieon 软件的许可证：
+ 申请 Sentieon 许可证 
  + 向 Sentieon 支持小组 (support@sentieon.com) 发送电子邮件申请软件许可证。
    + 在电子邮件中提供您的 AWS 规范用户 ID。
    + 按照[以下](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-identifiers.html#FindCanonicalId)说明查找您的 AWS 规范用户 ID。
+ 更新您的 HealthOmics 服务角色以授予其访问您所在地区的 Sentieon 许可服务器代理和 Sentieon Omics 存储桶的访问权限。以下示例授予中的访问权限`us-east-1`。如果需要，请将此文本替换为您所在的地区。

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

****  

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

------
+ 生成 AWS 支持案例以获取 Sentieon 许可证服务器代理的访问权限。
  + 要创建支持案例，请导航至 [support.console.aws.](https://support.console.aws.amazon.com) amazon.com。
  + 在支持案例中提供您的 AWS 账户 和区域。您的帐户已添加到许可服务器代理的许可名单中。
+ 使用 Sentieon 容器和 Sentieon 许可证脚本构建您的私有工作流程。
  + 有关在私有工作流程中使用 Sentieon 工具的其他说明，请参阅中的 S [en](https://github.com/Sentieon/sentieon-amazon-omics) tieon-Amazon-Omics。 GitHub
+ Sentieon 软件版本 202112.07 及更高版本支持许可服务器代理。 HealthOmics 要使用 202112.07 之前的 Sentieon 软件版本，请联系 Sentieon 支持人员。

# 中的工作流程提示 HealthOmics
<a name="workflows-linter"></a>

创建工作流程后，我们建议您在开始第一次运行之前对该工作流程运行 linter。linter 会检测可能导致运行失败的错误。

对于 WDL，在创建工作流程时 HealthOmics 会自动运行 linter。linter 输出可在**get-workflow**响应的`statusMessage`字段中找到。使用以下 CLI 命令检索状态输出（使用您创建的 WDL 工作流程的工作流 ID）：

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

HealthOmics 提供了可以在创建工作流程之前在工作流程定义上运行的 linter。在要迁移到的现有管道上运行这些 linter。 HealthOmics
+ **WDL**— 用于运行 [WDL l](https://gallery.ecr.aws/aws-genomics/healthomics-linter) inter 的公共 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`格式。有关更多信息，请参阅中的[工作流定义文件](workflow-definition-files.md) HealthOmics。
  + 您可以使用 [Amazon Q CLI](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/what-is.html) 在 WDL、Nextflow 和 CWL 中构建和验证您的工作流程定义文件。有关更多信息，请参阅 [Amazon Q CLI 的示例提示](getting-started.md#omics-q-prompts)和上 GitHub的 A [HealthOmics gentic 生成人工智能教程](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 简单存储服务文件夹并指定位置。
+ 上传到外部存储库（最大大小 1 GiB）并指定存储库的详细信息。

创建工作流程后，您可以通过该`UpdateWorkflow`操作更新以下工作流信息：
+ Name
+ 描述
+ 默认存储类型
+ 默认存储容量（带工作流程 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、GitLabBitbucket、GitHub self-managed的公有和私有存储库GitLab self-managed。

         1. 选择一个**连接**，将您的 AWS 资源连接到外部存储库。要创建连接，请参阅[Connect 连接外部代码存储库](setting-up-new.md#setting-up-omics-repository)。
**注意**  
该TLV地区的客户需要在 IAD (us-east-1) 区域创建连接才能创建工作流程。

         1. 在**完整存储库 ID** 中，输入您的存储库 ID 作为用户名/存储库名称。确认您有权访问此存储库中的文件。

         1. 在**源引用**（可选）中，输入存储库源引用（分支、标签或提交 ID）。 HealthOmics 如果未指定源引用，则使用默认分支。

         1. 在**排除文件模式**中，输入文件模式以排除特定的文件夹、文件或扩展名。这有助于在导入存储库文件时管理数据大小。最多有 50 个模式，并且模式必须遵循[全局模式语法](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**。为了验证存储桶所有权 HealthOmics ，必须提供此信息。

      1. 对于**从本地来源选择定义文件夹**：

         1. 输入压缩的工作流程定义文件夹的本地驱动器位置。

   1. **工作流定义文件主路径**（可选）：输入从压缩的工作流定义文件夹或存储库到该`main`文件的文件路径。如果工作流定义文件夹中只有一个文件，或者主文件名为 “main”，则不需要此参数。

1. 在**自述文件**（可选）面板中，选择**自述文件来源**并提供以下信息：
   + 对于**从存储库服务导入**，在**自述文件路径**中，输入存储库中自述文件的路径。
   + 对于**从 S3 中选择文件**，在 S3 的**自述文件中**，输入自述文件的 Amazon S3 URI。
   + 对于 **“从本地来源选择文件**：在**自述文件-可选**” 中，选择 “选择**文件” 以选择**要上传的 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**— 将您的 AWS 资源连接到外部存储库的代码连接的 ARN。
+ **fullRepositoryId**— 将存储库 ID 输入为`owner-name/repo-name`。确认您有权访问此存储库中的文件。
+ **sourceReference**（可选）-输入存储库引用类型（BRANCH、TAG 或 COMMIT）和值。

  HealthOmics 如果您未指定源引用，则使用默认分支上的最新提交。
+ **excludeFilePatterns**（可选）-输入文件模式以排除特定的文件夹、文件或扩展名。这有助于在导入存储库文件时管理数据大小。最多提供 50 个模式。这些模式必须遵循全局模式[语法](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 参数，则会在存储库中 HealthOmics 导入根级 README.md 文件（如果存在）。

以下示例说明如何使用自述文件路径和自述文件URI指定自述文件位置。

```
# 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 工作流程自述文件](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>

您可以指定默认的运行存储类型（动态或静态）和运行存储容量（静态存储所必需的）。有关运行存储类型的更多信息，请参阅[在 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 参数创建在加速计算实例上运行的工作流程。以下示例说明如何使用该`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"
        }
    ]
}
```

在创建工作流命令中指定映射参数：

```
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 开发工具包创建工作流程

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

如以下示例所示，您可以更新工作流程名称和描述。您也可以更改默认的运行存储类型（静态或动态）和运行存储容量（对于静态存储类型）。有关运行存储类型的更多信息，请参阅[在 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 开发工具包更新工作流程

```
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。您可以删除符合以下条件的工作流程：
+ 其状态为 “活动” 或 “失败”。
+ 它没有活跃股份。
+ 您已经删除了所有工作流程版本。

删除工作流程不会影响正在使用该工作流程的任何正在进行的运行。

**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 开发工具包删除工作流程。

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

可以使用如下所示的 URI 来引用 HealthOmics 参考存储对象。使用您自己的`account ID``reference store ID`、和（`reference ID`如果指示）。

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

有些工作流程需要同时使用`SOURCE`和`INDEX`文件作为参考基因组。之前的 URI 是默认的简写形式，默认为源文件。要指定任一文件，您可以使用长 URI 格式，如下所示。

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

如图所示，使用序列读取集将具有类似的模式。

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

某些读取集（例如基于 FASTQ 的读取集）可能包含配对读取。在以下示例中，它们被称为 SOURCE1 和 SOURCE2。诸如 BAM 和 CRAM 之类的格式只能有一个文件。 SOURCE1 某些读取集将包含索引文件，例如`bai`或`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>"
}
```

 AWS CLI 通过添加到`--inputs file://<input_file.json>`您的**开始运行**请求中引用输入 JSON 文件。