

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

# VPC 連線工作流程的網際網路存取
<a name="workflows-vpc-internet"></a>

當您將 AWS HealthOmics 執行連線到 VPC 時，執行只能存取該 VPC 中可用的資源。若要授予公有網際網路或 VPC 外部 AWS 服務的執行存取權，您必須使用適當的聯網資源來設定 VPC。

本主題說明如何設定 VPC，為 VPC 連線的執行提供網際網路存取和有效的 服務連線 AWS 。如需將執行連接到 VPC 的資訊，請參閱 [將 HealthOmics 工作流程連線至 VPC](workflows-vpc-networking.md)。

**重要**  
將執行連線到公有子網路並不會授予其網際網路存取或公有 IP 地址。對於需要網際網路連線的執行，一律使用具有 NAT Gateway 路由的私有子網路。

**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 連線執行存取網際網路，請建立具有私有子網路的 VPC，透過 NAT 閘道路由傳出流量。

此組態提供：
+ HealthOmics 工作流程任務的私有子網路
+ 具有 NAT 閘道的公有子網路用於傳出網際網路存取

### 支援的區域和可用區域
<a name="vpc-internet-regions-azs"></a>

HealthOmics Workflows 會在下列區域和可用區域中運作。建立 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**
  - **可用區域名稱:** il-central-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. 在 Amazon VPC 主控台中，選擇**建立 VPC**。

1. 選取 **VPC 等**以自動建立具有公有和私有子網路的 VPC。

1. 進行下列設定：
   + **可用區域數量**：2 個或更多
   + **公有子網路數量**：每個 AZ 一個。在此範例中，2
   + **私有子網路數量**：每個 AZ 一個。在此範例中，2
   + **NAT 閘道**：每個可用區域 1 個 （用於生產） 或 1 個 （用於開發/測試）
   + **VPC 端點**：S3 Gateway 端點 （選用 — 根據預設，區域 Amazon S3 流量會透過 HealthOmics 服務 VPC 路由）

當您建立 HealthOmics VPC 組態時，請指定私有子網路。執行會使用公有子網路中的 NAT 閘道來連接網際網路。

## AWS 服務的 VPC 端點
<a name="vpc-endpoints"></a>

您可以設定 VPC 端點以允許執行存取 AWS 服務，而無需周遊公有網際網路。這可提高安全性並降低資料傳輸成本。

**重要**  
如果您的工作流程定義需要存取 AWS 服務 （例如 Amazon Athena 查詢、Amazon DynamoDB 操作或其他 API 呼叫），您必須確保在 VPC 中設定必要的 VPC 端點。如果沒有適當的端點，您的工作流程可能會因為身分驗證或連線錯誤而失敗。

**注意**  
根據預設，區域 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 端點：


| 服務 | 端點類型 | Endpoint name (端點名稱) | 
| --- | --- | --- | 
| Amazon S3 | 閘道 | com.amazonaws.{{region}}.s3 | 
| Amazon S3 Tables | 介面 | com.amazonaws.{{region}}.s3tables | 
| Amazon ECR (API) | 介面 | com.amazonaws.{{region}}.ecr.api | 
| Amazon ECR (Docker) | 介面 | com.amazonaws.{{region}}.ecr.dkr | 
| SSM | 介面 | com.amazonaws.{{region}}.ssm | 
| CloudWatch Logs | 介面 | com.amazonaws.{{region}}.logs | 
| Amazon Athena | 介面 | com.amazonaws.{{region}}.athena | 

您可以在與 AWS PrivateLink [AWS 整合的 服務中找到您可以透過 AWS PrivateLink ](https://docs.aws.amazon.com/vpc/latest/privatelink/aws-services-privatelink-support.html)端點存取的服務完整清單。如需詳細的端點設定指示，請參閱 [AWS PrivateLink 指南中的透過 PrivateLink 存取 AWS 服務](https://docs.aws.amazon.com/vpc/latest/privatelink/privatelink-access-aws-services.html)。 *AWS PrivateLink *

### NAT Gateway 需求
<a name="vpc-nat-gateway-requirements"></a>

對於需要公有網際網路存取的執行：
+ NAT Gateway 必須部署在公有子網路中
+ 公有子網路必須具有網際網路閘道的路由
+ 私有子網路 （其中執行） 必須具有 NAT Gateway 的路由

**注意**  
NAT Gateway 會產生每小時費用和資料處理費用。如需成本最佳化，請考慮使用 VPC 端點進行 AWS 服務存取，而不是透過 NAT Gateway 路由。

## 安全群組組態
<a name="vpc-internet-security-groups"></a>

設定您的安全群組，以允許傳出流量傳送到您的執行需要存取的目的地：
+ **公有網際網路存取** — 允許傳出 HTTPS （連接埠 443) 流量。視需要新增其他通訊協定的規則，例如 HTTP （連接埠 80)。
+ **特定服務** — 根據您的需求設定規則。
+ **內部部署資源** — 允許流量流向 VPN 或 CIDR 範圍。

