

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

# 設定 AWS Lambda Web 函數的聯網
<a name="web-functions-networking"></a>

Web 函數接受來自用戶端的請求。它也可以連接其他資源來執行其工作，例如 VPC 中的資料庫、內部 API 或公有網際網路上的服務。您可以獨立設定這兩個方向。您可以向發起人公開端點，而不授予 VPC 存取權，或提供函數私有傳出存取權，而不變更誰可以叫用它。

傳入流量會透過端點到達 Web 函數。端點會定義其網域名稱、端點類型、區域和授權組態。傳出流量是在修訂版上設定。沒有輸出網路連接器的修訂版會直接到達公有`IPv4`目的地。參考連接器的修訂會透過您的 VPC 傳送其傳出流量。Web 函數會在 Lambda 擁有和管理的基礎設施上執行，而不是在您的 VPC 內。輸出網路連接器只會新增傳出 VPC 存取。它不會變更用戶端到達端點的方式，或允許誰叫用它。

**注意**  
Web Function 端點網域名稱可從公有網際網路存取。 AWS PrivateLink 介面端點不適用於 Web Function 端點網域名稱。使用端點的授權組態來控制存取。

## 傳入連線能力
<a name="web-functions-networking-inbound"></a>

用戶端會透過 Lambda 管理的公有 HTTPS 端點叫用 Web 函數。Lambda 終止 TLS 並將請求轉送到應用程式的 HTTP 伺服器。受管端點支援 HTTP/1.1。它不會公開私有 VPC 地址或接受與執行環境的直接連線。

`IamAuth` 會控制誰可以叫用端點，但不會讓端點在網路層私有。如需授權選項，請參閱 [Lambda Web 函數端點存取控制](web-functions-endpoint-access-control.md)。

端點控制請求路由、授權、限流和擴展。其端點類型和區域集會在您建立時修正。若要變更任一屬性，請建立新的端點，並將用戶端移至其新的網域名稱。

端點組態獨立於 VPC 輸出。將輸出網路連接器新增至修訂版並不會使端點成為私有，也不會限制傳入請求。

**重要**  
您只能將輸出網路連接器與`HomeRegion`端點搭配使用。Lambda 拒絕嘗試將 `MultiRegion`或 `PerRegion` 端點路由到參考輸出網路連接器的修訂版。

當修訂版權重在具有不同連接器組態的修訂版之間分割流量時，請求會使用不同的網路路徑。當您診斷間歇性連線時，請先檢查端點的自動部署模式和修訂權重。如需他們將請求路由到修訂的方式，請參閱 [部署模式](web-functions-deployment.md)。

### 在端點前方新增 HTTP 前門
<a name="web-functions-networking-front-door"></a>

前門是接收用戶端請求並將其轉送至端點的服務。它新增了自訂網域、快取或 Web 應用程式防火牆保護等功能。Web 函數端點不支援自訂網域名稱或直接 AWS WAF 關聯。當您在檢視器與邊緣、回應壓縮或 AWS WAF 控制項之間需要自訂網域、邊緣快取、HTTP/2 或 HTTP/3 時，請在端點前面使用 Amazon CloudFront。

