

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

# VPC-connected 工作流程的互联网接入
<a name="workflows-vpc-internet"></a>

当您将 AWS HealthOmics 运行连接到 VPC 时，该运行只能访问该 VPC 内的可用资源。要允许您的运行访问公共互联网或 VPC 之外的 AWS 服务，您必须使用适当的网络资源配置 VPC。

本主题介绍如何设置您的 VPC，以便为您的 VPC-connected 运行提供互联网访问和与 AWS 服务的高效连接。有关将运行连接到 VPC 的信息，请参阅[将 HealthOmics 工作流程连接到 VPC](workflows-vpc-networking.md)。

**重要**  
将运行连接到公有子网不会为其提供互联网访问权限或公有 IP 地址。对于需要互联网连接的运行，请务必使用带有 NAT 网关路由的私有子网。

**Topics**
+ [设置可访问互联网的 VPC](#vpc-internet-setup)
+ [AWS 服务的 VPC 终端节点](#vpc-endpoints)
+ [安全组配置](#vpc-internet-security-groups)
+ [路由表配置](#vpc-internet-route-tables)
+ [AWS 服务的 IAM 权限](#vpc-iam-permissions)
+ [测试 VPC 连接](#vpc-testing-connectivity)
+ [示例](#vpc-internet-examples)
+ [最佳实践](#vpc-internet-best-practices)

## 设置可访问互联网的 VPC
<a name="vpc-internet-setup"></a>

要让您的 VPC-connected 跑步能够访问互联网，请创建一个带有私有子网的 VPC，用于通过 NAT 网关路由出站流量。

此配置提供：
+  HealthOmics 工作流任务的私有子网
+ 带有用于出站互联网访问的 NAT 网关的公有子网

### 受支持的区域和可用区
<a name="vpc-internet-regions-azs"></a>

HealthOmics 工作流程在以下区域和可用区运行。创建 VPC 时，请确保您的子网位于其中一个或多个可用区中。



- **us-west-2**
  - **可用区名称:** us-west-2a / **可用区 ID:** usw2-az2
  - **可用区名称:** us-west-2b / **可用区 ID:** usw2-az1
  - **可用区名称:** us-west-2c / **可用区 ID:** usw2-az3
  - **可用区名称:** us-west-2d / **可用区 ID:** usw2-az4

- **us-east-1**
  - **可用区名称:** us–east–1a / **可用区 ID:** use1-az4
  - **可用区名称:** us–east–1b / **可用区 ID:** use1-az6
  - **可用区名称:** us–east–1c / **可用区 ID:** use1-az1
  - **可用区名称:** us-east-1d / **可用区 ID:** use1-az2
  - **可用区名称:** us-east-1f / **可用区 ID:** use1-az5

- **eu-west-1**
  - **可用区名称:** eu-west-1a / **可用区 ID:** euw1-az2
  - **可用区名称:** eu-west-1b / **可用区 ID:** euw1-az3
  - **可用区名称:** eu-west-1c / **可用区 ID:** euw1-az1

- **eu-central-1**
  - **可用区名称:** eu-central-1a / **可用区 ID:** euc1-az2
  - **可用区名称:** eu-central-1b / **可用区 ID:** euc1-az3
  - **可用区名称:** eu-central-1c / **可用区 ID:** euc1-az1

- **eu-west-2**
  - **可用区名称:** eu-west-2a / **可用区 ID:** euw2-az2
  - **可用区名称:** eu-west-2b / **可用区 ID:** euw2-az3
  - **可用区名称:** eu-west-2c / **可用区 ID:** euw2-az1

- **ap-southeast-1**
  - **可用区名称:** ap-southeast-1a / **可用区 ID:** apse1-az2
  - **可用区名称:** ap-southeast-1b / **可用区 ID:** apse1-az1
  - **可用区名称:** ap-southeast-1c / **可用区 ID:** apse1-az3

- **il-central-1**
  - **可用区名称:** ilcentral-1a / **可用区 ID:** ilc1-az1
  - **可用区名称:** il-central-1b / **可用区 ID:** ilc1-az2
  - **可用区名称:** il-central-1c / **可用区 ID:** ilc1-az3

- **ap-northeast-2**
  - **可用区名称:** ap-northeast-2a / **可用区 ID:** apne2-az1
  - **可用区名称:** ap-northeast-2b / **可用区 ID:** apne2-az2
  - **可用区名称:** ap-northeast-2c / **可用区 ID:** apne2-az3



1. 在亚马逊 VPC 控制台中，选择**创建 VPC**。

1. 选择 **VPC 及更多**以自动创建包含公有和私有子网的 VPC。

1. 配置以下设置：
   + **可用区数量**：2 个或更多
   + **公有子网数量**：每个可用区一个。在这个例子中，2
   + **私有子网数量**：每个可用区一个。在这个例子中，2
   + **NAT 网关**：每个可用区 1 个（用于生产）或 1 个（对于 development/testing）
   + **VPC 终端节点**：S3 网关终端节点（可选 — 默认情况下，区域内 Amazon S3 流量通过服务 HealthOmics VPC 路由）

创建 HealthOmics VPC 配置时，请指定私有子网。运行使用公有子网中的 NAT 网关来访问互联网。

## AWS 服务的 VPC 终端节点
<a name="vpc-endpoints"></a>

您可以将 VPC 终端节点配置为允许在不通过公共互联网的情况下运行访问 AWS 服务。这可以提高安全性并降低数据传输成本。

**重要**  
如果您的工作流程定义需要访问 AWS 服务（例如亚马逊 Athena 查询、亚马逊 DynamoDB 操作或其他 API 调用），则必须确保在您的 VPC 中配置了所需的 VPC 终端节点。如果没有适当的端点，您的工作流程可能会因身份验证或连接错误而失败。

**注意**  
In-Region 默认情况下，Amazon S3 流量通过 HealthOmics 服务 VPC 路由。如果您配置 Amazon S3 接口终端节点，则流量将改为通过您的 VPC 路由。我们建议使用 Amazon S3 网关终端节点，以获得最佳性能和成本优化。有关更多信息，请参阅*AWS PrivateLink 指南*[中的 Amazon S3 网关终端节点](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-s3.html)。

下表列出了 HealthOmics 运行时常用的 VPC 终端节点：


| 服务 | 端点类型 | 端点名称 | 
| --- | --- | --- | 
| Amazon S3 | 网关 | com.amazonaws。 {{region}}.s3 | 
| Amazon S3 表 | 接口 | com.amazonaws。 {{region}}.s3tables | 
| 亚马逊 ECR (API) | 接口 | com.amazonaws。 {{region}}.ecr.api | 
| 亚马逊 ECR (Docker) | 接口 | com.amazonaws。 {{region}}.ecr.dkr | 
| SSM | 接口 | com.amazonaws。 {{region}}.ssm | 
| CloudWatch 日志 | 接口 | com.amazonaws。 {{region}}.logs | 
| Amazon Athena | 接口 | com.amazonaws。 {{region}}.athena | 

您可以通过 AWS PrivateLink 终端节点访问的服务的完整列表可在[与集成的AWS 服务](https://docs.aws.amazon.com/vpc/latest/privatelink/aws-services-privatelink-support.html)中找到 AWS PrivateLink。有关端点设置的详细说明，请参阅*AWS PrivateLink 指南 AWS PrivateLink*中的[通过访问 AWS 服务](https://docs.aws.amazon.com/vpc/latest/privatelink/privatelink-access-aws-services.html)。

### NAT 网关要求
<a name="vpc-nat-gateway-requirements"></a>

对于需要公共互联网访问的跑步：
+ NAT 网关必须部署在公有子网中
+ 公有子网必须有通往 Internet Gateway 的路由
+ 私有子网（运行执行的地方）必须有通往 NAT 网关的路由

**注意**  
NAT 网关会产生小时费和数据处理费。为了优化成本，可以考虑使用 VPC 终端节点进行 AWS 服务访问，而不是通过 NAT 网关进行路由。

## 安全组配置
<a name="vpc-internet-security-groups"></a>

配置您的安全组，以允许出站流量到达您的运行需要访问的目的地：
+ **公共互联网访问**-允许出站 HTTPS（端口 443）流量。根据需要为其他协议添加规则，例如 HTTP（端口 80）。
+ **特定服务**-根据您的要求配置规则。
+ **On-premises 资源**-允许流量进入您的 VPN 或 CIDR 范围。

以下示例显示了用于公共互联网访问的安全组规则：


| Type | 协议 | 端口范围 | 目标位置 | 说明 | 
| --- | --- | --- | --- | --- | 
| HTTPS | TCP | 443 | 0.0.0。 0/0 | 允许 HTTPS 连接到互联网 | 

## 路由表配置
<a name="vpc-internet-route-tables"></a>

确保您的私有子网有路由表条目，可将互联网流量定向到 NAT 网关：


| 目标位置 | Target | 
| --- | --- | 
| 10.0.0。 0/16 | 本地 | 
| 0.0.0。 0/0 | nat-xxxxxxxxxx | 

要访问本地资源，请配置指向虚拟私有网关或网关的路由。

## AWS 服务的 IAM 权限
<a name="vpc-iam-permissions"></a>

当您的工作流程任务在 VPC 联网模式下访问 Amazon Athena AWS 、Glue 或 Amazon DynamoDB 等 AWS 服务时，您必须向传递给 API 的服务角色添加必要的权限。`StartRun`如果没有这些权限，您的工作流程任务将失败并`AccessDeniedException``UnauthorizedException`出现错误。

**重要**  
服务角色权限与 VPC 网络配置是分开的。即使使用正确配置的 VPC 终端节点和安全组，如果服务角色缺少所需的 IAM 权限，您的工作流程也会失败。

如果您的工作流程因权限错误而失败，请查看工作流程运行的 CloudWatch 日志日志。常见的错误消息包括`AccessDeniedException: You are not authorized to perform: action on the resource`（服务角色缺少所需的 IAM 权限）或`UnrecognizedClientException: The security token included in the request is invalid`（服务角色信任策略可能配置错误，或者传递`StartRun`给的角色 ARN 不正确）。

### 常用服务权限
<a name="vpc-iam-common-services"></a>

以下示例显示了 VPC 模式工作流程中常用 AWS 服务的 IAM 权限。根据您的工作流程访问的服务，将这些权限添加到您的服务角色策略中。

**Example 权限**  
对于运行查询的工作流程：  

```
{
  "Effect": "Allow",
  "Action": [
    "athena:StartQueryExecution",
    "athena:GetQueryExecution",
    "athena:GetQueryResults",
    "athena:StopQueryExecution"
  ],
  "Resource": "arn:aws:athena:{{region}}:{{account-id}}:workgroup/{{workgroup-name}}"
}
```

**Example AWS Glue 数据目录权限**  
对于访问 AWS Glue 数据库和表的工作流程（通常与 Amazon Athena 一起使用）：  

```
{
  "Effect": "Allow",
  "Action": [
    "glue:GetDatabase",
    "glue:GetTable",
    "glue:GetPartitions",
    "glue:CreateTable",
    "glue:UpdateTable"
  ],
  "Resource": [
    "arn:aws:glue:{{region}}:{{account-id}}:catalog",
    "arn:aws:glue:{{region}}:{{account-id}}:database/{{database-name}}",
    "arn:aws:glue:{{region}}:{{account-id}}:table/{{database-name}}/*"
  ]
}
```
如果您使用 AWS Lake Formation 管理 AWS Glue 数据目录的权限，则还必须授予相应的 Lake Formation 权限。有关更多信息，请参阅《*AWS Lake Formation 开发者指南》*中的 [Lake Formation 权限](https://docs.aws.amazon.com/lake-formation/latest/dg/lake-formation-permissions.html)。

**Example DynamoDB 权限**  
对于读取或写入 DynamoDB 表的工作流程：  

```
{
  "Effect": "Allow",
  "Action": [
    "dynamodb:GetItem",
    "dynamodb:PutItem",
    "dynamodb:Query",
    "dynamodb:Scan"
  ],
  "Resource": "arn:aws:dynamodb:{{region}}:{{account-id}}:table/{{table-name}}"
}
```

**Example 亚马逊 S3 表格权限**  
对于读取或写入 Amazon S3 表的工作流程：  

```
{
  "Effect": "Allow",
  "Action": [
    "s3tables:GetTableData",
    "s3tables:PutTableData"
  ],
  "Resource": "arn:aws:s3tables:{{region}}:{{account-id}}:bucket/{{bucket-name}}/table/{{table-id}}"
}
```
亚马逊 S3 表格使用的终端节点与亚马逊 S3 不同。您必须为 Amazon S3 表配置 VPC 终端节点，并确保您的安全组允许流向 Amazon S3 表格服务的出站 HTTPS 流量（端口 443）。

## 测试 VPC 连接
<a name="vpc-testing-connectivity"></a>

在运行生产工作流程之前，请验证您的 VPC 配置是否允许连接到所需的外部服务。

### 创建测试工作流程
<a name="vpc-test-workflow"></a>

创建一个简单的工作流程来测试与外部服务的连接。例如，创建一个尝试与目标服务端点建立 TCP 连接的工作流。

### 运行测试
<a name="vpc-run-test"></a>

```
aws omics start-run \
  --workflow-id {{test-workflow-id}} \
  --role-arn {{role-arn}} \
  --output-uri s3://{{bucket-name}}/test-outputs/ \
  --networking-mode VPC \
  --configuration-name {{configuration-name}} \
  --parameters file://test-parameters.json
```

### 验证结果
<a name="vpc-verify-results"></a>

检查工作流程输出以确认连接成功：

```
{
  "connectivity_test.result": "Testing connection to external service...\nSUCCESS: Connection successful!\nTest completed"
}
```

如果测试失败，请验证以下内容：
+ 安全组规则允许出站流量到达所需端口和目的地。
+ 路由表将流量引导到 NAT 网关以访问互联网。
+ 可以从您的网络访问外部服务。
+ 您的账户中已有足够的 ENI 可用。
+ NAT 网关位于公有子网中，有通往互联网网关的路由。

**注意**  
网络吞吐量起始于每个 ENI 10 Gbps，在流量持续的情况下，在 60 分钟内可扩展到 100 Gbps。如需立即要求高吞吐量的工作流程，请联系 Su AWS pport。

## 示例
<a name="vpc-internet-examples"></a>

### 使用 API 身份验证访问 NCBI 数据
<a name="vpc-example-ncbi"></a>

此示例演示如何使用带有身份验证的 NCBI 数据集 API 访问 NCBI 数据。

**访问 NCBI 资源的最佳实践**  
客户应尽可能使用 REST API，并使用 NCBI 提供的 API 密钥。访问NCBI资源的请求（例如对公共数据的HTTP和FTP请求）将来自NCBI设定的第三方费率， HealthOmics 并将按NCBI设定的第三方费率进行限制。在使用高峰期，由于限制错误，您可能会遇到运行失败。我们鼓励用户获取自己的 NCBI API 密钥，并使用专门的 API 来实现更高的并发性和更好的开发体验。

要获取 NCBI API 密钥，请访问 [NCBI API 密钥文档](https://www.ncbi.nlm.nih.gov/datasets/docs/v2/api/api-keys/)。

**工作流程定义示例：**

```
version 1.0
#WORKFLOW DEFINITION

# Meant to be used as integration test for public internet access via VPC tunnel
workflow TestFlow {
    input {
        String ncbi_api_url = "https://api.ncbi.nlm.nih.gov/datasets/v2/gene/accession/NM_021803.4?api_key=<YOUR_API_KEY>"
    }

    call DataProcessTask{
        input:
            ncbi_api_url = ncbi_api_url,
    }

    output {
        File output_file = DataProcessTask.output_file
    }

}

#Task Definitions
task DataProcessTask {
    input {
        String ncbi_api_url
    }

    command <<<
        set -eu
        # Download file from NCBI Datasets API with API key
        curl -fsSL "~{ncbi_api_url}" -o gene_data.json

        # Add data processing task here
        cat gene_data.json > processed_data.json

        # Echo the content to output file
        cat processed_data.json > outfile.txt
    >>>

    output {
        File output_file = "outfile.txt"
    }
}
```

**要点：**
+ `<YOUR_API_KEY>`用你实际的 NCBI API 密钥替换
+ 该工作流程使用 HTTPS 来访问 NCBI 数据集 API
+ API 密钥作为网址参数传递
+ 与未经身份验证的访问（每秒 5 个请求）相比，这种方法提供了更高的速率限制（每秒 10 个请求）

有关 NCBI API 密钥和速率限制的更多信息，请参阅 [NCBI 数据集 API 文档](https://www.ncbi.nlm.nih.gov/datasets/docs/v2/api/api-keys/)。

## 最佳实践
<a name="vpc-internet-best-practices"></a>

1. **使用 VPC 终端节点提供 AWS 服务。**为 Amazon S3、Amazon ECR 和其他 AWS 服务配置 VPC 终端节点，以降低 NAT 网关成本并提高性能。有关更多信息，请参阅 [AWS 服务的 VPC 终端节点](#vpc-endpoints)。

1. **监控网络成本。**VPC 联网会产生 NAT 网关、数据传输和 ENI 的成本。使用 Cost Explorer AWS 监控您的使用情况。

1. **规划可用区。**确保您的子网跨越可用区，在这些可用区中 HealthOmics 运行以支持工作流程放置。

1. **在每个可用区中使用 NAT 网关。**对于生产工作负载，请在每个可用区部署一个 NAT 网关以提供冗余。