下列範例顯示公有網際網路存取的安全群組規則：


| Type | 通訊協定 | 連接埠範圍 | 目標 | Description | 
| --- | --- | --- | --- | --- | 
| HTTPS | TCP | 443 | 0.0.0.0/0 | 允許 HTTPS 到網際網路 | 

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

確保您的私有子網路具有路由表項目，可將網際網路流量導向 NAT 閘道：


| 目標 | 目標 | 
| --- | --- | 
| 10.0.0.0/16 | 區域 | 
| 0.0.0.0/0 | nat-xxxxxxxxx | 

若要存取內部部署資源，請設定虛擬私有閘道或閘道的路由。

## AWS 服務的 IAM 許可
<a name="vpc-iam-permissions"></a>

當您的工作流程任務在 VPC 聯網模式下存取 Amazon Athena、 AWS Glue 或 Amazon DynamoDB 等 AWS 服務時，您必須將必要的許可新增至您傳遞給 `StartRun` API 的服務角色。如果沒有這些許可，您的工作流程任務將會失敗，並顯示 `AccessDeniedException`或 `UnauthorizedException` 錯誤。

**重要**  
服務角色許可與 VPC 聯網組態不同。即使有正確設定的 VPC 端點和安全群組，如果服務角色缺少必要的 IAM 許可，您的工作流程也會失敗。

如果您的工作流程失敗並出現許可錯誤，請檢查工作流程執行的 CloudWatch Logs 日誌。常見的錯誤訊息包括 `AccessDeniedException: You are not authorized to perform: action on the resource`（服務角色缺少必要的 IAM 許可） 或 `UnrecognizedClientException: The security token included in the request is invalid`（服務角色信任政策可能設定錯誤，或傳遞給 的角色 ARN `StartRun` 不正確）。

### 常見的服務許可
<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 Data Catalog 許可**  
對於存取 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 Data Catalog 的許可，您還必須授予適當的 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 Amazon S3 Tables 許可**  
對於讀取或寫入 Amazon S3 Tables 的工作流程：  

```
{
  "Effect": "Allow",
  "Action": [
    "s3tables:GetTableData",
    "s3tables:PutTableData"
  ],
  "Resource": "arn:aws:s3tables:{{region}}:{{account-id}}:bucket/{{bucket-name}}/table/{{table-id}}"
}
```
Amazon S3 Tables 使用與 Amazon S3 不同的端點。您必須為 Amazon S3 Tables 設定 VPC 端點，並確保您的安全群組允許傳出 HTTPS 流量 （連接埠 443) 到 Amazon S3 Tables 服務。

## 測試 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 閘道以進行網際網路存取。
+ 外部服務可從您的網路存取。
+ 您的帳戶提供足夠的 ENIs。
+ NAT 閘道位於具有網際網路閘道路由的公有子網路中。

**注意**  
網路輸送量從每個 ENI 的 10 Gbps 開始，並在 60 分鐘內以持續的流量擴展到 100 Gbps。如需具有立即高輸送量需求的工作流程，請聯絡 AWS Support。

## 範例
<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 請求，將來自 HealthOmics，並將按照 NCBI 設定的第三方費率進行調節。在尖峰用量期間，由於調節錯誤，您可能會遇到執行失敗。我們鼓勵使用者取得自己的 NCBI API 金鑰，並利用專用 APIs 來允許更高的並行和更好的開發體驗。

若要取得 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 金鑰會以 URL 參數傳遞
+ 相較於未驗證的存取 （每秒 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 閘道、資料傳輸和 ENIs的成本。使用 AWS Cost Explorer 監控您的用量。

1. **規劃可用區域。**確保您的子網路跨越 HealthOmics 操作以支援工作流程放置的可用區域。

1. **在每個 AZ 中使用 NAT 閘道。**對於生產工作負載，在每個可用區域中部署 NAT 閘道以提供備援。