下圖顯示生產前門。用戶端連線至受 保護的 CloudFront 自訂網域 AWS WAF。CloudFront 會將請求傳送至受保護的 Web Function 端點，並將其路由至執行環境。如果沒有輸出網路連接器，應用程式可以呼叫公有 AWS 服務或網際網路端點。它無法連接只有私有 VPC 地址的資源。若要連接這些資源，請參閱 [將 Web 函數連接至 VPC](#web-functions-networking-vpc)。使用 `IamAuth`，CloudFront 會簽署每個原始伺服器請求，而 Lambda 會在叫用函數之前授權請求。Lambda 會保留檢視器的原始`Authorization`標頭，並將其轉送至您的函數。Lambda 提供的網域僅接受具有叫用許可之主體的簽署請求，並拒絕未簽署的直接請求，例如直接呼叫網域的瀏覽器。為了確保端點僅接受來自分佈的呼叫，請新增以資源為基礎的政策，以授予 CloudFront 服務主體叫用許可，並使用來源 ARN 條件將其限定到分佈的 Amazon Resource Name (ARN)。使用 時`ApplicationManaged`，端點為公有，直接請求會繞過 CloudFront 和 AWS WAF。

![檢視器會使用受 保護的自訂網域連線至 CloudFront 分佈 AWS WAF。CloudFront 會將原始伺服器請求簽署到使用 IamAuth 的 Web 函數端點。對 Lambda 提供之網域的未簽署直接請求會遭到拒絕。](https://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/web-functions-production-front-door.png)


1. 將 Web 函數網域設定為 HTTPS 自訂原始伺服器。

1. 將憑證和替代網域名稱連接到分佈，並將您的網域名稱系統 (DNS) 記錄指向分佈。

1. 僅轉送應用程式所需的標頭、Cookie 和查詢字串。請勿轉送檢視器的`Host`標頭，因為 Lambda 會在 上路由`Host`，並在其不是端點網域時傳回 HTTP 404。如果您使用轉送所有檢視器標頭的受管原始伺服器請求政策，請選擇 `AllViewerExceptHostHeader`。端點標頭限制包括轉送的標頭。

1. （選用） 當您需要 IP、機器人、速率型或受管規則檢查時，連接 AWS WAF Web ACL。

1. 保護原始伺服器，讓用戶端無法略過分佈。對於 IAM 授權的端點，僅授予對預期前門身分的存取權。對於應用程式受管授權， 需要並驗證原始伺服器秘密或其他應用程式層級的證明，以證明請求是透過分發發出的。

如需 CloudFront 授權程序，請參閱 [CloudFront 整合](web-functions-endpoint-access-control.md#web-functions-endpoint-access-control-cloudfront)。

### 瀏覽器存取和 CORS
<a name="web-functions-networking-cors"></a>

Lambda 不會為 Web 函數新增跨來源資源共用 (CORS) 標頭。您的應用程式或前門必須處理預檢和實際請求。
+ 傳回允許的原始伺服器，而不是反映每個`Origin`值。
+ 僅允許應用程式使用的方法和請求標頭。
+ 當瀏覽器傳送登入資料時，請使用明確的原始伺服器並傳回 `Access-Control-Allow-Credentials: true`。請勿將登入資料與萬用字元原始伺服器結合。
+ 將`OPTIONS`預檢請求與應用程式方法分開測試。
+ 驗證和授權每個受保護的請求。CORS 不是身分驗證控制。

### 串流和通訊協定限制
<a name="web-functions-networking-protocols"></a>

Web Functions 會在應用程式送達時將請求內文串流到您的應用程式，並透過 HTTP/1.1 將回應串流回用戶端。請求路徑為半雙工：Lambda 會在交付應用程式的回應之前轉送完整的請求內文。在您撰寫回應之前，請先完整閱讀請求內文。設定 `timeoutSeconds`以涵蓋雙向的串流：接收請求內文並傳送回應。當逾時過後，Lambda 會結束回應。用戶端會收到已傳送的狀態碼，內含截斷的內文。在用戶端中斷連線時停止上游工作。

Lambda 不支援 WebSocket 升級。Lambda 會在轉送請求之前移除連線特定的升級標頭。當單向伺服器server-to-client傳送的事件。

如需完整的標頭和方法合約，請參閱 [HTTP 請求和回應](web-functions-http.md)。

## 傳出連線
<a name="web-functions-networking-outbound"></a>

您可以選擇每個修訂的傳出網路路徑。
+ 沒有輸出網路連接器 – 修訂會直接到達公有`IPv4`目的地，而不會周遊您的 VPC。來源地址是由 Lambda 管理、不穩定，且不適合允許清單。修訂沒有通往 VPC 中私有資源的路由。
+ 使用輸出網路連接器 – 修訂會透過連接器子網路中的彈性網路界面傳送傳出流量。您的 VPC 路由表、安全群組和網路存取控制清單 (ACLs適用。使用此選項可連接私有 VPC 資源、透過 Direct Connect 或 VPN 連線的內部部署網路，或需要您地址空間流量的目的地。

參考連接器會取代預設的傳出路徑。連接器會在您的 VPC 中放置流量，但不提供網際網路存取。若要到達公有`IPv4`目的地，連接器子網路需要 NAT 閘道的路由。若要到達公有`IPv6`目的地，他們需要通往輸出限定網際網路閘道的路由。

連接器流量沒有穩定的來源 IP 地址。設定目的地安全群組以允許連接器的安全群組。如果目的地不支援安全群組參考，請允許連接器子網路 CIDR 區塊，而非個別地址。

Lambda 會以非同步方式執行連接器操作。連接器會在 Lambda 建立其網路介面`PENDING`時報告，以及`ACTIVE`何時修訂可以參考它。其他狀態包括 `INACTIVE`、`DELETING`、 `FAILED`和 `DELETE_FAILED`。

更新後，請檢查 `LastUpdateStatus` `InProgress`、 `Successful`或 `Failed`。如果操作失敗，請使用其狀態原因和原因代碼來識別受影響的子網路、安全群組、許可或 IP 地址容量。

### DNS 解析
<a name="web-functions-networking-dns"></a>

對於私有 DNS 名稱，請在連接器的 VPC 中啟用 DNS 支援和 DNS 主機名稱。將任何必要的 Route 53 私有託管區域與該 VPC 建立關聯。

每個執行環境都會快取 DNS 答案。變更 DNS 記錄後，現有環境會繼續使用舊答案，直到快取值過期或 Lambda 取代環境為止。若要強制進行清理推展，請建立新的修訂，並將端點流量轉移到其中。

疑難排解時，請分別測試名稱解析和網路連線能力。依 IP 地址連線至目的地以驗證網路路徑，然後測試其 DNS 名稱。

## 將 Web 函數連接至 VPC
<a name="web-functions-networking-vpc"></a>

輸出網路連接器是可重複使用的 Lambda 資源。您建立一次連接器，並從每個需要 VPC 存取的 Web 函數修訂版參考已發佈的連接器版本。

對於 Web 函數，連接器參考具有下列屬性：
+ 修訂版參考零或一個連接器。
+ 連接器 ARN 必須包含版本限定詞。
+ 連接器必須與 Web 函數位於相同的 AWS 帳戶和區域。
+ 連接器必須具有 `WebFunction`作為其關聯的運算資源類型。
+ 只有`HomeRegion`端點支援參考輸出網路連接器的修訂版。
+ 您無法在設定參考之後變更參考。若要新增、變更或移除它，請建立新的修訂。

### 先決條件
<a name="web-functions-networking-vpc-prerequisites"></a>

建立連接器之前：
+ 在具有可用 IP 地址的不同可用區域中選擇至少兩個子網路。
+ 選擇允許所需傳出流量的安全群組。
+ 允許來自每個目的地上連接器安全群組的傳入流量。
+ 設定從連接器子網路到所需私有、內部部署或公有目的地的路由。
+ 建立 運算子角色，授予 Lambda 管理網路介面的許可。
+ 請確定建立連接器和修訂版的身分具有 中的許可[設定聯網的許可](web-functions-permissions.md#web-functions-permissions-networking)，包括`lambda:PassNetworkConnector`連接器和操作員角色`iam:PassRole`的許可。

連接器的運算子角色和修訂版的執行角色具有不同的用途。運算子角色會管理 VPC 中的網路介面。執行角色會授予您的應用程式呼叫 AWS APIs的許可。您不會將連接器網路介面許可新增至執行角色。

### 運算子角色許可
<a name="web-functions-networking-vpc-operator-role"></a>

Lambda 會擔任連接器的運算子角色來管理連接器的網路介面。角色的信任政策必須允許 Lambda 服務主體 `lambda.amazonaws.com`擔任該角色：

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

將如下所示的許可政策連接至連接器的運算子角色。此政策允許 Lambda 建立和標記連接器的網路介面：

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "CreateENI",
      "Effect": "Allow",
      "Action": "ec2:CreateNetworkInterface",
      "Resource": [
        "arn:aws:ec2:*:*:network-interface/*",
        "arn:aws:ec2:*:*:subnet/*",
        "arn:aws:ec2:*:*:security-group/*"
      ]
    },
    {
      "Sid": "TagENI",
      "Effect": "Allow",
      "Action": "ec2:CreateTags",
      "Resource": "arn:aws:ec2:*:*:network-interface/*",
      "Condition": {
        "StringEquals": {
          "ec2:ManagedResourceOperator": "network-connectors.lambda.amazonaws.com"
        }
      }
    }
  ]
}
```

### 建立 連接器
<a name="web-functions-networking-vpc-create-connector"></a>

下列 AWS CLI 命令會建立 Web Functions 的`IPv4`連接器。使用您自己的值取代連接器名稱、子網路 IDs、安全群組 ID 和運算子角色 ARN。

```
aws lambda-core create-network-connector \
  --name my-connector \
  --configuration '{
    "VpcEgressConfiguration": {
      "SubnetIds": [
        "subnet-0ab1c2d3e4f5a6b78",
        "subnet-1bc2d3e4f5a6b7c89"
      ],
      "SecurityGroupIds": ["sg-0123456789abcdef0"],
      "NetworkProtocol": "IPv4",
      "AssociatedComputeResourceTypes": ["WebFunction"]
    }
  }' \
  --operator-role arn:aws:iam::123456789012:role/NetworkConnectorOperatorRole
```

連接器支援一種運算資源類型。Web Functions 的連接器不支援其他 Lambda 運算類型，且其運算資源類型不可變。

Lambda 會以非同步方式建立連接器。使用 `get-network-connector` 等待其`State`為 `ACTIVE`，並記下目前的版本編號。

### 參考修訂版的連接器
<a name="web-functions-networking-vpc-reference-revision"></a>

當您建立 Web 函數的第一個修訂版或更新版本`serviceConfig.egressNetworkConnectorArn`時，請設定 。使用符合版本資格的 ARN：

```
arn:aws:lambda:us-east-1:123456789012:network-connector:nc-0a1b2c3d4e5f6a7b8:4
```

下列 AWS CLI 命令會建立參考連接器第 4 版的修訂。將函數名稱、執行角色 ARN、連接器 ARN 和區域取代為您自己的值。

```
aws lambda-web create-web-function-revision \
  --function-name my-web-function \
  --build-config file://build-config.json \
  --service-config '{
    "executionRoleArn": "arn:aws:iam::123456789012:role/WebFunctionExecutionRole",
    "timeoutSeconds": 30,
    "egressNetworkConnectorArn": "arn:aws:lambda:us-east-1:123456789012:network-connector:nc-0a1b2c3d4e5f6a7b8:4"
  }' \
  --region us-east-1
```

修訂時不接受不合格的 ARN、連接器名稱或連接器 ID。建立修訂之後：
+ 等到修訂版的狀態為 `Active`。
+ 閱讀修訂並確認 `egressNetworkConnectorArn`包含預期的連接器版本。
+ 確認端點將流量路由到修訂版。`LatestRevision` 模式中的`HomeRegion`端點會自動取得最新的作用中修訂。對於處於 `Disabled` 模式的端點，請更新其修訂權重。
+ 使用 VPC 流程日誌測試 VPC 目的地並確認流量。

端點的自動部署模式會決定是否自動建立作用中的修訂更新路由。在所有模式下，在測試其連接器之前，確認哪個修訂正在服務。

## 更新或移除 VPC 連線
<a name="web-functions-networking-update-remove"></a>

更新連接器會發佈新版本。現有的修訂會保留在其連接器 ARN 中鎖定至 版本。

若要推展連接器變更：
+ 使用 更新連接器`update-network-connector`。連接器必須是 `ACTIVE`。提供完整的 `VpcEgressConfiguration`，包括您要保留的每個子網路 ID 和安全群組 ID，因為更新會取代現有的組態。
+ 等待連接器的 `LastUpdateStatus`變成 `Successful`。
+ 取得新的連接器版本。
+ 建立參考新版本合格 ARN 的修訂。
+ 對於處於 `LatestRevision` 模式的`HomeRegion`端點，請確認其已取得新的作用中修訂。對於處於 `Disabled` 模式的端點，請更新其修訂權重來轉移流量。

更新連接器而不建立參考其新版本的修訂，並不會變更執行 Web 函數的網路組態。

若要移除 VPC 連線，請建立不含 的修訂`egressNetworkConnectorArn`。處於 `LatestRevision` 模式的`HomeRegion`端點會在其變為作用中時接收它。對於處於 `Disabled` 模式的端點，請更新其修訂權重來轉移流量。新修訂版本使用 Lambda 管理的公有輸出，不再具有私有 VPC `IPv4` 存取權。

**注意**  
刪除輸出網路連接器之前，請將端點流量移離參考連接器任何版本的每個 Web 函數修訂，然後刪除這些修訂。在作用中修訂仍然參考時刪除連接器，它會中斷現有和新執行環境的網路連線，以提供該修訂。

## IPv6 支援
<a name="web-functions-networking-ipv6"></a>

預設傳出路徑和 `IPv4` 連接器`IPv4`僅支援 。若要使用 `IPv6`，請將 連接器設定為 `NetworkProtocol` `DualStack`。

對於雙堆疊連線：
+ VPC 和連接器子網路必須具有 `IPv6` CIDR 區塊。
+ 路由表必須包含所需`IPv6`目的地的路由。
+ 安全群組和網路 ACLs 必須允許`IPv6`流量。
+ 公有`IPv6`存取需要 ：：/0 路由至輸出限定網際網路閘道。
+ 參考將連接器更新為 時建立的連接器版本`DualStack`。

不要透過檢查執行環境中的界面來判斷`IPv6`可用性。透過從應用程式碼進行`IPv6`連線並檢查 VPC 流程日誌來驗證。