

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

# 設定 AWS Lambda 函數
<a name="lambda-functions"></a>

了解如何使用 Lambda API 或主控台來設定 Lambda 函數的核心功能和選項。

**[.zip 檔案封存](configuration-function-zip.md) **  
當您想要包含相依性、自訂執行時間層或函數程式碼以外的任何檔案時，請建立 Lambda 函數部署套件。部署套件是包含函數程式碼和相依性的 .zip 檔案封存。

**[容器映像](images-create.md) **  
當您需要更多對建置程序的控制，或您的函數需要自訂執行時間組態時，請使用容器映像來封裝函數程式碼和相依性。您可以使用 Docker CLI 等工具，建置、測試和部署 Lambda 函數做為容器映像。

**[記憶體](configuration-memory.md)**  
了解如何以及何時增加函數記憶體。

**[暫時性儲存](configuration-ephemeral-storage.md) **  
了解如何以及何時增加函數的臨時儲存容量。

**[Timeout (逾時)](configuration-timeout.md) **  
了解如何以及何時增加函數的逾時值。

**[耐用的組態](durable-configuration.md) **  
讓您的 Lambda 函數在叫用之間維持狀態的同時，可以長時間執行，最長可達一年。設定長時間執行、具狀態工作流程的執行逾時、狀態保留和版本控制行為。耐用的函數可讓您建置複雜的多步驟程序，以暫停、繼續和自動處理中斷。

** [環境變數](configuration-envvars.md)**  
您可以讓函數程式碼具備可攜性，並使用環境變量來將它們儲存在函數的組態中，以便保存在程式碼之外。

**[傳出網路](configuration-vpc.md) **  
 您可以使用 Lambda 函數搭配 Amazon VPC 中的 AWS 資源。將函數連線到 VPC 可讓您在關聯式資料庫和快取等私有子網路中存取資源。

** [傳入網路](configuration-vpc-endpoints.md)**  
您可以使用界面 VPC 端點來叫用您的 Lambda 函數，而不需要透過公有網際網路。

**[檔案系統](configuration-filesystem.md)**  
 您可以使用 Lambda 函數來將 Amazon EFS 掛載至本機目錄。檔案系統可讓您的函數程式碼安全存取和修改共用資源，並發揮高度並行效能。

**[別名](configuration-aliases.md)**  
您可以將用戶端設定為使用別名來調用特定的 Lambda 函數版本，而非更新用戶端。

**[版本](configuration-versions.md)**  
發佈您的函數版本，即可將程式碼和組態儲存為無法變更的獨立資源。

**[Tags](configuration-tags.md) (標籤)**  
使用標籤來啟用屬性型存取控制 (ABAC)、組織 Lambda 函數，以及使用 AWS Cost Explorer 或 AWS Billing and Cost Management 服務篩選和產生函數的報告。

**[回應串流](configuration-response-streaming.md)**  
您可以設定 Lambda 函數 URL，將回應承載串流回用戶端。透過提高第一個位元組時間 (TTFB) 效能，回應串流有益於延遲敏感應用程式。這是因為您可以在部分回應可用時將其傳回給用戶端。此外，您可以使用回應串流來建置可傳回更大承載的函數。

**[中繼資料端點](configuration-metadata-endpoint.md)**  
使用 Lambda 中繼資料端點來探索函數正在執行的可用區域，讓您能夠透過路由至相同可用區域資源來最佳化延遲，並實作可用區域感知彈性模式。

# 以 .zip 封存檔形式部署 Lambda 函數
<a name="configuration-function-zip"></a>

當您建立 Lambda 函數時，可以將函數程式碼封裝到部署套件中。Lambda 支援兩種類型的部署套件：容器映像和 .zip 封存檔。建立函數的工作流程取決於部署套件類型。若要設定一個定義為容器映像的函數，請參閱[使用容器映像建立 Lambda 函數](images-create.md)。

可使用 Lambda 主控台和 Lambda API 來建立以 .zip 封存檔定義的函數。也可以上傳更新的 .zip 檔案來變更函數程式碼。

**注意**  
不能變更現有函數的[部署套件類型](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html#lambda-CreateFunction-request-PackageType) (.zip 或容器映像)。例如，您不能轉換容器映像函數以使用 .zip 封存檔。您必須建立新的函數。

**Topics**
+ [

## 建立函數
](#configuration-function-create)
+ [

## 使用主控台程式碼編輯器
](#configuration-functions-console-update)
+ [

## 更新函數程式碼
](#configuration-function-update)
+ [

## 變更執行階段
](#configuration-function-runtime)
+ [

## 變更架構
](#configuration-function-arch)
+ [

## 使用 Lambda API
](#configuration-function-api)
+ [

## 下載函式程式碼
](#configuration-function-download)
+ [

## CloudFormation
](#configuration-function-cloudformation)
+ [

# 加密 Lambda .zip 部署套件
](encrypt-zip-package.md)

## 建立函數
<a name="configuration-function-create"></a>

當您建立以 .zip 封存檔定義的函數時，您可以選擇函數的程式碼範本、語言版本和執行角色。Lambda 建立函數後，您可以新增函數程式碼。

**建立函數**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇**建立函數**。

1. 選擇 **Author from scratch** (從頭開始編寫) 或 **Use a blueprint** (使用藍圖) 來建立函數。

1. 在 **基本資訊** 下，請執行下列動作：

   1. 針對 **函數名稱**，輸入函數名稱。函數名稱的長度限制為 64 個字元。

   1. 對於**執行時間**，選擇函數要使用的語言版本。

   1. (選用) 對於 **Architecture** (架構)，選擇要用於函數的指令集架構。預設架構值為 x86\$164。為您的函數建置部署套件時，確定它與此[指令集架構](foundation-arch.md)相容。

1. (選用) 在**許可**下，展開**變更預設執行角色**。您可建立新的**執行角色**，或使用現有的角色。

1. (選用) 展開 **Advanced settings (進階設定)**。您可對函數選擇**程式碼簽署組態**。您也可以為函數設定 (Amazon VPC) 進行存取。

1. 選擇**建立函數**。

Lambda 建立新函數。您現在可以使用主控台來新增函數程式碼，並設定其他函數參數與功能。如需程式碼部署指示，請參閱函數所用執行時間的處理常式頁面。

------
#### [ Node.js ]

[使用 .zip 封存檔部署 Node.js Lambda 函數](nodejs-package.md) 

------
#### [ Python ]

 [使用 .zip 封存檔部署 Python Lambda 函數](python-package.md) 

------
#### [ Ruby ]

 [使用 .zip 封存檔部署 Ruby Lambda 函數](ruby-package.md) 

------
#### [ Java ]

 [使用 .zip 或 JAR 封存檔部署 Java Lambda 函數](java-package.md) 

------
#### [ Go ]

 [使用 .zip 封存檔部署 Go Lambda 函數](golang-package.md) 

------
#### [ C\$1 ]

 [使用 .zip 封存檔建置和部署 C＃ Lambda 函數](csharp-package.md) 

------
#### [ PowerShell ]

 [使用 .zip 封存檔部署 PowerShell Lambda 函數](powershell-package.md) 

------

## 使用主控台程式碼編輯器
<a name="configuration-functions-console-update"></a>

主控台將建立具有單一來源檔案的 Lambda 函數。對於指令碼語言，您可以使用內建的程式碼編輯器編輯該檔案並新增更多檔案。選擇 **Save** (儲存) 以儲存變更。然後，若要執行程式碼，請選擇 **Test** (測試)。

當您儲存函數程式碼時，Lambda 主控台會建立 .zip 封存檔部署套件。當您在主控台之外開發函數程式碼 (使用 IDE) 時，您需要[建立部署套件](nodejs-package.md)將您的程式碼上傳到 Lambda 函數。

## 更新函數程式碼
<a name="configuration-function-update"></a>

對於指令碼語言 (Node.js、Python 和 Ruby)，您可以在內嵌的程式碼編輯器中編輯函數程式碼。如果程式碼大於 3MB，或如果您需要新增程式庫，或對於編輯器不支援的語言 (Java、Go、C\$1)，必須將函數程式碼上傳為 .zip 封存。如果 .zip 封存檔小於 50 MB，您可以從本機電腦上傳 .zip 封存檔。如果此檔案大於 50 MB，請將該檔案從 Amazon S3 儲存貯體上傳至函數。

**若要將函數程式碼上傳為 .zip 封存**

1. 開啟 Lambda 主控台中的[函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇要更新的函數並選擇 **Code** (程式碼) 索引標籤。

1. 在**程式碼來源**下，選擇**上傳自**。

1. 選擇 **.zip file** (.zip 檔案)，然後選擇 **Upload** (上傳)。

   1. 在檔案選擇器中，選取新的映像版本、選擇 **Open** (開啟)，然後選擇 **Save** (儲存)。

1. (替代步驟 4) 選擇 **Amazon S3 location** (Amazon S3 位置)。

   1. 在文字方塊中，輸入 .zip 封存檔的 S3 連結 URL，然後選擇 **Save** (儲存)。

## 變更執行階段
<a name="configuration-function-runtime"></a>

如果您將函數組態更新為使用新的執行階段，則可能需要更新函數程式碼，才能與新執行階段相容。如果您將函數組態更新為使用不同的執行時間，則**必須**提供與執行時間和架構相容的新函數程式碼。如需如何為函數程式碼建立部署套件的指示，請參閱函數所使用之執行時間的處理常式頁面。

Node.js 20、Python 3.12、Java 21、.NET 8、Ruby 3.3 和更新的基礎映像是以 Amazon Linux 2023 最小容器映像為基礎。舊版基礎映像使用 Amazon Linux 2。與 Amazon Linux 2 相比，AL2023 具有多項優點，包括更小的部署足跡和更新版本的程式庫，如 `glibc`。如需詳細資訊，請參閱 AWS 運算部落格上的[隆重介紹適用於 AWS Lambda的 Amazon Linux 2023 執行期](https://aws.amazon.com/blogs/compute/introducing-the-amazon-linux-2023-runtime-for-aws-lambda/)。

**變更執行階段**

1. 開啟 Lambda 主控台中的[函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇要更新的函數並選擇 **Code** (程式碼) 索引標籤。

1. 向下捲動到 **Runtime settings** (執行時間設定) 區段 (在程式碼編輯器下)。

1. 選擇**編輯**。

   1. 請在 **Runtime** (執行階段) 選取執行階段識別符。

   1. 對於 **Handler** (處理常式)，指定函數的處理常式。

   1. 對於 **Architecture** (架構)，選擇要用於函數的指令集架構。

1. 選擇**儲存**。

## 變更架構
<a name="configuration-function-arch"></a>

在可以變更指令集架構之前，您需要確保函數的程式碼與目標架構相容。

如果您使用 Node.js、Python 或 Ruby，並在內嵌的編輯器中編輯您的函數程式碼，則現有的程式碼可能無需修改即可執行。

不過，如果您使用 .zip 封存檔部署套件來提供函數程式碼，則必須準備新的 .zip 封存檔，該封存檔會針對目標執行時間和指令集架構正確地進行編譯和建置。如需指示，請參閱函數執行時間的處理常式頁面。

**變更指令集架構**

1. 開啟 Lambda 主控台中的[函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇要更新的函數並選擇 **Code** (程式碼) 索引標籤。

1. 在 **Runtime settings** (執行時間設定) 中，選擇 **Edit** (編輯)。

1. 對於 **Architecture** (架構)，選擇要用於函數的指令集架構。

1. 選擇**儲存**。

## 使用 Lambda API
<a name="configuration-function-api"></a>

若要建立及設定使用 .zip 封存檔的函數，請使用下列 API 操作：
+ [CreateFunction](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html)
+ [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html)
+ [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html)

## 下載函式程式碼
<a name="configuration-function-download"></a>

您可以透過 Lambda 主控台下載函式程式碼 .zip 的目前未發布 (`$LATEST`) 版本。若要執行此操作，請先確定您具有下列 IAM 許可：
+ `iam:GetPolicy`
+ `iam:GetPolicyVersion`
+ `iam:GetRole`
+ `iam:GetRolePolicy`
+ `iam:ListAttachedRolePolicies`
+ `iam:ListRolePolicies`
+ `iam:ListRoles`

**若要下載函式程式碼 .zip**

1. 開啟 Lambda 主控台中的[函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇要下載其函式程式碼 .zip 的函式。

1. 在**函式概觀**頁面中，點選**下載**按鈕，接著選擇**下載函式程式碼 .zip**。

   1. 或者，根據函數的組態，選擇**下載 AWS SAM 檔案**以產生和下載 SAM 範本。您也可以選擇**下載兩者**，同時下載 .zip 與 SAM 範本。

## CloudFormation
<a name="configuration-function-cloudformation"></a>

您可以使用 CloudFormation 建立使用 .zip 檔案封存的 Lambda 函數。在您的 CloudFormation 範本中，`AWS::Lambda::Function`資源會指定 Lambda 函數。如需 `AWS::Lambda::Function` 資源中的屬性說明，請參閱 *AWS CloudFormation 使用者指南*中的 [AWS::Lambda::Function](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html)。

在 `AWS::Lambda::Function` 資源中，設定下列屬性，以建立定義為 .zip 封存檔的函數：
+ AWS::Lambda::Function
  + PackageType - 設定為 `Zip`。
  + 程式碼 — 在 `S3Bucket` 和 `S3Key` 欄位中輸入 Amazon S3 儲存貯體名稱和 .zip 檔案名稱。對於 Node.js 或 Python，您可以提供 Lambda 函數的內嵌原始碼。
  + 執行時間 — 設定執行時間值。
  + 架構 – 將架構值設定為 `arm64` 以使用 AWS Graviton2 處理器。依預設，架構值為 `x86_64`。

# 加密 Lambda .zip 部署套件
<a name="encrypt-zip-package"></a>

Lambda 一般使用 AWS KMS key為 .zip 部署套件和函數組態詳細資訊提供靜態伺服器端加密。預設情況下，Lambda 使用 [AWS 擁有的金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk)。如果此預設行為符合您的工作流程，您不需要設定任何其他項目。 AWS 不會向您收取使用此金鑰的費用。

如果您願意，您可以改為提供 AWS KMS 客戶受管金鑰。您可以這樣做以控制 KMS 金鑰的輪換或滿足您的組織對管理 KMS 金鑰的請求。當您使用客戶受管的金鑰時，只有您帳戶中具有 KMS 金鑰存取權的使用者才能檢視或管理函數的程式碼或組態。

客戶受管金鑰會產生標準 AWS KMS 費用。如需詳細資訊，請參閱 [AWS Key Management Service 定價](https://aws.amazon.com/kms/pricing/)。

## 建立客戶自管金鑰
<a name="create-key"></a>

 您可以使用 AWS 管理主控台或 AWS KMS APIs 來建立對稱客戶受管金鑰。

**建立對稱客戶受管金鑰**

請依照《AWS Key Management Service 開發人員指南》中的[建立對稱加密，建立對稱 KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)步驟執行。**

### 許可
<a name="enable-zip-permissions"></a>

**金鑰政策**

[金鑰政策](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)會控制客戶受管金鑰的存取權限。每個客戶受管金鑰都必須只有一個金鑰政策，其中包含決定誰可以使用金鑰及其使用方式的陳述式。如需詳細資訊，請參閱《AWS Key Management Service 開發人員指南》**中的[如何變更金鑰政策](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html#key-policy-modifying-how-to)。

使用客戶受管金鑰來加密 .zip 部署套件時，Lambda 不會為金鑰新增[授權](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)。相反地，您的 AWS KMS 金鑰政策必須允許 Lambda 代表您呼叫下列 AWS KMS API 操作：
+ [kms:GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)
+ [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)

下列範例金鑰政策允許帳戶 111122223333 中的所有 Lambda 函數呼叫指定客戶受管金鑰的必要 AWS KMS 操作：

**Example AWS KMS 金鑰政策**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Action": [
                "kms:GenerateDataKey",
                "kms:Decrypt"
            ],
            "Resource": "arn:aws:kms:us-east-1:111122223333:key/key-id",
            "Condition": {
                "StringLike": {
                "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:111122223333:function:*"
                }
            }
        }
    ]
}
```

如需有關[故障診斷金鑰存取](https://docs.aws.amazon.com/kms/latest/developerguide/policy-evaluation.html#example-no-iam)的詳細資訊，請參閱《AWS Key Management Service 開發人員指南》**。

**主體許可**

當您使用客戶受管金鑰來加密 .zip 部署套件時，只有可存取該金鑰的[主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html)才能存取 .zip 部署套件。例如，無法存取客戶受管金鑰的主體無法使用包含在 [GetFunction](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html) 回應中的預先簽章 S3 URL 下載 .zip 套件。回應的 `Code` 區段中會傳回 `AccessDeniedException`。

**Example AWS KMS AccessDeniedException**  

```
{
    "Code": {
        "RepositoryType": "S3",
        "Error": {
            "ErrorCode": "AccessDeniedException",
            "Message": "KMS access is denied. Check your KMS permissions. KMS Exception: AccessDeniedException KMS Message: User: arn:aws:sts::111122223333:assumed-role/LambdaTestRole/session is not authorized to perform: kms:Decrypt on resource: arn:aws:kms:us-east-1:111122223333:key/key-id with an explicit deny in a resource-based policy"
        },
        "SourceKMSKeyArn": "arn:aws:kms:us-east-1:111122223333:key/key-id"
    },
	...
```

如需 AWS KMS 金鑰許可的詳細資訊，請參閱 [的身分驗證和存取控制 AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/control-access.html)。

## 將客戶受管金鑰用於 .zip 部署套件
<a name="enable-zip-custom-encryption"></a>

使用下列 API 參數來設定 .zip 部署套件的客戶受管金鑰：
+ [SourceKMSKeyArn](https://docs.aws.amazon.com/lambda/latest/api/API_FunctionCode.html#lambda-Type-FunctionCode-SourceKMSKeyArn)：加密來源 .zip 部署套件 (您上傳的檔案)。
+ [KMSKeyArn](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html#lambda-CreateFunction-request-KMSKeyArn)：加密[環境變數](configuration-envvars-encryption.md)和 [Lambda SnapStart](snapstart.md) 快照。

指定 `SourceKMSKeyArn` 和 `KMSKeyArn` 時，Lambda 會使用 `KMSKeyArn` 金鑰來加密 Lambda 用來調用函數的解壓縮套件版本。當已指定 `SourceKMSKeyArn` 但未指定 `KMSKeyArn` 時，Lambda 會使用 [AWS 受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) 來加密套件的解壓縮版本。

------
#### [ Lambda console ]

**若要在建立函數時新增客戶受管金鑰加密**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇**建立函數**。

1. 選擇 **Author from scratch** (從頭開始撰寫) 或 **Container image** (容器映像)。

1. 在 **基本資訊** 下，請執行下列動作：

   1. 針對 **函數名稱**，輸入函數名稱。

   1. 對於**執行時間**，選擇函數要使用的語言版本。

1. 展開**進階設定**，然後選取**使用 AWS KMS 客戶受管金鑰啟用加密**。

1. 選擇客戶受管金鑰。

1. 選擇**建立函數**。

若要移除客戶受管金鑰加密，或使用不同的金鑰，必須再次上傳 .zip 部署套件。

**若要將客戶受管金鑰加密新增至現有函數**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇函數的名稱。

1. 在**程式碼來源**窗格中選擇**上傳來源**。

1. 選擇 **.zip 檔案**或 **Amazon S3 位置**。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/upload-zip.png)

1. 上傳檔案或輸入 Amazon S3 位置。

1. 選擇**使用 AWS KMS 客戶受管金鑰啟用加密**。

1. 選擇客戶受管金鑰。

1. 選擇**儲存**。

------
#### [ AWS CLI ]

**若要在建立函數時新增客戶受管金鑰加密**

在下列 [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html) 範例中：
+ `--code`：指定 .zip 部署套件的本機路徑 (`ZipFile`) 和客戶受管金鑰來加密它 (`SourceKMSKeyArn`)。
+ `--kms-key-arn`：指定客戶受管金鑰，以加密環境變數和部署套件的解壓縮版本。

```
aws lambda create-function \
  --function-name myFunction \
  --runtime nodejs24.x \
  --handler index.handler \
  --role arn:aws:iam::111122223333:role/service-role/my-lambda-role \
  --code ZipFile=fileb://myFunction.zip,SourceKMSKeyArn=arn:aws:kms:us-east-1:111122223333:key/key-id \
  --kms-key-arn arn:aws:kms:us-east-1:111122223333:key/key2-id
```

在下列 [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html) 範例中：
+ `--code`：指定 Amazon S3 儲存貯體 (`S3Bucket`、`S3Key`、`S3ObjectVersion`) 中 .zip 檔案的位置，以及用於加密檔案的客戶受管金鑰 ()`SourceKMSKeyArn`。
+ `--kms-key-arn`：指定客戶受管金鑰，以加密環境變數和部署套件的解壓縮版本。

```
aws lambda create-function \
  --function-name myFunction \
  --runtime nodejs24.x --handler index.handler \
  --role arn:aws:iam::111122223333:role/service-role/my-lambda-role \
  --code S3Bucket=amzn-s3-demo-bucket,S3Key=myFileName.zip,S3ObjectVersion=myObjectVersion,SourceKMSKeyArn=arn:aws:kms:us-east-1:111122223333:key/key-id \
  --kms-key-arn arn:aws:kms:us-east-1:111122223333:key/key2-id
```

**若要將客戶受管金鑰加密新增至現有函數**

在下列 [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html) 範例中：
+ `--zip-file`：指定 .zip 部署套件的本機路徑。
+ `--source-kms-key-arn`：指定客戶受管金鑰，以加密部署套件的壓縮版本。Lambda 使用 AWS 擁有的金鑰來加密用於函式調用的解壓縮套件。如果您想要使用客戶受管金鑰來加密套件的解壓縮版本，請使用 `--kms-key-arn` 選項執行 [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) 命令。

```
aws lambda update-function-code \
  --function-name myFunction \
  --zip-file fileb://myFunction.zip \
  --source-kms-key-arn arn:aws:kms:us-east-1:111122223333:key/key-id
```

在下列 [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html) 範例中：
+ `--s3-bucket`：指定 Amazon S3 儲存貯體中 .zip 檔案的位置。
+ `--s3-key`：指定部署套件的 Amazon S3 金鑰。
+ `--s3-object-version`：對於版本控制的物件，要使用的部署套件物件版本。
+ `--source-kms-key-arn`：指定客戶受管金鑰，以加密部署套件的壓縮版本。Lambda 使用 AWS 擁有的金鑰來加密用於函式調用的解壓縮套件。如果您想要使用客戶受管金鑰來加密套件的解壓縮版本，請使用 `--kms-key-arn` 選項執行 [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) 命令。

```
aws lambda update-function-code \
  --function-name myFunction \
  --s3-bucket amzn-s3-demo-bucket \
  --s3-key myFileName.zip \
  --s3-object-version myObject Version
  --source-kms-key-arn arn:aws:kms:us-east-1:111122223333:key/key-id
```

**若要從現有函數中移除客戶受管金鑰加密**

在下列 [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html) 範例中，`--zip-file`指定 .zip 部署套件的本機路徑。當您在沒有 `--source-kms-key-arn`選項的情況下執行此命令時，Lambda 會使用 AWS 擁有的金鑰來加密部署套件的壓縮版本。

```
aws lambda update-function-code \
  --function-name myFunction \
  --zip-file fileb://myFunction.zip
```

------

# 使用容器映像建立 Lambda 函數
<a name="images-create"></a>

 AWS Lambda 函數的程式碼包含指令碼或編譯的程式及其相依性。使用*部署套件*將函數程式碼部署到 Lambda。Lambda 支援兩種類型的部署套件：容器映像和 .zip 封存檔。

您可以透過三種方式為 Lambda 函數建置容器映像：
+ [使用 Lambda AWS 的基礎映像](#runtimes-images-lp)

  [AWS  基礎映像](#runtimes-images-lp)會預先載入語言執行期、用來管理 Lambda 與函數程式碼之間互動的執行期界面用戶端，以及用於本機測試的執行期界面模擬器。
+ [使用僅限 AWS 作業系統的基礎映像](#runtimes-images-provided)

  [AWS 僅限作業系統的基礎映像](https://gallery.ecr.aws/lambda/provided)包含 Amazon Linux 發行版本和[執行時間界面模擬器](https://github.com/aws/aws-lambda-runtime-interface-emulator/)。這些映像常用於為編譯語言 (如 [Go](go-image.md#go-image-provided) 和 [Rust](lambda-rust.md)) 和 Lambda 不提供基礎映像的語言或語言版本 (如 Node.js 19) 建置容器映像。您還可以使用僅限作業系統的基礎映像來實作[自訂執行期](runtimes-custom.md)。若要使映像檔與 Lambda 相容，您必須在映像中加入您語言的 [執行期介面用戶端](#images-ric)。
+ [使用非AWS 基礎映像](#images-types)

  您可以使用其他容器登錄檔中的替代基礎映像 (例如 Alpine Linux 或 Debian)。您也可以使用組織建立的自訂映像。若要使映像檔與 Lambda 相容，您必須在映像中加入您語言的 [執行期介面用戶端](#images-ric)。

**提示**  
若要縮短 Lambda 容器函數變成作用中狀態所需的時間，請參閱 Docker 文件中的[使用多階段建置](https://docs.docker.com/build/building/multi-stage/)。若要建置有效率的容器映像，請遵循[撰寫 Dockerfiles 的最佳實務](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/)。

若要使用容器映像建立 Lambda 函數，請在本機建置映像，然後將映像上傳到 Amazon Elastic Container Registry (Amazon ECR) 儲存庫。若您使用 [AWS Marketplace](https://docs.aws.amazon.com/marketplace/latest/userguide/container-based-products.html) 賣方提供的容器映像，需先將映像複製至私有 Amazon ECR 儲存庫。接著，請在建立函數時指定儲存庫 URI。Amazon ECR 儲存庫必須與 Lambda 函數位於相同的 AWS 區域 中。只要映像與 Lambda 函數位於相同的區域，您就可以使用不同 AWS 帳戶中的映像來建立函數。如需詳細資訊，請參閱[Amazon ECR 跨帳戶許可](#configuration-images-xaccount-permissions)。

**注意**  
Lambda 的容器映像不支援 Amazon ECR FIPS 端點。如果儲存庫 URI 包含 `ecr-fips`，則表示您正在使用 FIPS 端點。範例：`111122223333.dkr.ecr-fips.us-east-1.amazonaws.com`。

本頁面會說明建立 Lambda 相容容器映像檔的基礎映像類型和要求。

**注意**  
不能變更現有函數的[部署套件類型](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html#lambda-CreateFunction-request-PackageType) (.zip 或容器映像)。例如，您不能轉換容器映像函數以使用 .zip 封存檔。您必須建立新的函數。

**Topics**
+ [

## 要求
](#images-reqs)
+ [

## 使用 Lambda AWS 的基礎映像
](#runtimes-images-lp)
+ [

## 使用僅限 AWS 作業系統的基礎映像
](#runtimes-images-provided)
+ [

## 使用非AWS 基礎映像
](#images-types)
+ [

## 執行時期介面用戶端
](#images-ric)
+ [

## Amazon ECR 許可
](#gettingstarted-images-permissions)
+ [

## 函數生命週期
](#images-lifecycle)

## 要求
<a name="images-reqs"></a>

安裝 [AWS CLI 版本 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) 和 [Docker CLI](https://docs.docker.com/get-docker)。此外也請注意下列請求：
+ 該容器映像必須實作 [針對自訂執行時期使用 Lambda 執行時期 API](runtimes-api.md)。 AWS 開放原始碼 [ 執行期界面用戶端](#images-ric)會實作 API。您可以將執行期介面用戶端新增至您的偏好基礎映像中，以使其與 Lambda 相容。
+ 容器映像必須能夠在僅唯讀檔案系統上執行。您的函數程式碼可以存取具有 512 MB 和 10,240 MB 儲存空間的可寫入 `/tmp` 目錄，增量為 1 MB。
+ 預設 Lambda 使用者必須能夠讀取執行函數程式碼所需的所有檔案。Lambda 透過定義具有最低權限許可的預設 Linux 使用者來遵守安全最佳實務。這表示您不需要在 Dockerfile 中指定 [USER](https://docs.docker.com/reference/dockerfile/#user)。確認您的應用程式的程式碼不依賴其他 Linux 使用者無法執行的檔案。
+ Lambda 僅支援 Linux 容器映像。
+ Lambda 會提供多架構基礎映像。不過，您為函數建置的映像必須只以其中一個架構為目標。Lambda 不支援使用多架構容器映像的函數。

## 使用 Lambda AWS 的基礎映像
<a name="runtimes-images-lp"></a>

您可以使用 Lambda 的其中一個 [AWS  基礎映像](https://gallery.ecr.aws/lambda/) 來建置函數程式碼的容器映像。基礎映像會預先載入語言執行期，以及在 Lambda 上執行容器映像所需的其他元件。您可以將函數程式碼和相依項新增至基礎映像，然後將其封裝為容器映像。

AWS 會定期更新 Lambda AWS 的基礎映像。如果您的 Dockerfile 包含 FROM 屬性的映像名稱，則您的 Docker 用戶端會從 [Amazon ECR 儲存庫](https://gallery.ecr.aws/lambda/) 提取最新版本的映像。若要使用更新的基礎映像，必須重建容器映像並[更新函數程式碼](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html)。

Node.js 20、Python 3.12、Java 21、.NET 8、Ruby 3.3 及更新版本的基礎映像，均以 [Amazon Linux 2023 最小容器映像](https://docs.aws.amazon.com/linux/al2023/ug/minimal-container.html)為基礎。舊版基礎映像使用 Amazon Linux 2。與 Amazon Linux 2 相比，AL2023 具有多項優點，包括更小的部署足跡和更新版本的程式庫，如 `glibc`。

以 AL2023 為基礎的映像使用 `microdnf` (符號連結為 `dnf`) 而不是 `yum` 作為套件管理工具，後者是 Amazon Linux 2 中的預設套件管理工具。`microdnf` 是 `dnf` 的獨立實作。對於以 AL2023 為基礎的映像中包含的套件清單，請參閱 [Comparing packages installed on Amazon Linux 2023 Container Images](https://docs.aws.amazon.com/linux/al2023/ug/al2023-container-image-types.html) 中的 **Minimal Container** 欄。如需 AL2023 和 Amazon Linux 2 之間差異的詳細資訊，請參閱 AWS 運算部落格上的 [Introducing the Amazon Linux 2023 runtime for AWS Lambda](https://aws.amazon.com/blogs/compute/introducing-the-amazon-linux-2023-runtime-for-aws-lambda/)。

**注意**  
若要在本機執行AL2023-based映像，包括搭配 AWS Serverless Application Model (AWS SAM)，您必須使用 Docker 20.10.10 版或更新版本。

若要使用 AWS 基礎映像建置容器映像，請選擇您慣用語言的說明：
+ [Node.js](nodejs-image.md#nodejs-image-instructions)
+ [TypeScript](typescript-image.md#base-image-typescript)(使用 Node.js 的基礎映像)
+ [Python](python-image.md#python-image-instructions)
+ [Java](java-image.md#java-image-instructions) 
+ [Go](go-image.md#go-image-provided)
+ [.NET](csharp-image.md#csharp-image-instructions)
+ [Ruby](ruby-image.md#ruby-image-instructions)

## 使用僅限 AWS 作業系統的基礎映像
<a name="runtimes-images-provided"></a>

[AWS 僅限作業系統的基礎映像](https://gallery.ecr.aws/lambda/provided)包含 Amazon Linux 發行版本和[執行時間界面模擬器](https://github.com/aws/aws-lambda-runtime-interface-emulator/)。這些映像常用於為編譯語言 (如 [Go](go-image.md#go-image-provided) 和 [Rust](lambda-rust.md)) 和 Lambda 不提供基礎映像的語言或語言版本 (如 Node.js 19) 建置容器映像。您還可以使用僅限作業系統的基礎映像來實作[自訂執行期](runtimes-custom.md)。若要使映像檔與 Lambda 相容，您必須在映像中加入您語言的 [執行期介面用戶端](#images-ric)。


| Tags (標籤) | 執行期 | 作業系統 | Dockerfile | 棄用 | 
| --- | --- | --- | --- | --- | 
| al2023 | 僅限作業系統的執行期 | Amazon Linux 2023 | [GitHub 上僅限作業系統之執行期的 Dockerfile](https://github.com/aws/aws-lambda-base-images/blob/provided.al2023/Dockerfile.provided.al2023) |   2029 年 6 月 30 日   | 
| al2 | 僅限作業系統的執行期 | Amazon Linux 2 | [GitHub 上僅限作業系統之執行期的 Dockerfile](https://github.com/aws/aws-lambda-base-images/blob/provided.al2/Dockerfile.provided.al2) |   2026 年 7 月 31 日   | 

Amazon Elastic Container Registry 公有資源庫：[gallery.ecr.aws/lambda/provided](https://gallery.ecr.aws/lambda/provided)

## 使用非AWS 基礎映像
<a name="images-types"></a>

Lambda 支援符合下列其中一種映像資訊清單格式的任何映像：
+ Docker 映像資訊清單 V2，結構描述 2 (需搭配 1.10 或更新版本的 Docker 使用)
+ 開放容器計劃 (OCI) 規範 (v1.0.0 及以上版本)

Lambda 支援的未壓縮影像大小上限為 10 GB，包括所有圖層。

**注意**  
若要使映像檔與 Lambda 相容，您必須在映像中加入您語言的 [執行期介面用戶端](#images-ric)。
為取得最佳效能，建議將映像資訊清單大小保持在 25,400 位元組以下。若要縮小映像資訊清單大小，建議盡可能減少映像中的層數量與註釋內容。

## 執行時期介面用戶端
<a name="images-ric"></a>

如果您使用[僅限作業系統的基礎映像](#runtimes-images-provided)或替代的基礎映像，則必須在映像中加入執行期介面用戶端。執行時間界面用戶端必須擴展 [針對自訂執行時期使用 Lambda 執行時期 API](runtimes-api.md)，以管理 Lambda 與函數程式碼之間的互動。 為下列語言 AWS 提供開放原始碼執行時間界面用戶端：
+  [Node.js](nodejs-image.md#nodejs-image-clients) 
+  [Python](python-image.md#python-image-clients) 
+  [Java](java-image.md#java-image-clients) 
+  [.NET](csharp-image.md#csharp-image-clients) 
+  [Go](go-image.md#go-image-clients) 
+  [Ruby](ruby-image.md#ruby-image-clients) 
+  [Rust](lambda-rust.md) – 

如果您使用的語言沒有 AWS提供的執行時間界面用戶端，您必須建立自己的 。

## Amazon ECR 許可
<a name="gettingstarted-images-permissions"></a>

使用容器映像建立 Lambda 函數之前，您必須先在本機建置映像，並將其上傳至 Amazon ECR 儲存庫。建立函數時，請指定 Amazon ECR 儲存庫 URI。

確定建立函數之使用者或角色的許可包含 `GetRepositoryPolicy`、`BatchGetImage`、 `SetRepositoryPolicy`和 `GetDownloadUrlForLayer`。

例如，使用 IAM 主控台建立具有下列政策的角色：

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "ecr:SetRepositoryPolicy",
        "ecr:GetRepositoryPolicy",
        "ecr:BatchGetImage",
        "ecr:GetDownloadUrlForLayer"
      ],
      "Resource": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world"
    }
  ]
}
```

------

### Amazon ECR 儲存庫政策
<a name="configuration-images-permissions"></a>

若為與 Amazon ECR 中的容器映像位於相同帳戶中的函數，您可以將 `ecr:BatchGetImage` 和 `ecr:GetDownloadUrlForLayer` 許可新增至 Amazon ECR 儲存庫政策。以下範例顯示最低政策：

```
{
        "Sid": "LambdaECRImageRetrievalPolicy",
        "Effect": "Allow",
        "Principal": {
          "Service": "lambda.amazonaws.com"
        },
        "Action": [
          "ecr:BatchGetImage",
          "ecr:GetDownloadUrlForLayer"
        ]
    }
```

如需 Amazon ECR 儲存庫許可的詳細資訊，請參閱《Amazon Elastic Container Registry 使用者指南》**中的[私有儲存庫政策](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policies.html)。

如果 Amazon ECR 儲存庫不包含這些許可，Lambda 會嘗試自動新增這些許可。只有當呼叫 Lambda 的主體擁有 `ecr:getRepositoryPolicy` 和 `ecr:setRepositoryPolicy` 許可時，Lambda 才會新增許可。

若要檢視或編輯 Amazon ECR 儲存庫許可，請遵循《Amazon Elastic Container Registry 使用指南》**中[設定私有儲存庫政策聲明](https://docs.aws.amazon.com/AmazonECR/latest/userguide/set-repository-policy.html)中的指示。

#### Amazon ECR 跨帳戶許可
<a name="configuration-images-xaccount-permissions"></a>

相同區域中的不同帳戶可以建立使用您帳戶擁有的容器映像之函數。在下列範例中，您的 [Amazon ECR 儲存庫許可政策](https://docs.aws.amazon.com/AmazonECR/latest/userguide/set-repository-policy.html)需要下列陳述式才能為帳戶編號 123456789012 授予存取權。
+ **CrossAccountPermission** – 允許帳戶 123456789012 建立和更新使用此 ECR 儲存庫中映像的 Lambda 函數。
+ **LambdaECRImageCrossAccountRetrievalPolicy** – 如果很長一段時間內未被調用，Lambda 最終會將函數的狀態設定為非作用中。必須提供此陳述式，讓 Lambda 可以擷取容器映像來最佳化，並代表 123456789012 所擁有的函數進行快取。

**Example - 將跨帳戶許可新增至儲存庫**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "CrossAccountPermission",
      "Effect": "Allow",
      "Action": [
        "ecr:BatchGetImage",
        "ecr:GetDownloadUrlForLayer"
      ],
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root"
      },
      "Resource": "arn:aws:ecr:us-east-1:123456789012:repository/example-lambda-repository"
    },
    {
      "Sid": "LambdaECRImageCrossAccountRetrievalPolicy",
      "Effect": "Allow",
      "Action": [
        "ecr:BatchGetImage",
        "ecr:GetDownloadUrlForLayer"
      ],
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Condition": {
        "ArnLike": {
          "aws:sourceARN": "arn:aws:lambda:us-east-1:123456789012:function:*"
        }
      },
      "Resource": "arn:aws:ecr:us-east-1:123456789012:repository/example-lambda-repository"
    }
  ]
}
```

若要授與多個帳戶的存取權，您需將帳戶 ID 新增至 `CrossAccountPermission` 政策中的主體清單，也要新增至 `LambdaECRImageCrossAccountRetrievalPolicy` 中的條件評估清單。

如果您在 AWS 組織中使用多個帳戶，建議您列舉 ECR 許可政策中的每個帳戶 ID。此方法符合在 IAM 政策中設定窄許可 AWS 的安全性最佳實務。

除了 Lambda 許可之外，建立函數的使用者或角色還必須具有 `BatchGetImage` 和 `GetDownloadUrlForLayer` 許可。

## 函數生命週期
<a name="images-lifecycle"></a>

上傳新增或更新的容器映像之後，Lambda 會先最佳化該映像，函數才能處理呼叫。最佳化程序可能需要幾秒鐘。該函數會保持`Pending`狀態，直至程序完成，而後狀態會轉變為`Active`。在函數達到`Active`狀態之前，您無法調用函數。

如果函數在多個星期未被叫用，Lambda 會回收其最佳化版本，並將函數轉換為 `Inactive` 狀態。若要重新啟用函數，您必須叫用它。Lambda 拒絕第一次叫用，並且該函數進入 `Pending` 狀態，直到 Lambda 重新最佳化映像。函數隨後會傳回 `Active` 狀態。

Lambda 會定期從 Amazon ECR 儲存庫中擷取關聯的容器映像。如果對應的容器映像不再存在於 Amazon ECR 或是已撤銷許可，該函數會進入 `Failed` 狀態，並且針對任何函數叫用 Lambda 都會傳回失敗。

您可以使用 Lambda API 來取得函數狀態的相關資訊。如需詳細資訊，請參閱[Lambda 函數狀態](functions-states.md)。

# 設定 Lambda 函數記憶體
<a name="configuration-memory"></a>

Lambda 會按設定的記憶體數量比例來配置 CPU 功率。*記憶體*是可供 Lambda 函數在執行時間使用的記憶體數量。可使用**記憶體** 設定來增加或減少配置給函數的記憶體和 CPU 功率。您可以設定介於 128 MB 到 10,240 MB 之間的記憶體，增量為 1 MB。在 1,769 MB，函數等於一個完整 vCPU (每秒一個 vCPU 秒的額度)。

此頁面說明如何及何時更新 Lambda 函數的記憶體設定。

**Topics**
+ [

## 判斷 Lambda 函數的適當記憶體設定
](#configuration-memory-use-cases)
+ [

## 設定函數記憶體 (主控台)
](#configuration-memory-console)
+ [

## 設定函數記憶體 (AWS CLI)
](#configuration-memory-cli)
+ [

## 設定函數記憶體 (AWS SAM)
](#configuration-memory-sam)
+ [

## 接受函數記憶體建議 (主控台)
](#configuration-memory-optimization-accept)

## 判斷 Lambda 函數的適當記憶體設定
<a name="configuration-memory-use-cases"></a>

記憶體是控制函數效能的主要手段。預設設定為 128 MB，這是可能的最低設定。建議僅將 128 MB 用於簡單的 Lambda 函數，例如轉換事件並將其路由至其他 AWS 服務的函數。更高的記憶體配置可以提高使用匯入程式庫、[Lambda 層](chapter-layers.md)、Amazon Simple Storage Service (Amazon S3) 或 Amazon Elastic File System (Amazon EFS) 的函數效能。按比例增加更多記憶體會增加 CPU 容量，從而提高可用的整體運算能力。如果函數受到 CPU、網路或記憶體限制，則增加記憶體設定可以大幅改善其效能。

若要找到合適的記憶體組態，請透過 Amazon CloudWatch 監控您的函式，並在記憶體耗用量即將達到設定上限時設定警示。這有助於識別記憶體受限函數。對於 CPU 密集型與 IO 密集型函式，監控持續時間也可以提供有價值的洞察。在這些情況下，增加記憶體有助於解決運算或網路瓶頸。

您也可以考慮使用開放原始碼 [AWS Lambda Power Tuning](https://github.com/alexcasalboni/aws-lambda-power-tuning) 工具。此工具使用 AWS Step Functions 以不同的記憶體配置執行 Lambda 函數的多個並行版本，並測量效能。輸入函數會在您的帳戶中執行 AWS ，執行即時 HTTP 呼叫和 SDK 互動，以測量即時生產案例中可能的效能。也可以實作 CI/CD 流程，使用此工具自動測量您部署的新函數效能。

## 設定函數記憶體 (主控台)
<a name="configuration-memory-console"></a>

您可以在 Lambda 主控台中設定函數的記憶體。

**更新函數記憶體**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇一個函數。

1. 選擇**組態**索引標簽，然後選擇**一般組態**。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/configuration-tab.png)

1. 在**一般組態**中，選擇**編輯**。

1. 對於**記憶體**，設定從 128 MB 到 10,240 MB 的值。

1. 選擇**儲存**。

## 設定函數記憶體 (AWS CLI)
<a name="configuration-memory-cli"></a>

可以使用 [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) 命令來設定函數的記憶體。

**Example**  

```
aws lambda update-function-configuration \
  --function-name my-function \
  --memory-size 1024
```

## 設定函數記憶體 (AWS SAM)
<a name="configuration-memory-sam"></a>

可以使用 [AWS Serverless Application Model](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/serverless-getting-started.html ) 來設定函數的記憶體。更新 `template.yaml` 檔案中的 [MemorySize](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-memorysize) 屬性，然後執行 [sam 部署](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-deploy.html)。

**Example template.yaml**  

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: An AWS Serverless Application Model template describing your function.
Resources:
  my-function:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: .
      Description: ''
      MemorySize: 1024
      # Other function properties...
```

## 接受函數記憶體建議 (主控台)
<a name="configuration-memory-optimization-accept"></a>

如果您在 AWS Identity and Access Management (IAM) 中有管理員許可，您可以選擇接收來自 的 Lambda 函數記憶體設定建議 AWS Compute Optimizer。如需有關針對您的帳戶或組織選擇加入記憶體建議的指示，請參閱 *AWS Compute Optimizer 使用者指南*中的[選擇加入您的帳戶](https://docs.aws.amazon.com/compute-optimizer/latest/ug/getting-started.html#account-opt-in)。

**注意**  
Compute Optimizer 只支援使用 x86\$164 架構的函數。

當您已選擇加入且 [Lambda 函數符合 Compute Optimizer 需求](https://docs.aws.amazon.com/compute-optimizer/latest/ug/requirements.html#requirements-lambda-functions)時，您可以在**一般組態**中檢視並接受來自 Lambda 主控台 Compute Optimizer 的函數記憶體建議。

# 設定 Lambda 函數的暫時性儲存
<a name="configuration-ephemeral-storage"></a>

Lambda 在 `/tmp` 目錄中為函數提供暫時性儲存。此儲存體是臨時的且對每個執行環境都是唯一的。可以使用**暫時性儲存**設定來控制分配給函數的暫時性儲存量。您可以設定介於 512 MB 到 10,240 MB 之間的暫時性儲存，以 1 MB 為單位。存放在 `/tmp` 中的所有資料都會使用 AWS管理的金鑰進行靜態加密。

此頁面說明常見使用案例，以及如何更新 Lambda 函數的暫時性儲存。

**Topics**
+ [

## 增加暫時性儲存的常見使用案例
](#configuration-ephemeral-storage-use-cases)
+ [

## 配置暫時性儲存（主控台）
](#configuration-ephemeral-storage-console)
+ [

## 設定暫時性儲存 (AWS CLI)
](#configuration-ephemeral-storage-cli)
+ [

## 設定暫時性儲存 (AWS SAM)
](#configuration-ephemeral-storage-sam)

## 增加暫時性儲存的常見使用案例
<a name="configuration-ephemeral-storage-use-cases"></a>

以下是受益於增加的暫時性儲存的幾個常見使用案例：
+ **Extract-transform-load (ETL) 任務：**當程式碼執行中繼運算或下載其他資源以完成處理時，增加暫時性儲存。更多臨時空間可讓更複雜的 ETL 任務在 Lambda 函數中執行。
+ **機器學習 (ML) 推論：**許多推論任務依賴大型參考資料檔案，包括程式庫和模型。有了更多暫時性儲存，可以將更大的模型從 Amazon Simple Storage Service (Amazon S3) 下載到 `/tmp`，並在處理中使用它們。
+ **資料處理：**對於從 Amazon S3 下載物件以回應 S3 事件的工作負載，更多的 `/tmp` 空間可讓您處理較大的物件，而無需使用記憶體內處理。建立 PDF 或程序媒體的工作負載也會受益於更多暫時性儲存。
+ **圖形處理：**映像處理是基於 Lambda 的應用程式的常見使用案例。對於處理大型 TIFF 檔案或衛星影像的工作負載，更多的暫時性儲存可讓您更輕鬆地使用程式庫，並在 Lambda 中執行運算。

## 配置暫時性儲存（主控台）
<a name="configuration-ephemeral-storage-console"></a>

可以在 Lambda 主控台中設定暫時性儲存。

**若要修改函數的暫時性儲存**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇一個函數。

1. 選擇**組態**索引標簽，然後選擇**一般組態**。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/configuration-tab.png)

1. 在**一般組態**中，選擇**編輯**。

1. 對於**暫時性儲存**，設定介於 512 MB 到 10,240 MB 之間的值，以 1 MB 為單位。

1. 選擇**儲存**。

## 設定暫時性儲存 (AWS CLI)
<a name="configuration-ephemeral-storage-cli"></a>

可以使用 [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) 命令來設定暫時性儲存。

**Example**  

```
aws lambda update-function-configuration \
  --function-name my-function \
  --ephemeral-storage '{"Size": 1024}'
```

## 設定暫時性儲存 (AWS SAM)
<a name="configuration-ephemeral-storage-sam"></a>

可以使用 [AWS Serverless Application Model](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/serverless-getting-started.html ) 來設定函數的暫時性儲存。更新 `template.yaml` 檔案中的 [EphemeralStorage](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-ephemeralstorage) 屬性，然後執行 [sam 部署](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-deploy.html)。

**Example template.yaml**  

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: An AWS Serverless Application Model template describing your function.
Resources:
  my-function:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: .
      Description: ''
      MemorySize: 128
      Timeout: 120
      Handler: index.handler
      Runtime: nodejs22.x
      Architectures:
        - x86_64
      EphemeralStorage:
        Size: 10240
      # Other function properties...
```

# 選取和設定 Lambda 函數的指令集架構
<a name="foundation-arch"></a>

 Lambda 函數的*指令集架構*會決定 Lambda 用來執行函數的電腦處理器類型。Lambda 提供了指令集架構的選擇：
+ arm64 – AWS Graviton2 處理器的 64 位元 ARM 架構。
+ x86\$164 - 64 位元 x86 架構，適用於 x86 處理器。

**注意**  
arm64 架構在大多數情況下都可用 AWS 區域。如需詳細資訊，請參閱[AWS Lambda 定價](https://aws.amazon.com//lambda/pricing/#aws-element-9ccd9262-b656-4d9c-8a72-34ee6b662135)。在記憶體價格表格中，選擇 **Arm Price** 索引標籤，然後開啟**區域**下拉式清單，以查看哪個 AWS 區域 支援搭配 Lambda 的 arm64。  
如需如何使用 arm64 架構建立函數的範例，請參閱 [AWS Lambda 函數 Powered by AWS Graviton2 Processor](https://aws.amazon.com/blogs/aws/aws-lambda-functions-powered-by-aws-graviton2-processor-run-your-functions-on-arm-and-get-up-to-34-better-price-performance/)。

**Topics**
+ [

## 使用 arm64 架構的優點
](#foundation-arch-adv)
+ [

## 遷移到 arm64 架構的要求
](#foundation-arch-consider)
+ [

## 函數程式碼與 arm64 架構的相容性
](#foundation-arch-considerations)
+ [

## 如何遷移到 arm64 架構
](#foundation-arch-steps)
+ [

## 設定指令集架構
](#foundation-arch-config)

## 使用 arm64 架構的優點
<a name="foundation-arch-adv"></a>

與在 x86\$164 架構上執行的同等函數相比，使用 arm64 架構 (AWS Graviton2 處理器） 的 Lambda 函數可以實現更高的價格和效能。考慮將 arm64 用於運算密集的應用程式，例如高效能運算、視訊編碼和模擬工作負載。

Graviton2 CPU 使用 Neoverse N1 核心，並支援 Armv8.2 (包括 CRC 和加密延伸模組)，加上數個其他架構延伸模組。

Graviton2 透過每個 vCPU 提供更大的 L2 快取來減少記憶體讀取時間，進而改善 Web 和行動後端、微服務和資料處理系統的延遲效能。Graviton2 也提供改善的加密效能，並支援指令集，其可改善 CPU 型機器學習推論的延遲。

如需 AWS Graviton2 的詳細資訊，請參閱 [AWS Graviton 處理器](https://aws.amazon.com/ec2/graviton)。

## 遷移到 arm64 架構的要求
<a name="foundation-arch-consider"></a>

當您選取要遷移至 arm64 架構的 Lambda 函數時，為了確保順利遷移，請確定您的函數符合下列需求：
+ 部署套件只包含開放原始碼元件和您控制的原始碼，以便您可以針對遷移進行任何必要的更新。
+ 如果函數程式碼包含第三方相依性，則每個程式庫或套件都會提供 arm64 版本。

## 函數程式碼與 arm64 架構的相容性
<a name="foundation-arch-considerations"></a>

您的 Lambda 函數程式碼必須與函數的指令集架構相容。將函數遷移到 arm64 架構之前，請注意下列有關目前函數程式碼的幾點：
+ 如果您使用內嵌的程式碼編輯器新增函數程式碼，則您的程式碼可能無需修改即可在任一架構上執行。
+ 如果上傳了您的函數程式碼，則您必須上傳與目標架構相容的新程式碼。
+ 如果您的函數使用層，則必須[檢查每一層](adding-layers.md#finding-layer-information)以確定其與新架構相容。如果層不相容，請編輯函數，將目前的層版本取代為相容的層版本。
+ 如果您的函數使用 Lambda 延伸模組，則必須檢查每個延伸模組，以確定其與新架構相容。
+ 如果您的函數使用容器映像部署套件類型，則必須建立與函數架構相容的新容器映像。

## 如何遷移到 arm64 架構
<a name="foundation-arch-steps"></a>



若要將 Lambda 函數遷移至 arm64 架構，建議您遵循下列步驟：

1. 為您的應用程式或工作負載建置相依性清單。常見相依性包括：
   + 函數使用的所有程式庫和套件。
   + 用來建置、部署和測試函數的工具，例如編譯器、測試套件、持續交付和持續整合 (CI/CD) 管道、佈建工具，以及指令碼。
   + Lambda 延伸模組和第三方工具，用來在生產環境中監控函數。

1. 對於每個相依性，請檢查版本，然後檢查 arm64 版本是否可用。

1. 建置環境來遷移應用程式。

1. 引導應用程式。

1. 測試和除錯應用程式。

1. 測試 arm64 函數的效能。將效能與 x86\$164 版本進行比較。

1. 更新您的基礎設施管道以支援 arm64 Lambda 函數。

1. 將部署暫存至生產環境。

   例如，使用[別名路由組態](configuring-alias-routing.md)來分割函數 x86 和 arm64 版本之間的流量，並比較效能和延遲。

如需如何為 arm64 架構建立程式碼環境的詳細資訊，包括 Java、Go、.NET 和 Python 的語言特定資訊，請參閱 [Graviton GitHub AWS](https://github.com/aws/aws-graviton-getting-started) GitHub 儲存庫入門。

## 設定指令集架構
<a name="foundation-arch-config"></a>

您可以使用 Lambda 主控台、 AWS SDKs、 AWS Command Line Interface (AWS CLI) 或 為新的和現有的 Lambda 函數設定指令集架構 CloudFormation。依照這些步驟操作，在主控台中為現有的 Lambda 函數變更指令集架構。

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇函數名稱以為其設定指令集架構。

1. 在**程式碼**主索引標籤上的**執行期設定**區段選擇**編輯**。

1. 在 **架構** 選擇要用於函數的指令集架構。

1. 選擇**儲存**。

# 設定 Lambda 函數逾時
<a name="configuration-timeout"></a>

Lambda 會在逾時之前執行程式碼一段設定的時間。*逾時*為 Lambda 函數可以執行的最長時間，以秒為單位。此設定的預設值為 3 秒，但您可以調整此值，以 1 秒為單位，最大值為 900 秒 (15 分鐘)。

此頁面說明如何及何時更新 Lambda 函數的逾時設定。

**Topics**
+ [

## 確定 Lambda 函數的適當逾時值
](#configuration-timeout-use-cases)
+ [

## 設定逾時 (主控台)
](#configuration-timeout-console)
+ [

## 設定逾時 (AWS CLI)
](#configuration-timeout-cli)
+ [

## 設定逾時 (AWS SAM)
](#configuration-timeout-sam)

## 確定 Lambda 函數的適當逾時值
<a name="configuration-timeout-use-cases"></a>

如果逾時值接近函數的平均持續時間，則函數意外逾時的風險更高。函數的持續時間會有所不同，這取決於資料傳輸和處理量，以及函數與之互動的任何服務的延遲。逾時的一些常見原因包括：
+ Amazon Simple Storage Service (Amazon S3) 中的下載量比平均水平更大或耗時更長。
+ 函數會向另一個服務提出請求，這需要更長的時間才能回應。
+ 提供給函數的參數要求函數具有更高的運算複雜性，這會導致調用時間更長。

測試應用程式時，請確保測試可準確反映資料的大小和數量以及真實的參數值。為了方便起見，測試通常會使用小型範例，但您應該使用工作負載合理預期上限的資料集。

## 設定逾時 (主控台)
<a name="configuration-timeout-console"></a>

可以在 Lambda 主控台中設定函數逾時。

**若要修改函數的逾時**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇一個函數。

1. 選擇**組態**索引標簽，然後選擇**一般組態**。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/configuration-tab.png)

1. 在**一般組態**中，選擇**編輯**。

1. 對於**逾時**，設定介於 1 到 900 秒 (15 分鐘) 之間的值。

1. 選擇**儲存**。

## 設定逾時 (AWS CLI)
<a name="configuration-timeout-cli"></a>

可以使用 [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) 命令，以秒為單位設定逾時值。下列範例命令會將函數逾時增加到 120 秒 (2 分鐘)。

**Example**  

```
aws lambda update-function-configuration \
  --function-name my-function \
  --timeout 120
```

## 設定逾時 (AWS SAM)
<a name="configuration-timeout-sam"></a>

可以使用 [AWS Serverless Application Model](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/serverless-getting-started.html ) 來設定函數的逾時值。更新 `template.yaml` 檔案中的 [Timeout](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-timeout) 屬性，然後執行 [sam 部署](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-deploy.html)。

**Example template.yaml**  

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: An AWS Serverless Application Model template describing your function.
Resources:
  my-function:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: .
      Description: ''
      MemorySize: 128
      Timeout: 120
      # Other function properties...
```

# 設定 Lambda 耐用函數
<a name="durable-configuration"></a>

若要為 Lambda 函數啟用持久性執行，您需要設定特定設定，以控制函數的執行時間、保留狀態資料的時間，以及需要哪些許可。

## 啟用持久性執行
<a name="durable-config-settings"></a>

若要為 Lambda 函數啟用持久性執行，請在函數組態`DurableConfig`中設定 。此設定控制執行逾時、狀態保留和版本控制行為。

------
#### [ AWS CLI ]

```
aws lambda update-function-configuration \
  --function-name my-durable-function \
  --durable-config '{
    "ExecutionTimeout": 3600,
    "RetentionPeriodInDays": 30,
    "AllowInvokeLatest": true
  }'
```

------
#### [ CloudFormation ]

```
Resources:
  MyDurableFunction:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: my-durable-function
      Runtime: nodejs18.x
      Handler: index.handler
      Code:
        ZipFile: |
          // Your durable function code
      DurableConfig:
        ExecutionTimeout: 3600
        RetentionPeriodInDays: 30
        AllowInvokeLatest: true
```

------

**組態參數：**
+ `ExecutionTimeout` - 最長執行時間，以秒為單位 （一年最多 31，536，000 個）
+ `RetentionPeriodInDays` - 保留執行狀態和歷史記錄的時間長度 (1-365 天）
+ `AllowInvokeLatest` - 是否允許調用 \$1LATEST 版本以進行持久性執行

## 耐用函數的 IAM 許可
<a name="durable-iam-permissions"></a>

除了標準 Lambda 執行角色之外，耐用函數需要額外的 IAM 許可。函數的執行角色必須包含狀態管理和持久執行 APIs許可。

**最低必要許可：**

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "lambda:InvokeFunction",
        "lambda:GetFunction",
        "lambda:ManageDurableState",
        "lambda:GetDurableExecution",
        "lambda:ListDurableExecutions"
      ],
      "Resource": "arn:aws:lambda:*:*:function:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    }
  ]
}
```

**CloudFormation 執行角色範例：**

```
DurableFunctionRole:
  Type: AWS::IAM::Role
  Properties:
    AssumeRolePolicyDocument:
      Version: '2012-10-17'
      Statement:
        - Effect: Allow
          Principal:
            Service: lambda.amazonaws.com
          Action: sts:AssumeRole
    ManagedPolicyArns:
      - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
    Policies:
      - PolicyName: DurableFunctionPolicy
        PolicyDocument:
          Version: '2012-10-17'
          Statement:
            - Effect: Allow
              Action:
                - lambda:ManageDurableState
                - lambda:GetDurableExecution
                - lambda:ListDurableExecutions
              Resource: '*'
```

## 設定最佳實務
<a name="durable-config-best-practices"></a>

設定生產用途的耐用函數時，請遵循下列最佳實務：
+ **設定適當的執行逾時 **- `ExecutionTimeout` 根據工作流程的預期持續時間上限來設定 。請勿設定不必要的長時間逾時，因為它們會影響成本和資源配置。
+ **平衡保留與儲存成本** - `RetentionPeriodInDays`根據您的偵錯和稽核需求進行設定。較長的保留期會增加儲存成本。
+ 在**生產環境中使用版本控制** - `false` 在生產環境中將 `AllowInvokeLatest`設定為 ，並使用特定函數版本或別名進行持久性執行。
+ **監控狀態大小** - 大型狀態物件會增加儲存成本，並可能影響效能。將狀態降至最低，並針對大型資料使用外部儲存。
+ **設定適當的記錄** - 啟用詳細記錄，以對長時間執行的工作流程進行故障診斷，但請注意日誌磁碟區和成本。

**生產組態範例：**

```
{
  "ExecutionTimeout": 86400,
  "RetentionPeriodInDays": 7,
  "AllowInvokeLatest": false
}
```

# 使用 Lambda 環境變數
<a name="configuration-envvars"></a>

您可以使用環境變數來調整函數的行為，而無需更新程式碼。環境變數是存放在函數特定版本組態中的一對字串。Lambda 執行時間可讓程式碼使用環境變數，並設定其他環境變數，這些變數包含函數和調用請求的相關資訊。

**注意**  
為了提高安全性，我們建議您使用 AWS Secrets Manager 而非環境變數來存放資料庫登入資料和其他敏感資訊，例如 API 金鑰或授權字符。如需詳細資訊，請參閱[在 Lambda 函式中使用 Secrets Manager 秘密](with-secrets-manager.md)。

在函數調用之前，不會評估環境變數。您定義的任何值都會視為文字字串，而且不會展開。在函數程式碼中執行變數評估。

## 建立 Lambda 環境變數
<a name="create-environment-variables"></a>

您可以使用 Lambda 主控台、 AWS Command Line Interface (AWS CLI)、 AWS Serverless Application Model (AWS SAM) 或使用 AWS SDK 在 Lambda 中設定環境變數。

------
#### [ Console ]

您可以在函數的未發佈版本上定義環境變數。發布版本時，該版本的環境變數與其他[版本特定組態設定](configuration-versions.md)會被鎖定。

您可以透過定義索引鍵和值，為函數建立環境變數。函數使用索引鍵的名稱來擷取環境變數的值。

**在 Lambda 主控台中設定環境變數**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇一個函數。

1. 選擇**組態**索引標籤，然後選擇**環境變數**。

1. 在 **Environment variables** (環境變數) 下，選擇 **Edit** (編輯)。

1. 選擇 **Add environment variable** (新增環境變數)。

1. 輸入索引鍵和值。

**請求**
   + 索引鍵需以英文字母為開頭，且至少有兩個字元。
   + 索引鍵僅包含字母、數字和底線字元 (`_`)。
   + 索引鍵不是[由 Lambda 預留](#configuration-envvars-runtime)。
   + 所有環境變數的大小總計不超過 4 KB。

1. 選擇**儲存**。

**在主控台程式碼編輯器中產生環境變數清單**

可在 Lambda 程式碼編輯器中產生環境變數清單。這是在編碼時參考環境變數的快速方法。

1. 選擇 **程式碼** 標籤。

1. 向下捲動至程式碼編輯器的 **ENVIRONMENT VARIABLES** 區段。下面列出了現有環境變數：  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/env-var.png)

1. 若要建立新的環境變數，請選擇加號 (![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/add-plus.png))：  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/create-env-var.png)

在主控台程式碼編輯器中列出環境變數時，會保持加密狀態。如果在傳輸過程中啟用加密輔助工具進行加密，則這些設定會維持不變。如需詳細資訊，請參閱[保護 Lambda 環境變數](configuration-envvars-encryption.md)。

環境變數清單為唯讀狀態，且只能在 Lambda 主控台中使用。下載函數的 .zip 封存檔時，不會包含此檔案，且您無法透過上傳此檔案來新增環境變數。

------
#### [ AWS CLI ]

下列範例會在名為 `my-function` 的函數上設定兩個環境變數。

```
aws lambda update-function-configuration \
  --function-name my-function \
  --environment "Variables={BUCKET=amzn-s3-demo-bucket,KEY=file.txt}"
```

當您使用 `update-function-configuration` 命令套用環境變數時，會取代 `Variables` 結構的整個內容。若要在新增環境變數時保留現有的環境變數，請在請求中包含所有現有值。

若要取得目前的組態，請使用 `get-function-configuration` 命令。

```
aws lambda get-function-configuration \
  --function-name my-function
```

您應該會看到下列輸出：

```
{
    "FunctionName": "my-function",
    "FunctionArn": "arn:aws:lambda:us-east-2:111122223333:function:my-function",
    "Runtime": "nodejs24.x",
    "Role": "arn:aws:iam::111122223333:role/lambda-role",
    "Environment": {
        "Variables": {
            "BUCKET": "amzn-s3-demo-bucket",
            "KEY": "file.txt"
        }
    },
    "RevisionId": "0894d3c1-2a3d-4d48-bf7f-abade99f3c15",
    ...
}
```

可以從 `get-function-configuration` 的輸出中將修訂 ID 作為參數傳遞給 `update-function-configuration`。這樣可確保在讀取組態和更新組態期間，值不會變更。

若要設定函數的加密金鑰，請設定 `KMSKeyARN` 選項。

```
aws lambda update-function-configuration \
  --function-name my-function \
  --kms-key-arn arn:aws:kms:us-east-2:111122223333:key/055efbb4-xmpl-4336-ba9c-538c7d31f599
```

------
#### [ AWS SAM ]

可以使用 [AWS Serverless Application Model](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/serverless-getting-started.html ) 來設定函數的環境變數。更新 `template.yaml` 檔案中的[環境](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-environment)和[變數](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-environment.html#cfn-lambda-function-environment-variables)屬性，然後執行 [sam 部署](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-deploy.html)。

**Example template.yaml**  

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: An AWS Serverless Application Model template describing your function.
Resources:
  my-function:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: .
      Description: ''
      MemorySize: 128
      Timeout: 120
      Handler: index.handler
      Runtime: nodejs24.x
      Architectures:
        - x86_64
      EphemeralStorage:
        Size: 10240
      Environment:
        Variables:
          BUCKET: amzn-s3-demo-bucket
          KEY: file.txt
      # Other function properties...
```

------
#### [ AWS SDKs ]

若要使用 AWS SDK 管理環境變數，請使用下列 API 操作。
+ [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html)
+ [GetFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html)
+ [CreateFunction](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html)

若要進一步了解，請參閱您偏好的程式設計語言的 [AWS SDK 文件](https://aws.amazon.com/developer/tools/)。

------

## 環境變數的範例案例
<a name="configuration-envvars-example"></a>

您可以使用環境變數，自訂測試環境和生產環境中的函數行為。例如，您可以建立兩個具備相同程式碼，但不同組態的函數。一個函數連接到測試資料庫，另一個函數連接到生產資料庫。在此情況下，可以使用環境變數將資料庫的主機名稱和其他連線詳細資訊傳遞給函數。

以下範例顯示如何將資料庫主機和資料庫名稱定義為環境變數。

![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/console-env.png)


如果您希望測試環境產生比實際執行環境更多的偵錯資訊，您可以設定環境變數，以將測試環境設定為使用更詳細的記錄或更詳細的追蹤。

例如，在測試環境中，您可以使用 `LOG_LEVEL` 索引鍵與表示偵錯或追蹤日誌層級的值來設定環境變數。在 Lambda 函式的程式碼中，您可以使用此環境變數來設定日誌層級。

下列 Python 與 Node.js 語言程式碼範例示範可如何完成此操作。這些範例假設環境變數在 Python 中的值為 `DEBUG`，在 Node.js 中的值為 `debug`。

------
#### [ Python ]

**Example 設定日誌層級的 Python 程式碼**  

```
import os
import logging

# Initialize the logger
logger = logging.getLogger()

# Get the log level from the environment variable and default to INFO if not set
log_level = os.environ.get('LOG_LEVEL', 'INFO')

# Set the log level
logger.setLevel(log_level)

def lambda_handler(event, context):
    # Produce some example log outputs
    logger.debug('This is a log with detailed debug information - shown only in test environment')
    logger.info('This is a log with standard information - shown in production and test environments')
```

------
#### [ Node.js (ES module format) ]

**Example 設定日誌層級的 Node.js 程式碼**  
此範例使用 `winston` 記錄程式庫。使用 npm 將此程式庫新增至函式的部署套件。如需詳細資訊，請參閱[建立含相依項的 .zip 部署套件](nodejs-package.md#nodejs-package-create-dependencies)。  

```
import winston from 'winston';

// Initialize the logger using the log level from environment variables, defaulting to INFO if not set
const logger = winston.createLogger({
   level: process.env.LOG_LEVEL || 'info',
   format: winston.format.json(),
   transports: [new winston.transports.Console()]
});

export const handler = async (event) => {
   // Produce some example log outputs
   logger.debug('This is a log with detailed debug information - shown only in test environment');
   logger.info('This is a log with standard information - shown in production and test environment');
   
};
```

------

## 擷取 Lambda 環境變數
<a name="retrieve-environment-variables"></a>

若要在函數程式碼中擷取環境變數，請使用程式設計語言的標準方法。

------
#### [ Node.js ]

```
let region = process.env.AWS_REGION
```

------
#### [ Python ]

```
import os
  region = os.environ['AWS_REGION']
```

**注意**  
在某些情況下，您可能需要使用下列格式：  

```
region = os.environ.get('AWS_REGION')
```

------
#### [ Ruby ]

```
region = ENV["AWS_REGION"]
```

------
#### [ Java ]

```
String region = System.getenv("AWS_REGION");
```

------
#### [ Go ]

```
var region = os.Getenv("AWS_REGION")
```

------
#### [ C\$1 ]

```
string region = Environment.GetEnvironmentVariable("AWS_REGION");
```

------
#### [ PowerShell ]

```
$region = $env:AWS_REGION
```

------

Lambda 透過靜態加密環境變數來安全地存放它們。您可以[設定 Lambda 使用不同的加密金鑰](configuration-envvars-encryption.md)、在用戶端加密環境變數值，或在具有 的 CloudFormation 範本中設定環境變數 AWS Secrets Manager。

## 定義執行時間環境變數
<a name="configuration-envvars-runtime"></a>

Lambda [執行時間](lambda-runtimes.md)會在初始化期間設定數個環境變數。大多數的環境變數都會提供函數或執行時間的資訊。這些環境變數的索引鍵都已進行*預留*，無法在您的函數組態中設定。

**預留環境變數**
+ `_HANDLER` - 在函數中設定的處理常式位置。
+ `_X_AMZN_TRACE_ID` - [X-Ray 追蹤標頭](services-xray.md)。此環境變數會隨著每次調用而變更。
  + 未針對僅限作業系統的執行期 (`provided` 執行期系列) 定義此環境變數。您可以使用 [下次調用](runtimes-api.md#runtimes-api-next) 中的 `Lambda-Runtime-Trace-Id` 回應標頭為自訂執行階段設定 `_X_AMZN_TRACE_ID`。
  + 對於 Java 執行期版本 17 及更高版本，不使用此環境變數。相反地，Lambda 會將追蹤資訊儲存在 `com.amazonaws.xray.traceHeader` 系統屬性中。
+ `AWS_DEFAULT_REGION` – 執行 Lambda 函數的預設 AWS 區域 位置。
+ `AWS_REGION` – 執行 Lambda 函數 AWS 區域 的 。若已完成定義，此值便會覆寫 `AWS_DEFAULT_REGION`。
  + 如需搭配 AWS SDKs 使用 AWS 區域 環境變數的詳細資訊，請參閱 *AWS SDKs和工具參考指南*中的[AWS 區域](https://docs.aws.amazon.com/sdkref/latest/guide/feature-region.html#feature-region-sdk-compat)。
+ `AWS_EXECUTION_ENV` – [執行時間識別符](lambda-runtimes.md)，字首為 `AWS_Lambda_` (例如，`AWS_Lambda_java8`)。未針對僅限作業系統的執行期 (`provided` 執行期系列) 定義此環境變數。
+ `AWS_LAMBDA_FUNCTION_NAME` - 函數的名稱。
+ `AWS_LAMBDA_FUNCTION_MEMORY_SIZE` - 可供函數使用的記憶體量 (MB)。
+ `AWS_LAMBDA_FUNCTION_VERSION` - 正在執行的函數版本。
+ `AWS_LAMBDA_INITIALIZATION_TYPE` – 函數的初始化類型，即 `on-demand`、`snap-start`、 `provisioned-concurrency`或 `lambda-managed-instances`。如需詳細資訊，請參閱[設定佈建並行](provisioned-concurrency.md)[使用 Lambda SnapStart 改善啟動效能](snapstart.md)、 或 [Lambda 受管執行個體](lambda-managed-instances.md)。
+ `AWS_LAMBDA_LOG_GROUP_NAME`、`AWS_LAMBDA_LOG_STREAM_NAME` - Amazon CloudWatch Logs 群組和函數串流的名稱。`AWS_LAMBDA_LOG_GROUP_NAME` 和 `AWS_LAMBDA_LOG_STREAM_NAME` [環境變數](#configuration-envvars-runtime)無法在 Lambda SnapStart 函數中使用。
+ `AWS_ACCESS_KEY`、`AWS_ACCESS_KEY_ID`、`AWS_SECRET_ACCESS_KEY`、`AWS_SESSION_TOKEN` - 從函數的[執行角色](lambda-intro-execution-role.md)中取得的存取金鑰。
+ `AWS_LAMBDA_RUNTIME_API` - ([自訂執行時間](runtimes-custom.md)) [執行時間 API](runtimes-api.md) 的主機和連接埠。
+ `LAMBDA_TASK_ROOT` - 指向您 Lambda 函數程式碼的路徑。
+ `LAMBDA_RUNTIME_DIR` - 指向執行時間程式庫的路徑。
+ `AWS_LAMBDA_MAX_CONCURRENCY` – （僅限 Lambda 受管執行個體） Lambda 將傳送至一個執行環境的並行調用數目上限。
+ `AWS_LAMBDA_METADATA_API` – 格式的[中繼資料端點](configuration-metadata-endpoint.md)伺服器地址 `{ipv4_address}:{port}`（例如 `169.254.100.1:9001`)。
+ `AWS_LAMBDA_METADATA_TOKEN` – 目前執行環境的唯一身分驗證字符，用於對[中繼資料端點](configuration-metadata-endpoint.md)的請求進行身分驗證。Lambda 會在初始化時自動產生此權杖。

下列其他環境變數並未進行預留，可以在您的函數組態中進行擴充。

**未預留的環境變數**
+ `LANG` – 執行時間的地區設定 (`en_US.UTF-8`)。
+ `PATH` – 執行路徑 (`/usr/local/bin:/usr/bin/:/bin:/opt/bin`)。
+ `LD_LIBRARY_PATH` – 系統程式庫路徑 (`/var/lang/lib:/lib64:/usr/lib64:$LAMBDA_RUNTIME_DIR:$LAMBDA_RUNTIME_DIR/lib:$LAMBDA_TASK_ROOT:$LAMBDA_TASK_ROOT/lib:/opt/lib`)。
+ `NODE_PATH` - ([Node.js](lambda-nodejs.md)) Node.js 程式庫路徑 (`/opt/nodejs/node12/node_modules/:/opt/nodejs/node_modules:$LAMBDA_RUNTIME_DIR/node_modules`)。
+ `NODE_OPTIONS` – ([Node.js](lambda-nodejs.md)) 對於 Node.js 執行時期，您可以使用 `NODE_OPTIONS` 來重新啟用 Lambda 預設停用的實驗性功能。
+ `PYTHONPATH` – ([Python](lambda-python.md)) Python 程式庫路徑 (`$LAMBDA_RUNTIME_DIR`)。
+ `GEM_PATH` - ([Ruby](lambda-ruby.md)) Ruby 程式庫路徑 (`$LAMBDA_TASK_ROOT/vendor/bundle/ruby/3.3.0:/opt/ruby/gems/3.3.0`)。
+ `AWS_XRAY_CONTEXT_MISSING` - 對於 X-Ray 追蹤，Lambda 將它設定為 `LOG_ERROR`，以避免從 X-Ray 開發套件中擲回執行時間錯誤。
+ `AWS_XRAY_DAEMON_ADDRESS` - 對於 X-Ray 追蹤，為 X-Ray 常駐程式的 IP 地址和連接埠。
+ `AWS_LAMBDA_DOTNET_PREJIT` – ([.NET](lambda-csharp.md)) 設定此變數，以啟用或停用 .NET 特定執行時期最佳化。值包含 `always`、`never` 和 `provisioned-concurrency`。如需詳細資訊，請參閱[設定函數的佈建並行](provisioned-concurrency.md)。
+ `TZ` – 環境的時區 (`:UTC`)。執行環境使用 NTP 來同步系統時鐘。

顯示的範例值會反映最新的執行時間。特定變數或其值是否存在，可能會因先前的執行時間而有所不同。

# 保護 Lambda 環境變數
<a name="configuration-envvars-encryption"></a>

若要保護您的環境變數，可以使用伺服器端加密來保護您的靜態資料，並使用用戶端加密來保護傳輸中的資料。

**注意**  
為了提高資料庫安全性，我們建議您使用 AWS Secrets Manager 而非環境變數來存放資料庫登入資料。如需詳細資訊，請參閱[在 Lambda 函式中使用 Secrets Manager 秘密](with-secrets-manager.md)。

**靜態安全**  
Lambda 永遠使用 AWS KMS key提供靜態伺服器端加密。預設情況下，Lambda 使用 AWS 受管金鑰。如果此預設行為符合您的工作流程，您便不需要設定其他項目。Lambda 會在您的帳戶 AWS 受管金鑰 中建立 ，並為您管理許可。 AWS 不會向您收取使用此金鑰的費用。

如果您願意，您可以改為提供 AWS KMS 客戶受管金鑰。您可以這樣做以控制 KMS 金鑰的輪換或滿足您的組織對管理 KMS 金鑰的請求。當您使用客戶受管的金鑰時，只有您帳戶中具有 KMS 金鑰存取權的使用者才能檢視或管理函數上的環境變數。

客戶受管金鑰會產生標準 AWS KMS 費用。如需詳細資訊，請參閱 [AWS Key Management Service 定價](https://aws.amazon.com/kms/pricing/)。

**傳輸中安全**  
基於額外的安全性考量，您可啟用傳輸中加密輔助工具，此類工具能確保環境變數在傳輸過程中透過用戶端加密得到加密保護。

**若要為環境變數配置加密**

1. 使用 AWS Key Management Service (AWS KMS) 為 Lambda 建立任何客戶受管金鑰，以用於伺服器端和用戶端加密。如需詳細資訊，請參閱*AWS Key Management Service 開發人員指南*中的[建立金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。

1. 使用 Lambda 主控台，導覽至 **Edit environment variables** (編輯環境變數) 頁面。

   1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

   1. 選擇一個函數。

   1. 選擇 **Configuration** (組態)，然後從左側導覽列選擇 **Environment variables** (環境變數)。

   1. 在 **Environment variables** (環境變數) 區段中，選擇 **Edit** (編輯)。

   1. 展開 **Encryption configuration** (加密組態)。

1. (選用) 啟用主控台加密輔助工具，以透過用戶端加密保護傳輸中的資料。

   1. 在**傳輸中加密**下，選擇**啟用傳輸中加密輔助工具**。

   1. 對於每個要啟用主控台加密輔助工具的環境變數，請選擇該環境變數旁的**加密**選項。

   1.  在 AWS KMS key 下加密傳輸中，選擇您在此程序開始時建立的客戶受管金鑰。

   1. 選擇 **Execution role policy** (執行角色政策)，然後複製政策。此政策授予函數的執行角色解密環境變數的許可。

      儲存此政策，以便在此程序的最後一個步驟中使用。

   1. 向函數中新增解密環境變數的程式碼。若要查看範例，請選擇**解密秘密程式碼片段**。

1. (選用) 指定用於靜態加密的客戶受管金鑰。

   1. 選擇 **Use a customer master key** (使用客戶主金鑰)。

   1. 選擇在此程序開始時建立的客戶受管金鑰。

1. 選擇 **Save** (儲存)。

1. 設定許可。

   如果搭配使用客戶受管金鑰和伺服器端加密，請向您希望其能檢視或管理該函數環境變數的任何使用者或角色授予許可。如需詳細資訊，請參閱[管理伺服器端加密 KMS 金鑰的許可](#managing-permissions-to-your-server-side-encryption-key)。

   如果您要啟用用戶端加密來增強傳輸中安全，您的函數需要許可來呼叫 `kms:Decrypt` API 操作。將您先前在此程序中儲存的政策新增至函數的[執行角色](lambda-intro-execution-role.md)。

## 管理伺服器端加密 KMS 金鑰的許可
<a name="managing-permissions-to-your-server-side-encryption-key"></a>

您的使用者或函數的執行角色不需要任何 AWS KMS 許可，即可使用預設加密金鑰。若要使用客戶受管金鑰，您需要使用金鑰的許可。Lambda 會使用您的許可，在金鑰上建立授權。這麼做可讓 Lambda 使用它來進行加密。
+ `kms:ListAliases` – 在 Lambda 主控台中檢視金鑰。
+ `kms:CreateGrant`、`kms:Encrypt` - 在函數上設定客戶受管金鑰。
+ `kms:Decrypt` - 檢視及管理使用客戶受管金鑰加密的環境變數。

您可以從 AWS 帳戶 或從金鑰的資源型許可政策取得這些許可。 `ListAliases` 是由 [Lambda 的 受管政策](access-control-identity-based.md)提供。金鑰政策會將其餘許可授予 **Key users** (金鑰使用者) 群組中的使用者。

沒有 `Decrypt` 許可的使用者仍然可以管理函數，但是無法在 Lambda 主控台中檢視或管理環境變數。如要防止使用者檢視環境變數，請將拒絕存取預設金鑰、客戶受管金鑰，或是所有金鑰的陳述式新增到使用者的許可。

**Example IAM 政策 - 透過金鑰 ARN 拒絕存取**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Deny",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": "arn:aws:kms:us-east-2:111122223333:key/3be10e2d-xmpl-4be4-bc9d-0405a71945cc"
        }
    ]
}
```

如需有關管理金鑰許可的詳細資訊，請參閱《AWS Key Management Service 開發人員指南》**中的 [AWS KMS中的金鑰政策](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)。

# 讓 Lambda 函數存取 Amazon VPC 中的資源
<a name="configuration-vpc"></a>

使用 Amazon Virtual Private Cloud (Amazon VPC)，您可以在 中建立私有網路 AWS 帳戶 以託管 資源，例如 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體、Amazon Relational Database Service (Amazon RDS) 執行個體和 Amazon ElastiCache 執行個體。可以透過包含資源的私有子網路，將函數連接至 VPC，讓 Lambda 函數存取 Amazon VPC 中託管的資源。請依照下列各節中的指示，使用 Lambda 主控台、 AWS Command Line Interface (AWS CLI) 或 將 Lambda 函數連接至 Amazon VPC AWS SAM。

**注意**  
每個 Lambda 函數都會在 Lambda 服務擁有和管理的 VPC 內執行。這些 VPC 由 Lambda 自動維護，客戶看不到。將函數設定為存取 Amazon VPC 中的其他 AWS 資源，不會影響函數在其中執行的 Lambda 受管 VPC。

**Topics**
+ [

## 所需的 IAM 許可
](#configuration-vpc-permissions)
+ [

## 將 Lambda 函數連接至 中的 Amazon VPC AWS 帳戶
](#configuration-vpc-attaching)
+ [

## 連接到 VPC 時的網際網路存取
](#configuration-vpc-internet-access)
+ [

## IPv6 支援
](#configuration-vpc-ipv6)
+ [

## 搭配使用 Lambda 與 Amazon VPC 的最佳實務
](#configuration-vpc-best-practice)
+ [

## 了解 Hyperplane Elastic Network Interfaces (ENI)
](#configuration-vpc-enis)
+ [

## 使用 IAM 條件金鑰進行 VPC 設定
](#vpc-conditions)
+ [

## VPC 教學課程
](#vpc-tutorials)

## 所需的 IAM 許可
<a name="configuration-vpc-permissions"></a>

若要將 Lambda 函數連接至 中的 Amazon VPC AWS 帳戶，Lambda 需要許可來建立和管理其用來讓函數存取 VPC 中的資源的網路界面。

Lambda 建立的網路介面稱為 Hyperplane Elastic Network Interfaces 或 Hyperplane ENI。若要進一步了解這些網路介面，請參閱 [了解 Hyperplane Elastic Network Interfaces (ENI)](#configuration-vpc-enis)。

您可以將 AWS 受管政策 [AWSLambdaVPCAccessExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaVPCAccessExecutionRole.html) 連接至函數的執行角色，為函數提供所需的許可。當您在 Lambda 主控台中建立新函數並將其連接至 VPC 時，Lambda 會自動為您新增此許可政策。

如果想要建立自己的 IAM 許可政策，請務必新增下列所有許可並允許這些許可適用於所有資源 (`"Resource": "*"`)：
+ ec2:CreateNetworkInterface
+ ec2:DescribeNetworkInterfaces
+ ec2：DescribeSubnets
+ ec2:DeleteNetworkInterface
+ ec2:AssignPrivateIpAddresses
+ ec2:UnassignPrivateIpAddresses

請注意，函數的角色只需要這些許可來建立網路介面，而不是調用函數。即使從函數的執行角色中移除這些許可，仍可在函數連接至 Amazon VPC 時成功調用函數。

若要將函數連接至 VPC，Lambda 還需要使用您的 IAM 使用者角色來驗證網路資源。確保使用者角色具有下列 IAM 許可：
+ **ec2:DescribeSecurityGroups**
+ **ec2:DescribeSubnets**
+ **ec2:DescribeVpcs**
+ **ec2：GetSecurityGroupsForVpc**

**注意**  
Lambda 服務會使用您授予給函數執行角色的 Amazon EC2 許可，將函數連接至 VPC。不過，您也會隱含地將這些許可授予給函數的程式碼。這意味著您的函數程式碼能夠進行這些 Amazon EC2 API 呼叫。如需有關遵循安全最佳實務的建議，請參閱 [安全最佳實務](#configuration-vpc-best-practice-security)。

## 將 Lambda 函數連接至 中的 Amazon VPC AWS 帳戶
<a name="configuration-vpc-attaching"></a>

 AWS 帳戶 使用 Lambda 主控台、 AWS CLI 或 將函數連接至 中的 Amazon VPC AWS SAM。如果您使用 AWS CLI 或 AWS SAM，或使用 Lambda 主控台將現有函數連接至 VPC，請確定函數的執行角色具有上一節中列出的必要許可。

Lambda 函數無法透過[專用執行個體租用](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/dedicated-instance.html)直接連線到 VPC。若要連線到專用 VPC 中的資源，[請透過預設租用將它對等連線到第二個 VPC](https://aws.amazon.com/premiumsupport/knowledge-center/lambda-dedicated-vpc/)。

------
#### [ Lambda console ]

**若要在建立時將函數連接至 Amazon VPC**

1. 開啟 Lambda 主控台的[函數](https://console.aws.amazon.com/lambda/home#/functions)頁面，然後選擇 **建立函數**。

1. 在 **Basic information (基本資訊)** 下，對於 **Function name (函數名稱)**，為您的函數輸入名稱。

1. 執行下列操作以配置函數的 VPC 設定：

   1. 展開 **Advanced settings** (進階設定)。

   1. 選取**啟用 VPC**，然後選擇要與函數連接的 VPC。

   1. (選擇性) 若要允許[傳出 IPv6 流量](#configuration-vpc-ipv6)，請選取**允許雙堆疊子網路的 IPv6 流量**。

   1. 選擇要為其建立網路介面的子網路和安全群組。如果您選取**允許雙堆疊子網路的 IPv6 流量**，則所有選取的子網路均必須具有 IPv4 CIDR 區塊和 IPv6 CIDR 區塊。
**注意**  
若要存取私有資源，請將您的函數連線到私有子網路。如果函數需要網際網路存取，請參閱 [啟用 VPC 連線的 Lambda 函數的網際網路存取](configuration-vpc-internet.md)。將函數連接到公有子網路並不會提供網際網路存取或公有 IP 位址給該函數。

1. 選擇**建立函數**。

**若要將現有函數連接至 Amazon VPC**

1. 開啟 Lambda 主控台的[函數頁面](https://console.aws.amazon.com/lambda/home#/functions)，然後選取您的函數。

1. 選擇**組態**索引標籤，然後選擇 **VPC**。

1. 選擇**編輯**。

1. 在 **VPC** 下，選取要連接函數的 Amazon VPC。

1. (選擇性) 若要允許[傳出 IPv6 流量](#configuration-vpc-ipv6)，請選取**允許雙堆疊子網路的 IPv6 流量**。

1. 選擇要為其建立網路介面的子網路和安全群組。如果您選取**允許雙堆疊子網路的 IPv6 流量**，則所有選取的子網路均必須具有 IPv4 CIDR 區塊和 IPv6 CIDR 區塊。
**注意**  
若要存取私有資源，請將您的函數連線到私有子網路。如果函數需要網際網路存取，請參閱 [啟用 VPC 連線的 Lambda 函數的網際網路存取](configuration-vpc-internet.md)。將函數連接到公有子網路並不會提供網際網路存取或公有 IP 位址給該函數。

1. 選擇**儲存**。

------
#### [ AWS CLI ]

**若要在建立時將函數連接至 Amazon VPC**
+ 若要建立 Lambda 函數並將其連接至 VPC，請執行下列 CLI `create-function` 命令。

  ```
  aws lambda create-function --function-name my-function \
  --runtime nodejs24.x --handler index.js --zip-file fileb://function.zip \
  --role arn:aws:iam::123456789012:role/lambda-role \
  --vpc-config Ipv6AllowedForDualStack=true,SubnetIds=subnet-071f712345678e7c8,subnet-07fd123456788a036,SecurityGroupIds=sg-085912345678492fb
  ```

  指定您自己的子網路和安全群組，並根據使用案例將 `Ipv6AllowedForDualStack` 設定為 `true` 或 `false`。

**若要將現有函數連接至 Amazon VPC**
+ 若要將現有函數連接至 VPC，請執行下列 CLI `update-function-configuration` 命令。

  ```
  aws lambda update-function-configuration --function-name my-function \
  --vpc-config Ipv6AllowedForDualStack=true, SubnetIds=subnet-071f712345678e7c8,subnet-07fd123456788a036,SecurityGroupIds=sg-085912345678492fb
  ```

**若要從 VPC 中斷開函數的連接**
+ 若要從 VPC 中斷開函數的連接，請使用 VPC 子網路和安全群組的空清單來執行下列 `update-function-configuration` CLI 命令。

  ```
  aws lambda update-function-configuration --function-name my-function \
  --vpc-config SubnetIds=[],SecurityGroupIds=[]
  ```

------
#### [ AWS SAM ]

**若要將函數連接至 VPC**
+ 若要將 Lambda 函數連接至 Amazon VPC，請將 `VpcConfig` 屬性新增至函數定義，如下列範例範本所示。如需此屬性的詳細資訊，請參閱*CloudFormation 《 使用者指南*》中的 [AWS：：Lambda：：Function VpcConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-vpcconfig.html) ( 屬性 AWS SAM `VpcConfig`會直接傳遞至 資源的 `VpcConfig` CloudFormation `AWS::Lambda::Function` 屬性）。

  ```
  AWSTemplateFormatVersion: '2010-09-09'
  Transform: AWS::Serverless-2016-10-31
  
  Resources:
    MyFunction:
      Type: AWS::Serverless::Function
      Properties:
        CodeUri: ./lambda_function/
        Handler: lambda_function.handler
        Runtime: python3.12
        VpcConfig:
          SecurityGroupIds:
            - !Ref MySecurityGroup
          SubnetIds:
            - !Ref MySubnet1
            - !Ref MySubnet2
        Policies:
          - AWSLambdaVPCAccessExecutionRole
  
    MySecurityGroup:
      Type: AWS::EC2::SecurityGroup
      Properties:
        GroupDescription: Security group for Lambda function
        VpcId: !Ref MyVPC
  
    MySubnet1:
      Type: AWS::EC2::Subnet
      Properties:
        VpcId: !Ref MyVPC
        CidrBlock: 10.0.1.0/24
  
    MySubnet2:
      Type: AWS::EC2::Subnet
      Properties:
        VpcId: !Ref MyVPC
        CidrBlock: 10.0.2.0/24
  
    MyVPC:
      Type: AWS::EC2::VPC
      Properties:
        CidrBlock: 10.0.0.0/16
  ```

  如需在 中設定 VPC 的詳細資訊 AWS SAM，請參閱*CloudFormation 《 使用者指南*》中的 [AWS：：EC2：：VPC](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html)。

------

## 連接到 VPC 時的網際網路存取
<a name="configuration-vpc-internet-access"></a>

依預設，Lambda 函數可以存取公有網際網路。將函數連接至 VPC 時，它只能存取該 VPC 中可用的資源。若要讓您的函數存取網際網路，也需要設定 VPC 以存取網際網路。如需詳細資訊，請參閱 [啟用 VPC 連線的 Lambda 函數的網際網路存取](configuration-vpc-internet.md)。

## IPv6 支援
<a name="configuration-vpc-ipv6"></a>

您的函數可透過 IPv6 連線至雙堆疊 VPC 子網路中的資源。此選項預設為關閉。若要允許傳出 IPv6 流量，請使用主控台或者具有 [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html) 或 [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) 命令的 `--vpc-config Ipv6AllowedForDualStack=true` 選項。

**注意**  
若要允許 VPC 中的傳出 IPv6 流量，連線到該函數的所有子網路都必須是雙堆疊子網路。Lambda 不支援 VPC 中純 IPv6 子網路的傳出 IPv6 連線，亦不支援未連接 VPC 之函式的傳出 IPv6 連線。

您可以更新函數程式碼來透過 IPv6 明確連線至子網路資源。下列 Python 範例開啟了通訊端，並連接到 IPv6 伺服器。

**Example — 連線至 IPv6 伺服器**  

```
def connect_to_server(event, context):
    server_address = event['host']
    server_port = event['port']
    message = event['message']
    run_connect_to_server(server_address, server_port, message)

def run_connect_to_server(server_address, server_port, message):
    sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM, 0)
    try:
        # Send data
        sock.connect((server_address, int(server_port), 0, 0))
        sock.sendall(message.encode())
        BUFF_SIZE = 4096
        data = b''
        while True:
            segment = sock.recv(BUFF_SIZE)
            data += segment
            # Either 0 or end of data
            if len(segment) < BUFF_SIZE:
                break
        return data
    finally:
        sock.close()
```

## 搭配使用 Lambda 與 Amazon VPC 的最佳實務
<a name="configuration-vpc-best-practice"></a>

若要確保 Lambda VPC 組態符合最佳實務準則，請遵循以下章節的建議。

### 安全最佳實務
<a name="configuration-vpc-best-practice-security"></a>

若要將 Lambda 函數連接至 VPC，需要為函數的執行角色提供一些 Amazon EC2 許可。需要這些許可才能建立函數用來存取 VPC 中資源的網路介面。不過，這些許可也會隱含授予給函數的程式碼。這意味著函數程式碼擁有進行這些 Amazon EC2 API 呼叫的許可。

若要遵循最低權限存取的原則，請將拒絕政策新增至函數的執行角色，如下列範例所示。此政策可防止函式程式碼呼叫 Amazon EC2 API，同時仍允許 Lambda 服務代表您管理 VPC 資源。此政策使用 `lambda:SourceFunctionArn` 條件索引鍵，該索引鍵僅適用於函式程式碼在執行期間進行的 API 呼叫。如需詳細資訊，請參閱[使用來源函數 ARN 控制函數存取行為](permissions-source-function-arn.md)。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [ 
                 "ec2:CreateNetworkInterface",
                 "ec2:DeleteNetworkInterface",
                 "ec2:DescribeNetworkInterfaces",
                 "ec2:DescribeSubnets",
                 "ec2:DetachNetworkInterface",
                 "ec2:AssignPrivateIpAddresses",
                 "ec2:UnassignPrivateIpAddresses"
            ],
            "Resource": [ "*" ],
            "Condition": {
                "ArnEquals": {
                    "lambda:SourceFunctionArn": [
                        "arn:aws:lambda:us-west-2:123456789012:function:my_function"
                    ]
                }
            }
        }
    ]
}
```

------

AWS 提供*[安全群組](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)*和*[網路存取控制清單 (ACLs)](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html)*，以提高 VPC 的安全性。安全群組控制資源的傳入與傳出流量，網路 ACL 則是控制子網的傳入與傳出流量。安全群組可為大多數子網路提供足夠的存取控制。如果您想讓 VPC 多一層安全，可以使用網路 ACL。如需使用 Amazon VPC 時安全最佳實務的一般準則，請參閱《Amazon Virtual Private Cloud 使用者指南》中的 [VPC 安全最佳實務](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-security-best-practices.html)。**

### 效能最佳實務
<a name="configuration-vpc-best-practice-performance"></a>

將函數連接至 VPC 時，Lambda 會檢查是否有可用於連線的可用網路資源 (Hyperplane ENI)。Hyperplane ENI 與安全群組和 VPC 子網路的特定組合相關聯。如果已將一個函數連接至 VPC，在連接另一個函數時指定相同的子網路和安全群組意味著 Lambda 可以共用網路資源，並避免建立新的 Hyperplane ENI。如需 Hyperplane ENI 及其生命週期的詳細資訊，請參閱 [了解 Hyperplane Elastic Network Interfaces (ENI)](#configuration-vpc-enis)。

## 了解 Hyperplane Elastic Network Interfaces (ENI)
<a name="configuration-vpc-enis"></a>

Hyperplane ENI 是一種受管資源，可作為 Lambda 函數與您希望函數連線的資源之間的網路介面。將函數連接至 VPC 時，Lambda 服務會自動建立和管理這些 ENI。

Hyperplane ENI 不會直接顯示，而且您不需要設定或管理它們。不過，了解它們的運作方式可協助您了解函數在連接到 VPC 時的行為。

當您第一次使用特定子網路和安全群組組合將函數連接至 VPC 時，Lambda 會建立 Hyperplane ENI。帳戶中其他使用相同子網路和安全群組組合的函數也可以使用此 ENI。Lambda 會盡可能重複使用現有的 ENI，以最佳化資源使用率，並盡量減少建立新的 ENI。每個 Hyperplane ENI 均支援多達 65,000 個連線/連接埠。如果連線數量超過此限制，Lambda 會根據網路流量和並行需求自動擴展 ENI 數量。

對於新函數，當 Lambda 正在建立 Hyperplane ENI 時，函數會保持待定狀態，您無法調用它。只有在 Hyperplane ENI 就緒時，函數才會轉換為作用中狀態，這可能需要幾分鐘的時間。對於現有函數，您無法執行針對函數的其他操作，例如建立版本或更新函數的程式碼，但您可以繼續調用函數的先前版本。

在管理 ENI 生命週期的過程中，Lambda 可能會刪除並重新建立 ENI，以此平衡跨多個 ENI 的網路流量負載，或解決 ENI 運作狀態檢查中發現的問題。此外，如果 Lambda 函式連續保持閒置狀態 14 天，Lambda 會回收未使用的所有 Hyperplane ENI，並將函式狀態設定為 `Inactive`。下一個調用嘗試將失敗，而且函數會重新進入擱置狀態，直到 Lambda 完成 Hyperplane ENI 的建立或配置為止。建議設計不要依賴 ENI 的持續性。

當您更新函數以移除其 VPC 組態時，Lambda 最多需要 20 分鐘才能刪除連接的 Hyperplane ENI。Lambda 只會在沒有其他函數 (或已發佈的函數版本) 使用該 Hyperplane ENI 時刪除 ENI。

Lambda 需要函數[執行角色](lambda-intro-execution-role.md)中的許可才能刪除 Hyperplane ENI。如果您在 Lambda 刪除 Hyperplane ENI 之前刪除執行角色，Lambda 將無法刪除 Hyperplane ENI。您可以手動執行刪除作業。

## 使用 IAM 條件金鑰進行 VPC 設定
<a name="vpc-conditions"></a>

您可以針對 VPC 設定使用 Lambda 特定條件金鑰，為您的 Lambda 函數提供額外的許可控制。例如，您可以請求組織中的所有功能都連線到 VPC。您也可以指定函數的使用者可以和不可以使用的子網路和安全性群組。

Lambda 支援 IAM 政策中的以下條件金鑰：
+ **lambda:VpcIds** - 允許或拒絕一個或多個 VPC。
+ **lambda:SubnetIds** - 允許或拒絕一個或多個子網路。
+ **lambda:SecurityGroupIds** - 允許或拒絕一個或多個安全群組。

Lambda API 操作 [CreateFunction](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html) 和 [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html) 支援這些條件金鑰。如需有關在 IAM 政策中使用條件金鑰的詳細資訊，請參閱 *IAM 使用者指南*中的 [IAM JSON 政策元素：條件](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)。

**提示**  
如果您的函數已經包含來自先前 API 請求的 VPC 組態，則可以在沒有 VPC 組態的情況下傳送 `UpdateFunctionConfiguration` 請求。

### 具有 VPC 設定條件金鑰的範例政策
<a name="vpc-condition-examples"></a>

下列範例示範如何使用條件金鑰進行 VPC 設定。建立具有所需限制的政策陳述式之後，請附加目標 使用者或角色的政策陳述式。

#### 確保使用者僅部署與 VPC 連線的函數
<a name="vpc-condition-example-1"></a>

若要確保所有使用者僅部署與 VPC 連線的函數，您可以拒絕不含有效 VPC ID 的函數建立和更新操作。

請注意，VPC ID 不是 `CreateFunction` 或 `UpdateFunctionConfiguration` 請求的輸入參數。Lambda 會根據子網路和安全群組參數擷取 VPC ID 值。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "EnforceVPCFunction",
      "Action": [
          "lambda:CreateFunction",
          "lambda:UpdateFunctionConfiguration"
       ],
      "Effect": "Deny",
      "Resource": "*",
      "Condition": {
        "Null": {
           "lambda:VpcIds": "true"
        }
      }
    }
  ]
}
```

------

#### 拒絕使用者存取特定 VPC、子網路或安全群組
<a name="vpc-condition-example-2"></a>

若要拒絕使用者存取特定 VPC，請使用 `StringEquals` 來檢查 `lambda:VpcIds` 條件的值。下列範例會拒絕使用者存取 `vpc-1` 和 `vpc-2`。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "EnforceOutOfVPC",
            "Action": [
                "lambda:CreateFunction",
                "lambda:UpdateFunctionConfiguration"
            ],
            "Effect": "Deny",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "lambda:VpcIds": [
                        "vpc-1",
                        "vpc-2"
                    ]
                }
            }
        }
    ]
}
```

------

若要拒絕使用者存取特定子網路，請使用 `StringEquals` 來檢查 `lambda:SubnetIds` 條件的值。下列範例會拒絕使用者存取 `subnet-1` 和 `subnet-2`。

```
{
      "Sid": "EnforceOutOfSubnet",
      "Action": [
          "lambda:CreateFunction",
          "lambda:UpdateFunctionConfiguration"
       ],
      "Effect": "Deny",
      "Resource": "*",
      "Condition": {
        "ForAnyValue:StringEquals": {
            "lambda:SubnetIds": ["subnet-1", "subnet-2"]
        }
      }
    }
```

若要拒絕使用者存取特定安全性群組，請使用 `StringEquals` 來檢查 `lambda:SecurityGroupIds` 條件的值。下列範例會拒絕使用者存取 `sg-1` 和 `sg-2`。

```
{
      "Sid": "EnforceOutOfSecurityGroups",
      "Action": [
          "lambda:CreateFunction",
          "lambda:UpdateFunctionConfiguration"
       ],
      "Effect": "Deny",
      "Resource": "*",
      "Condition": {
        "ForAnyValue:StringEquals": {
            "lambda:SecurityGroupIds": ["sg-1", "sg-2"]
        }
      }
    }
  ]
}
```

#### 允許使用者使用特定 VPC 設定建立和更新功能
<a name="vpc-condition-example-3"></a>

若要允許使用者存取特定 VPC，請使用 `StringEquals` 來檢查 `lambda:VpcIds` 條件的值。下列範例可讓使用者存取 `vpc-1` 和 `vpc-2`。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "EnforceStayInSpecificVpc",
            "Action": [
                "lambda:CreateFunction",
                "lambda:UpdateFunctionConfiguration"
            ],
            "Effect": "Allow",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "lambda:VpcIds": [
                        "vpc-1",
                        "vpc-2"
                    ]
                }
            }
        }
    ]
}
```

------

若要允許使用者存取特定子網路，請使用 `StringEquals` 來檢查 `lambda:SubnetIds` 條件的值。下列範例可讓使用者存取 `subnet-1` 和 `subnet-2`。

```
{
      "Sid": "EnforceStayInSpecificSubnets",
      "Action": [
          "lambda:CreateFunction",
          "lambda:UpdateFunctionConfiguration"
       ],
      "Effect": "Allow",
      "Resource": "*",
      "Condition": {
        "ForAllValues:StringEquals": {
            "lambda:SubnetIds": ["subnet-1", "subnet-2"]
        }
      }
    }
```

若要允許使用者存取特定安全性群組，請使用 `StringEquals` 來檢查 `lambda:SecurityGroupIds` 條件的值。下列範例可讓使用者存取 `sg-1` 和 `sg-2`。

```
{
      "Sid": "EnforceStayInSpecificSecurityGroup",
      "Action": [
          "lambda:CreateFunction",
          "lambda:UpdateFunctionConfiguration"
       ],
      "Effect": "Allow",
      "Resource": "*",
      "Condition": {
        "ForAllValues:StringEquals": {
            "lambda:SecurityGroupIds": ["sg-1", "sg-2"]
        }
      }
    }
  ]
}
```

## VPC 教學課程
<a name="vpc-tutorials"></a>

在以下教學中，您會將 Lambda 函數連線至 VPC 中的資源。
+ [教學課程：使用 Lambda 函數來存取 Amazon VPC 中的 Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-lambda-tutorial.html)
+ [教學課程：設定 Lambda 函數以在 Amazon VPC 中存取 Amazon ElastiCache](https://docs.aws.amazon.com/AmazonElastiCache/latest/dg/LambdaRedis.html)

# 讓 Lambda 函數存取另一個帳戶中 Amazon VPC 中的資源
<a name="configuration-vpc-cross-account"></a>

您可以讓 AWS Lambda 函數存取由另一個帳戶管理的 Amazon Virtual Private Cloud 中的 Amazon VPC 中的資源，而無需將任一 VPC 暴露到網際網路。此存取模式可讓您使用 與其他組織共用資料 AWS。使用此存取模式，可以在 VPC 之間共用資料，其安全性和效能高於網際網路。將 Lambda 函數設定為使用 Amazon VPC 對等互連來存取這些資源。

**警告**  
當您允許帳戶或 VPC 之間的存取時，請檢查您的計劃是否符合管理這些帳戶之各個組織的安全要求。遵循本文件中的指示將影響資源的安全狀態。

在本教學課程中，使用 IPv4 透過對等互連將兩個帳戶連線在一起。可以設定尚未連線至 Amazon VPC 的 Lambda 函數。可以設定 DNS 解析，將函數連線到不提供靜態 IP 的資源。若要調整這些說明以適應其他對等互連案例，請參閱 [VPC 對等互連指南](https://docs.aws.amazon.com//vpc/latest/peering/what-is-vpc-peering.html)。

## 先決條件
<a name="w2aac35c65b9"></a>

若要讓 Lambda 函數存取另一個帳戶中的資源，您必須擁有：
+ Lambda 函數，設定為對資源進行身分驗證，然後從資源中讀取。
+ 另一個帳戶中的資源，例如 Amazon RDS 叢集，可透過 Amazon VPC 提供。
+ Lambda 函數帳戶和資源帳戶的憑證。如果您無權使用資源的帳戶，請聯絡授權使用者以準備該帳戶。
+ 建立和更新 VPC (並支援 Amazon VPC 資源) 以與 Lambda 函數建立關聯的許可。
+ 更新 Lambda 函數執行角色和 VPC 組態的許可。
+ 在 Lambda 函數帳戶中建立 VPC 對等互連的許可。
+ 在資源帳戶中接受 VPC 對等互連的許可。
+ 更新資源 VPC (並支援 Amazon VPC 資源) 組態的許可。
+ 調用 Lambda 函數的許可。

## 在函數帳戶中建立 Amazon VPC
<a name="w2aac35c65c11"></a>

在 Lambda 函數帳戶中建立 Amazon VPC、子網路、路由表和安全群組。

**如何使用主控台建立 VPC、子網路和其他 VPC 資源**

1. 在 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) 開啟 Amazon VPC 主控台。

1. 在儀表板上，選擇**建立 VPC**。

1. 對於 **IPv4 CIDR 區塊**，請提供私有 CIDR 區塊。CIDR 區塊不得與資源 VPC 中使用的區塊重疊。請勿挑選資源 VPC 用來將 IP 指派給資源的區塊，或已在資源 VPC 的路由表中定義的區塊。如需有關定義適當 CIDR 區塊的詳細資訊，請參閱 [VPC CIDR 區塊](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-cidr-blocks.html)。

1. 選擇**自訂可用區域**。

1. 選取與資源相同的可用區域。

1. 針對**公有子網路數量**，選擇 **0**。

1. 對於 **VPC endpoints** (VPC 端點)，選擇 **None** (無)。

1. 選擇**建立 VPC**。

## 為函數的執行角色授予 VPC 許可
<a name="w2aac35c65c13"></a>

將 [AWSLambdaVPCAccessExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaVPCAccessExecutionRole.html) 附接至函數的執行角色，以允許它連線到 VPC。

**若要為函數的執行角色授予 VPC 許可**

1. 開啟 Lambda 主控台中的[函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇 函數的名稱。

1. 選擇 **Configuration (組態)**。

1. 選擇**許可**。

1. 在**角色名稱**中，選擇執行角色。

1. 在**許可政策**區段中，選擇**新增許可**。

1. 在下拉式清單中，選擇**附接政策**。

1. 在搜尋方塊中，輸入 `AWSLambdaVPCAccessExecutionRole`。

1. 若要在政策名稱的左側，選擇核取方塊。

1. 選擇**新增許可**。

**若要將函數連接至 Amazon VPC**

1. 開啟 Lambda 主控台中的[函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇 函數的名稱。

1. 選擇**組態**索引標籤，然後選擇 **VPC**。

1. 選擇**編輯**。

1. 在 **VPC** 中，選取您的 VPC

1. 在**子網路**中，選擇子網路。

1. 在**安全群組**中，選擇 VPC 的預設安全群組。

1. 選擇**儲存**。

## 建立 VPC 對等互連請求
<a name="w2aac35c65c17"></a>

建立從函數的 VPC (請求者 VPC) 到資源的 VPC (接受者 VPC) 的 VPC 對等互連請求。

**若要從函數的 VPC 請求 VPC 對等互連**

1. 開啟 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)。

1. 在導覽窗格中，選擇 **Peering connections** (對等互連)。

1. 關閉 **Create peering connection** (建立對等互連)。

1. 對於 **VPC ID (請求者)**，選取函數的 VPC。

1. 對於**帳戶 ID**，輸入資源帳戶的 ID。

1. 對於 **VPC ID (接受者)**，輸入資源的 VPC。

## 準備資源的帳戶
<a name="w2aac35c65c19"></a>

若要建立對等互連並準備資源的 VPC 以使用連線，請使用具有先決條件中所列許可的角色來登入資源的帳戶。登入步驟可能會根據帳戶的保護措施而有所不同。如需如何登入 AWS 帳戶的詳細資訊，請參閱 [AWS 登入使用者指南](https://docs.aws.amazon.com//signin/latest/userguide/what-is-sign-in.html)。在資源的帳戶中，執行下列程序。

**若要接受 VPC 對等互連請求**

1. 開啟 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)。

1. 在導覽窗格中，選擇 **Peering connections** (對等互連)。

1. 選取待定 VPC 對等互連 (狀態為待接受)。

1. 選擇 **動作**

1. 從下拉式清單中，選擇**接受請求**。

1. 出現確認提示時，請選擇**接受請求**。

1. 選擇**立即修改我的路由表**，將路由新增至 VPC 的主路由表，以便透過對等互連傳送和接收流量。

檢查資源 VPC 的路由表。根據資源 VPC 的設定方式，Amazon VPC 產生的路由可能無法建立連線。檢查新路由與 VPC 現有組態之間的衝突。如需有關疑難排解的詳細資訊，請參閱《Amazon 虛擬私有雲端 VPC 對等互連指南》中的 [VPC 對等互連疑難排解](https://docs.aws.amazon.com/vpc/latest/peering/troubleshoot-vpc-peering-connections.html)。**

**若要更新資源的安全群組**

1. 開啟 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)。

1. 在導覽窗格中，選擇**安全群組**。

1. 選取資源的安全群組。

1. 選擇**動作**。

1. 從下拉式清單中，選擇**編輯傳入規則**。

1. 選擇**新增規則**。

1. 針對**來源**輸入函數的帳戶 ID 和安全群組 ID，以斜線分隔 (例如 111122223333/sg-1a2b3c4d)。

1. 選擇**編輯傳出規則**。

1. 檢查是否限制傳出流量。預設 VPC 設定允許所有傳出流量。如果傳出流量受限，請繼續下一個步驟。

1. 選擇**新增規則**。

1. 針對**目的地**輸入函數的帳戶 ID 和安全群組 ID，以斜線分隔 (例如 111122223333/sg-1a2b3c4d)。

1. 選擇**儲存規則**。

**若要啟用對等互連的 DNS 解析**

1. 開啟 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)。

1. 在導覽窗格中，選擇 **Peering connections** (對等互連)。

1. 選取您的對等互連。

1. 選擇**動作**。

1. 選擇**編輯 DNS 設定**。

1. 在**接受者 DNS 解析**下，選取**允許請求者 VPC 將接受者 VPC 主機的 DNS 解析為私有 IP**。

1. 選擇**儲存變更**。

## 更新函數帳戶中的 VPC 組態
<a name="w2aac35c65c21"></a>

登入函數的帳戶，然後更新 VPC 組態。

**若要新增 VPC 對等互連的路由**

1. 開啟 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)。

1. 在導覽窗格中，選擇 **Route tables** (路由表)。

1. 選取與函數相關聯子網路的路由表名稱旁邊的核取方塊。

1. 選擇**動作**。

1. 選擇 **Edit routes** (編輯路由)。

1. 選擇 **Add route** (新增路由)。

1. 對於**目的地**，輸入資源 VPC 的 CIDR 區塊。

1. 對於**目標**，選取 VPC 對等互連。

1. 選擇**儲存變更**。

如需有關更新路由表時可能遇到之考量的詳細資訊，請參閱[更新 VPC 對等互連的路由表](https://docs.aws.amazon.com//vpc/latest/peering/vpc-peering-routing.html)。

**若要更新 Lambda 函數的安全群組**

1. 開啟 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)。

1. 在導覽窗格中，選擇**安全群組**。

1. 選擇**動作**。

1. 選擇 **Edit inbound Rules** (編輯傳入規則)。

1. 選擇**新增規則**。

1. 對於**來源**，輸入資源的帳戶 ID 和安全群組 ID，以正斜線分隔 (例如 111122223333/sg-1a2b3c4d)。

1. 選擇**儲存規則**。

**若要啟用對等互連的 DNS 解析**

1. 開啟 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)。

1. 在導覽窗格中，選擇 **Peering connections** (對等互連)。

1. 選取您的對等互連。

1. 選擇**動作**。

1. 選擇**編輯 DNS 設定**。

1. 在**請求者 DNS 解析**下，選取**允許接受者 VPC 將請求者 VPC 主機的 DNS 解析為私有 IP**。

1. 選擇**儲存變更**。

## 測試 函數
<a name="w2aac35c65c23"></a>

**若要建立測試事件並檢查函數的輸出**

1. 在**程式碼來源**窗格中選擇**測試**。

1. 選取**建立新事件**。

1. 在**事件 JSON** 面板中，將預設值取代為 Lambda 函數適用的輸入。

1. 選擇**調用**。

1. 在**執行結果**索引標籤中，確認**回應**包含預期輸出。

此外，可以檢查函數的日誌，確認日誌如您所預期。

**若要在 CloudWatch Logs 中檢視函數的調用記錄**

1. 選擇 **Monitor** (監控) 索引標籤。

1. 選擇**檢視 CloudWatch 日誌**。

1. 在**日誌串流**標籤上，為函數調用選擇日誌串流。

1. 確認日誌如您所預期。

# 啟用 VPC 連線的 Lambda 函數的網際網路存取
<a name="configuration-vpc-internet"></a>

根據預設，會在具有網際網路存取權的 Lambda 受管 VPC 中執行 Lambda 函數。若要存取帳戶中 VPC 的資源，可以將 VPC 組態新增至函數。這會將函數限制在該 VPC 內的資源，除非 VPC 具有網際網路存取權。此頁面說明如何提供 VPC 所連接 Lambda 函數的網際網路存取。

## 我還沒有 VPC
<a name="new-vpc"></a>

### 建立 VPC
<a name="create-vpc-internet"></a>

**建立 VPC 工作流程**會建立 Lambda 函數所需的所有 VPC 資源，以從私有子網路中存取公有網際網路，包括子網路、NAT 閘道、網際網路閘道和路由表項目。

**若要建立 VPC**

1. 在 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) 開啟 Amazon VPC 主控台。

1. 在儀表板上，選擇**建立 VPC**。

1. 針對 **Resources to create** (建立資源)，選擇 **VPC and more** (VPC 等)。

1. **設定 VPC**

   1. 針對**自動產生名稱標籤**，輸入 VPC 的名稱。

   1. 對於 **IPv4 CIDR 區塊**，您可以保留預設建議，或者您也可以輸入應用程式或網路所需的 CIDR 區塊。

   1. 如果您的應用程式使用 IPv6 地址進行通訊，請選擇 **IPv6 CIDR 區塊** > **Amazon 提供的 IPv6 CIDR 區塊**。

1. **設定子網路**

   1. 針對**可用區域數量**，選擇 **2**。建議至少使用兩個可用區域，以實現高可用性。

   1. 針對**公用子網路數量**，選擇 **2**。

   1. 在 **Number of private subnet** (私有子網路數量) 中，選擇 **2**。

   1. 您可以保留公有子網路的預設 CIDR 區塊，或者您也可以展開**自訂子網路 CIDR 區塊**並輸入 CIDR 區塊。如需詳細資訊，請參閱[子網路 CIDR 區塊](https://docs.aws.amazon.com/vpc/latest/userguide/subnet-sizing.html)。

1. 若為 **NAT 閘道**，請選擇**每個 AZ 1 個**以提高彈性。

1. 對於**僅限輸出的網際網路閘道**，如果選擇包含 IPv6 CIDR 區塊，請選擇**是**。

1. 若為 **VPC 端點**，請保留預設值 (**S3 閘道**)。此選項沒有任何費用。如需詳細資訊，請參閱[適用於 Amazon S3 的 VPC 端點類型](https://docs.aws.amazon.com/AmazonS3/latest/userguide/privatelink-interface-endpoints.html#types-of-vpc-endpoints-for-s3)。

1. 對於 **DNS 選項**，保留預設的設定。

1. 選擇**建立 VPC**。

### 設定 Lambda 函數
<a name="vpc-function-internet-create"></a>

**若要在建立函數時設定 VPC**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇**建立函數**。

1. 在 **Basic information (基本資訊)** 下，對於 **Function name (函數名稱)**，為您的函數輸入名稱。

1. 展開 **Advanced settings** (進階設定)。

1. 選取**啟用 VPC**，然後選擇一個 VPC。

1. (選擇性) 若要允許[傳出 IPv6 流量](configuration-vpc.md#configuration-vpc-ipv6)，請選取**允許雙堆疊子網路的 IPv6 流量**。

1. 對於**子網路**，選取所有私有子網路。私有子網路可透過 NAT 閘道存取網際網路。將函數連線到公有子網路並不會為其提供網際網路存取。
**注意**  
如果您選取**允許雙堆疊子網路的 IPv6 流量**，則所有選取的子網路均必須具有 IPv4 CIDR 區塊和 IPv6 CIDR 區塊。

1. 對於**安全群組**，選取允許傳出流量的安全群組。

1. 選擇**建立函數**。

Lambda 會使用 [AWSLambdaVPCAccessExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaVPCAccessExecutionRole.html) AWS 受管政策自動建立執行角色。此政策中的許可僅適用於為 VPC 組態建立彈性網路介面，而非調用函數。若要套用最低權限許可，可以在建立函數和 VPC 組態後，從執行角色中移除 **AWSLambdaVPCAccessExecutionRole** 政策。如需詳細資訊，請參閱[所需的 IAM 許可](configuration-vpc.md#configuration-vpc-permissions)。

**若要為現有函數設定 VPC**

若要將 VPC 組態新增至現有函數，函數的執行角色必須擁有[建立和管理彈性網路介面的許可](configuration-vpc.md#configuration-vpc-permissions)。[AWSLambdaVPCAccessExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaVPCAccessExecutionRole.html) AWS 受管政策包含必要的許可。若要套用最低權限許可，可以在建立 VPC 組態後，從執行角色中移除 **AWSLambdaVPCAccessExecutionRole** 政策。

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇一個函數。

1. 選擇**組態**索引標籤，然後選擇 **VPC**。

1. 在 **VPC** 下，選擇 **Edit (編輯)**。

1. 選取 VPC。

1. (選擇性) 若要允許[傳出 IPv6 流量](configuration-vpc.md#configuration-vpc-ipv6)，請選取**允許雙堆疊子網路的 IPv6 流量**。

1. 對於**子網路**，選取所有私有子網路。私有子網路可透過 NAT 閘道存取網際網路。將函數連線到公有子網路並不會為其提供網際網路存取。
**注意**  
如果您選取**允許雙堆疊子網路的 IPv6 流量**，則所有選取的子網路均必須具有 IPv4 CIDR 區塊和 IPv6 CIDR 區塊。

1. 對於**安全群組**，選取允許傳出流量的安全群組。

1. 選擇**儲存**。

### 測試函數
<a name="vpc-function-internet-test"></a>

使用下列範例程式碼，確認 VPC 連線的函數可以連線到公有網際網路。如果成功，程式碼會傳回 `200` 狀態碼。如果失敗，函數會逾時。

------
#### [ Node.js ]

1. 在 Lambda 主控台的**程式碼來源**窗格中，將下列程式碼貼到 **index.mjs** 檔案中。函數會對公有端點發出 HTTP GET 請求，並傳回 HTTP 回應程式碼，以測試函數是否可存取公有網際網路。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/code-source-nodejs.png)  
**Example — 具有 async/await 的 HTTP 請求**  

   ```
   const url = "https://aws.amazon.com/";
   
   export const handler = async(event) => {
       try {
           const res = await fetch(url);
           console.info("status", res.status);
           return res.status;
       }
       catch (e) {
           console.error(e);
           return 500;
       }
   };
   ```

1. 在 **DEPLOY** 區段中，選擇**部署**以更新函數的程式碼：  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

1. 選擇**測試**標籤。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/test-tab.png)

1. 選擇**測試**。

1. 函數會傳回 `200` 狀態碼。這表示函數擁有傳出網際網路存取權。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/test-successful-200.png)

   如果函數無法連線到公有網際網路，會收到類似以下的錯誤訊息：

   ```
   {
     "errorMessage": "2024-04-11T17:22:20.857Z abe12jlc-640a-8157-0249-9be825c2y110 Task timed out after 3.01 seconds"
   }
   ```

------
#### [ Python ]

1. 在 Lambda 主控台的**程式碼來源**窗格中，將下列程式碼貼到 **lambda\$1function.py** 檔案中。函數會對公有端點發出 HTTP GET 請求，並傳回 HTTP 回應程式碼，以測試函數是否可存取公有網際網路。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/code-source-python.png)

   ```
   import urllib.request
   
   def lambda_handler(event, context):
       try:
           response = urllib.request.urlopen('https://aws.amazon.com')
           status_code = response.getcode()
           print('Response Code:', status_code)
           return status_code
       except Exception as e:
           print('Error:', e)
           raise e
   ```

1. 在 **DEPLOY** 區段中，選擇**部署**以更新函數的程式碼：  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

1. 選擇**測試**標籤。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/test-tab.png)

1. 選擇**測試**。

1. 函數會傳回 `200` 狀態碼。這表示函數擁有傳出網際網路存取權。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/test-successful-200.png)

   如果函數無法連線到公有網際網路，會收到類似以下的錯誤訊息：

   ```
   {
     "errorMessage": "2024-04-11T17:22:20.857Z abe12jlc-640a-8157-0249-9be825c2y110 Task timed out after 3.01 seconds"
   }
   ```

------

## 我已擁有 VPC
<a name="existing-vpc"></a>

如果您已擁有 VPC，但需要設定 Lambda 函數的公有網際網路存取，請遵循下列步驟。此程序假設您的 VPC 擁有至少兩個子網路。如果沒有兩個子網路，請參閱《Amazon VPC 使用者指南》中的[建立子網路](https://docs.aws.amazon.com/vpc/latest/userguide/create-subnets.html)。**

### 驗證路由表組態
<a name="vpc-internet-routes"></a>

1. 在 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) 開啟 Amazon VPC 主控台。

1. 選擇 **VPC ID**。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/vpc-id.png)

1. 向下捲動至**資源映射**區段。請注意路由表映射。開啟映射至子網路的每個路由表。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/route-table-associations.png)

1. 向下捲動至**路由**索引標籤。檢閱路由設定，判斷 VPC 是否具有下列兩個路由表。每個需求都必須透過單獨的路由表來滿足。
   + 網際網路流量 (IPv4 為 `0.0.0.0/0`、IPv6 為 `::/0`) 會路由至網際網路閘道 (`igw-xxxxxxxxxx`)。這意味著與路由表相關聯的子網路是公有子網路。
**注意**  
如果子網路沒有 IPv6 CIDR 區塊，則只能看到 IPv4 路由 (`0.0.0.0/0`)。  
**Example 公有子網路路由表**    
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/routes-public.png)
   + IPv4 (`0.0.0.0/0`) 的網際網路流量會路由至與公有子網路相關聯的 NAT 閘道 (`nat-xxxxxxxxxx`)。這意味著子網路是私有子網路，可透過 NAT 閘道存取網際網路。
**注意**  
如果子網路具有 IPv6 CIDR 區塊，路由表也必須將網際網路 IPv6 流量 (`::/0`) 路由至僅限輸出的網際網路閘道 (`eigw-xxxxxxxxxx`)。如果子網路沒有 IPv6 CIDR 區塊，則只能看到 IPv4 路由 (`0.0.0.0/0`)。  
**Example 私有子網路路由表**    
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/routes-private.png)

1. 重複上述步驟，直到您已檢閱 VPC 中與子網路關聯的每個路由表，並確認您有一個具有網際網路閘道的路由表，以及一個具有 NAT 閘道的路由表。

   如果沒有兩個路由表，其中一個可路由到網際網路閘道，另一個可路由到 NAT 閘道，請依照下列步驟建立缺少的資源和路由表項目。

### 建立路由表
<a name="create-route-table"></a>

請依照下列步驟建立路由表，並將其與子網路關聯。

**若要使用 Amazon VPC 主控台建立自訂路由表**

1. 在 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) 開啟 Amazon VPC 主控台。

1. 在導覽窗格中，選擇 **Route tables** (路由表)。

1. 選擇 **Create route table** (建立路由表)。

1. (選用) 針對 **Name** (名稱)，輸入路由表的名稱。

1. 在 **VPC** 中，選擇您的 VPC。

1. (選用) 若要新增標籤，請選擇 **Add new tag** (新增標籤)，然後輸入標籤鍵和標籤值。

1. 選擇 **Create route table** (建立路由表)。

1. 在 **Subnet associations** (子網關聯) 標籤上，選擇 **Edit subnet associations** (編輯子網關聯)。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/route-table-subnet.png)

1. 選取子網路的核取方塊以和路由表建立關聯。

1. 選擇 **Save associations (儲存關聯)**。

### 建立網際網路閘道
<a name="create-igw"></a>

請依照下列步驟建立網際網路閘道，將其連接至 VPC，並將其新增至公有子網路的路由表。

**建立網際網路閘道**

1. 在 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) 開啟 Amazon VPC 主控台。

1. 在導覽窗格中，選擇 **Internet gateways** (網際網路閘道)。

1. 選擇**建立網際網路閘道**。

1. (可選) 輸入網際網路閘道的名稱。

1. (選用) 若要新增標籤，請選擇 **Add new tag** (新增標籤)，然後輸入標籤金鑰和值。

1. 選擇**建立網際網路閘道**。

1. 從畫面頂端的橫幅中選擇**附接至 VPC**，選取可用的 VPC，然後選擇**附接網際網路閘道**。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/igw-attach-vpc.png)

1. 選擇 **VPC ID**。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/igw-subnet-1.png)

1. 再次選擇 **VPC ID** 以開啟詳細資訊頁面。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/igw-your-vpcs.png)

1. 向下捲動至**資源映射**區段，然後選擇子網路。子網路詳細資訊會顯示在新索引標籤中。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/vpc-subnets.png)

1. 選擇**路由表**下方的連結。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/subnet-route-table.png)

1. 選擇**路由表 ID** 以開啟路由表詳細資訊頁面。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/route-table-id.png)

1. 在**路由**下，選擇**編輯路由**。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/edit-routes.png)

1. 選擇**新增路由**，然後在**目的地**方塊中輸入 `0.0.0.0/0`。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/create-route-1.png)

1. 對於**目標**，選取**網際網路閘道**，然後選擇先前建立的網際網路閘道。如果子網路具有 IPv6 CIDR 區塊，還必須將 `::/0` 的路由新增至相同的網際網路閘道。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/create-route-2.png)

1. 選擇**儲存變更**。

### 建立 NAT 閘道
<a name="create-nat-gateway"></a>

請依照下列步驟建立 NAT 閘道，將其與公有子網路建立關聯，然後將其新增至私有子網路的路由表。

**若要建立 NAT 閘道並將其與公有子網路建立關聯**

1. 在導覽窗格中，選擇 **NAT 閘道**。

1. 選擇**建立 NAT 閘道**。

1. (可選) 輸入 NAT 閘道的名稱。

1. 對於**子網路**，選取 VPC 中的公有子網路。(公有子網路是指可直接路由至其路由表中網際網路閘道的子網路。)
**注意**  
NAT 閘道與公有子網路關聯，但路由表項目位於私有子網路中。

1. 對於**彈性 IP 配置 ID**，選取彈性 IP 位址，或選擇**配置彈性 IP**。

1. 選擇**建立 NAT 閘道**。

**若要將路由新增至私有子網路路由表中的 NAT 閘道**

1. 在導覽窗格中，選擇 **Subnets** (子網)。

1. 選取 VPC 中的私有子網路。(私有子網路是指不可路由至其路由表中網際網路閘道的子網路。)

1. 選擇**路由表**下方的連結。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/subnet-route-table.png)

1. 選擇**路由表 ID** 以開啟路由表詳細資訊頁面。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/route-table-id.png)

1. 向下捲動並選擇**路由**索引標籤，然後選擇**編輯路由**  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/route-table-edit-routes.png)

1. 選擇**新增路由**，然後在**目的地**方塊中輸入 `0.0.0.0/0`。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/create-route-1.png)

1. 對於**目標**，選取 **NAT 閘道**，然後選擇先前建立的 NAT 閘道。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/create-route-nat.png)

1. 選擇**儲存變更**。

### 建立僅限輸出的網際網路閘道 (僅限 IPv6)
<a name="create-egress-gateway"></a>

請依照下列步驟建立僅限輸出的網際網路閘道，並將其新增至私有子網路的路由表。

**建立輸出限定網際網路閘道**

1. 在導覽窗格中，選擇**輸出限定網際網路閘道**。

1. 選擇**建立輸出限定網際網路閘道**。

1. (選用) 輸入名稱。

1. 選取要在其中建立輸出限定網際網路閘道的 VPC。

1. 選擇**建立輸出限定網際網路閘道**。

1. 選擇**已附接 VPC ID** 下方的連結。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/eigw-details.png)

1. 選擇 **VPC ID** 下方的連結，以開啟 VPC 詳細資訊頁面。

1. 向下捲動至**資源映射**區段，然後選擇私有子網路。(私有子網路是指不可路由至其路由表中網際網路閘道的子網路。) 子網路詳細資訊會顯示在新索引標籤中。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/vpc-subnet-private.png)

1. 選擇**路由表**下方的連結。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/private-subnet-route-table.png)

1. 選擇**路由表 ID** 以開啟路由表詳細資訊頁面。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/route-table-id.png)

1. 在**路由**下，選擇**編輯路由**。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/edit-routes.png)

1. 選擇**新增路由**，然後在**目的地**方塊中輸入 `::/0`。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/create-route-1.png)

1. 對於**目標**，選取**僅限輸出的網際網路閘道**，然後選擇先前建立的閘道。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/eigw-route.png)

1. 選擇**儲存變更**。

### 設定 Lambda 函數
<a name="vpc-function-internet-create-existing"></a>

**若要在建立函數時設定 VPC**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇**建立函數**。

1. 在 **Basic information (基本資訊)** 下，對於 **Function name (函數名稱)**，為您的函數輸入名稱。

1. 展開 **Advanced settings** (進階設定)。

1. 選取**啟用 VPC**，然後選擇一個 VPC。

1. (選擇性) 若要允許[傳出 IPv6 流量](configuration-vpc.md#configuration-vpc-ipv6)，請選取**允許雙堆疊子網路的 IPv6 流量**。

1. 對於**子網路**，選取所有私有子網路。私有子網路可透過 NAT 閘道存取網際網路。將函數連線到公有子網路並不會為其提供網際網路存取。
**注意**  
如果您選取**允許雙堆疊子網路的 IPv6 流量**，則所有選取的子網路均必須具有 IPv4 CIDR 區塊和 IPv6 CIDR 區塊。

1. 對於**安全群組**，選取允許傳出流量的安全群組。

1. 選擇**建立函數**。

Lambda 會使用 [AWSLambdaVPCAccessExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaVPCAccessExecutionRole.html) AWS 受管政策自動建立執行角色。此政策中的許可僅適用於為 VPC 組態建立彈性網路介面，而非調用函數。若要套用最低權限許可，可以在建立函數和 VPC 組態後，從執行角色中移除 **AWSLambdaVPCAccessExecutionRole** 政策。如需詳細資訊，請參閱[所需的 IAM 許可](configuration-vpc.md#configuration-vpc-permissions)。

**若要為現有函數設定 VPC**

若要將 VPC 組態新增至現有函數，函數的執行角色必須擁有[建立和管理彈性網路介面的許可](configuration-vpc.md#configuration-vpc-permissions)。[AWSLambdaVPCAccessExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaVPCAccessExecutionRole.html) AWS 受管政策包含必要的許可。若要套用最低權限許可，可以在建立 VPC 組態後，從執行角色中移除 **AWSLambdaVPCAccessExecutionRole** 政策。

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇一個函數。

1. 選擇**組態**索引標籤，然後選擇 **VPC**。

1. 在 **VPC** 下，選擇 **Edit (編輯)**。

1. 選取 VPC。

1. (選擇性) 若要允許[傳出 IPv6 流量](configuration-vpc.md#configuration-vpc-ipv6)，請選取**允許雙堆疊子網路的 IPv6 流量**。

1. 對於**子網路**，選取所有私有子網路。私有子網路可透過 NAT 閘道存取網際網路。將函數連線到公有子網路並不會為其提供網際網路存取。
**注意**  
如果您選取**允許雙堆疊子網路的 IPv6 流量**，則所有選取的子網路均必須具有 IPv4 CIDR 區塊和 IPv6 CIDR 區塊。

1. 對於**安全群組**，選取允許傳出流量的安全群組。

1. 選擇**儲存**。

### 測試函數
<a name="vpc-function-internet-test-existing"></a>

使用下列範例程式碼，確認 VPC 連線的函數可以連線到公有網際網路。如果成功，程式碼會傳回 `200` 狀態碼。如果失敗，函數會逾時。

------
#### [ Node.js ]

1. 在 Lambda 主控台的**程式碼來源**窗格中，將下列程式碼貼到 **index.mjs** 檔案中。函數會對公有端點發出 HTTP GET 請求，並傳回 HTTP 回應程式碼，以測試函數是否可存取公有網際網路。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/code-source-nodejs.png)  
**Example — 具有 async/await 的 HTTP 請求**  

   ```
   const url = "https://aws.amazon.com/";
   
   export const handler = async(event) => {
       try {
           const res = await fetch(url);
           console.info("status", res.status);
           return res.status;
       }
       catch (e) {
           console.error(e);
           return 500;
       }
   };
   ```

1. 在 **DEPLOY** 區段中，選擇**部署**以更新函數的程式碼：  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

1. 選擇**測試**標籤。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/test-tab.png)

1. 選擇**測試**。

1. 函數會傳回 `200` 狀態碼。這表示函數擁有傳出網際網路存取權。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/test-successful-200.png)

   如果函數無法連線到公有網際網路，會收到類似以下的錯誤訊息：

   ```
   {
     "errorMessage": "2024-04-11T17:22:20.857Z abe12jlc-640a-8157-0249-9be825c2y110 Task timed out after 3.01 seconds"
   }
   ```

------
#### [ Python ]

1. 在 Lambda 主控台的**程式碼來源**窗格中，將下列程式碼貼到 **lambda\$1function.py** 檔案中。函數會對公有端點發出 HTTP GET 請求，並傳回 HTTP 回應程式碼，以測試函數是否可存取公有網際網路。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/code-source-python.png)

   ```
   import urllib.request
   
   def lambda_handler(event, context):
       try:
           response = urllib.request.urlopen('https://aws.amazon.com')
           status_code = response.getcode()
           print('Response Code:', status_code)
           return status_code
       except Exception as e:
           print('Error:', e)
           raise e
   ```

1. 在 **DEPLOY** 區段中，選擇**部署**以更新函數的程式碼：  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

1. 選擇**測試**標籤。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/test-tab.png)

1. 選擇**測試**。

1. 函數會傳回 `200` 狀態碼。這表示函數擁有傳出網際網路存取權。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/test-successful-200.png)

   如果函數無法連線到公有網際網路，會收到類似以下的錯誤訊息：

   ```
   {
     "errorMessage": "2024-04-11T17:22:20.857Z abe12jlc-640a-8157-0249-9be825c2y110 Task timed out after 3.01 seconds"
   }
   ```

------

# 連線 Lambda 的傳入介面 VPC 端點
<a name="configuration-vpc-endpoints"></a>

如果您使用 Amazon Virtual Private Cloud (Amazon VPC) 來託管您的 AWS 資源，可以在您的 VPC 與 Lambda 之間建立連線。您可以使用此連線來叫用您的 Lambda 函數，而不需要透過公有網際網路。

若要在 VPC 與 Lambda 之間建立私有連線，請建立[介面 VPC 端點](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html)。介面端點由 [AWS PrivateLink](https://aws.amazon.com/privatelink) 支援，讓您不需要網際網路閘道、NAT 裝置、VPN 連線或 AWS Direct Connect 連線即可私有存取 Lambda API。VPC 中的執行個體不需要公有 IP 地址，即能與 Lambda API 通訊。您的 VPC 與 Lambda 之間的網路流量都不會離開 AWS 網路範圍。

每個介面端點都由子網路中的一個或多個[彈性網路介面](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html)表示。網路介面會提供一個私有 IP 地址，以作為連至 Lambda 的流量進入點。

**Topics**
+ [

## Lambda 介面端點的考量
](#vpc-endpoint-considerations)
+ [

## 為 Lambda 建立介面端點
](#vpc-endpoint-create)
+ [

## 為 Lambda 建立介面端點政策
](#vpc-endpoint-policy)

## Lambda 介面端點的考量
<a name="vpc-endpoint-considerations"></a>

在設定 Lambda 的介面端點之前，請務必檢閱 *Amazon VPC 使用者指南*中的[介面端點屬性和限制](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html#vpce-interface-limitations)。

您可以從 VPC 呼叫任何 Lambda API 操作。例如，您可以從 VPC 內呼叫 `Invoke` API 來叫用 Lambda 函數。如需完整的 Lambda API 清單，請參閱 Lambda API 參考中的[動作](https://docs.aws.amazon.com/lambda/latest/dg/API_Operations.html)。

`use1-az3` 是 Lambda VPC 函數的有限容量區域。您不應將此可用區域中的子網路與 Lambda 函數搭配使用，因為這可能會在出現中斷狀況時導致區域備援減少。

### 用於持續連線的 keep-alive (保持啟用)
<a name="vpc-endpoint-considerations-keepalive"></a>

Lambda 一段時間後會清除閒置連線，因此您必須使用實時指示來維持持續連線。叫用函式時，嘗試重複使用閒置連線會導致連線錯誤。若要維護持續連線，請使用與執行階段相關聯的 keep-alive (保持啟用) 指令。如需範例，請參閱《*適用於 JavaScript 的 AWS SDK 開發人員指南*》中的[在 Node.js 中重複使用 Keep-Alive 的連線](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/node-reusing-connections.html)。

### 計費考量
<a name="vpc-endpoint-considerations-billing"></a>

透過介面端點來存取 Lambda 函數無需額外成本。如需 Lambda 定價的詳細資訊，請參閱 [AWS Lambda 定價](https://aws.amazon.com/lambda/pricing/)。

AWS PrivateLink 的標準定價適用於 Lambda 的介面端點。對於在每個可用區域中佈建的介面端點，以及透過介面端點處理的資料，都會按每小時向您的 AWS 帳戶收費。如需介面端點定價的詳細資訊，請參閱 [AWS PrivateLink 定價](https://aws.amazon.com/privatelink/pricing/)。

### VPC 對等互連考量
<a name="vpc-endpoint-considerations-peering"></a>

您可以使用 [VPC 對等互連](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html)，將其他 VPC 連線到具有介面端點的 VPC。VPC 對等互連是兩個 VPC 之間的網路連線。您可以在自己的 VPC 之間建立 VPC 對等互連的連線，或與其他 AWS 帳戶的 VPC 建立對等互連的連線。VPC 也可以位於兩個不同的 AWS 區域。

對等互連的 VPC 之間的流量會保留在 AWS 網路上，且不會周遊公用網際網路。VPC 對等互連後，兩個 VPC 中的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體、Amazon Relational Database Service (Amazon RDS) 執行個體或啟用 VPC 功能的 Lambda 函數等這類資源就可以透過在其中一個 VPC 中建立的介面端點來存取 Lambda API。

## 為 Lambda 建立介面端點
<a name="vpc-endpoint-create"></a>

您可使用 Amazon VPC 主控台或 AWS Command Line Interface (AWS CLI) 來為 Lambda 建立介面端點。如需詳細資訊，請參閱《Amazon VPC 使用者指南》**中的[建立介面端點](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html#create-interface-endpoint)。

**若要為 Lambda 建立介面端點 (主控台)**

1. 開啟 Amazon VPC 主控台的 [Endpoints](https://console.aws.amazon.com/vpc/home?#Endpoints) (端點) 頁面。

1. 選擇**建立端點**。

1. 對於**服務類別**，請確定已選擇 **AWS 服務**。

1. 在**服務名稱**中，選擇 **com.amazonaws.*region*.lambda**。確認**類型**為**介面**。

1. 建立 VPC 和子網路

1. 若要啟用介面端點的私有 DNS，請選取 **Enable DNS Name** (啟用 DNS 名稱) 核取方塊。建議您為 AWS 服務 的 VPC 端點啟用私有 DNS 名稱。這可確保使用公有服務端點的請求 (例如透過 AWS SDK 提出的請求) 可解析至您的 VPC 端點。

1. 對於**安全群組**，選擇一或多個安全群組。

1. 選擇**建立端點**。

若要使用私有 DNS 選項，您必須設定 VPC 的 `enableDnsHostnames` 和 `enableDnsSupportattributes`。如需詳細資訊，請參閱 *Amazon VPC 使用者指南*中的[檢視並更新 VPC 的 DNS 支援](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#vpc-dns-updating)。如果您為該介面端點啟用私有 DNS，您可以使用其區域的預設 DNS 名稱 (例如 `lambda.us-east-1.amazonaws.com`)，向 Lambda 發出 API 請求。如需更多服務端點，請參閱《AWS 一般參考》**中的[服務端點和配額](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)。

如需詳細資訊，請參閱《Amazon VPC 使用者指南》**中的[透過介面端點存取服務](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html#access-service-though-endpoint)。

如需使用 CloudFormation 建立和設定端點的詳細資訊，請參閱 *AWS CloudFormation 使用者指南*中的 [AWS::EC2::VPCEndpoint](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html) 資源。

**若要為 Lambda 建立介面端點 (AWS CLI)**  
使用 [create-vpc-endpoint](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/create-vpc-endpoint.html) 命令，並指定 VPC ID、VPC 端點 (介面) 的類型、服務名稱、要使用端點的子網路，以及要與端點網路介面建立關聯的安全群組。例如：

```
aws ec2 create-vpc-endpoint 
  --vpc-id vpc-ec43eb89
  --vpc-endpoint-type Interface
  --service-name com.amazonaws.us-east-1.lambda
  --subnet-id subnet-abababab
  --security-group-id sg-1a2b3c4d
```

## 為 Lambda 建立介面端點政策
<a name="vpc-endpoint-policy"></a>

若要控制誰可以使用您的介面端點，以及使用者可以存取哪些 Lambda 函數，您可以將端點政策連接至您的端點。此政策會指定下列資訊：
+ 可執行動作的主體。
+ 委託人可以執行的動作。
+ 委託人可以對其執行動作的資源。

如需詳細資訊，請參閱《Amazon VPC 使用者指南》**中的[使用 VPC 端點控制對服務的存取](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html)。

**範例：Lambda 動作的介面端點政策**  
以下是 Lambda 端點政策的範例。當連接到端點時，此政策允許使用者 `MyUser` 叫用函式 `my-function`。

**注意**  
您需要在資源中同時包含合格和不合格的函數 ARN。

```
{
   "Statement":[
      {
         "Principal":
         { 
             "AWS": "arn:aws:iam::111122223333:user/MyUser" 
         },
         "Effect":"Allow",
         "Action":[
            "lambda:InvokeFunction"
         ],
         "Resource": [
               "arn:aws:lambda:us-east-2:123456789012:function:my-function",
               "arn:aws:lambda:us-east-2:123456789012:function:my-function:*"
            ]
      }
   ]
}
```

# 設定 Lambda 函數的檔案系統存取權
<a name="configuration-filesystem"></a>

您可以設定函數，將 Amazon Elastic File System (Amazon EFS) 檔案系統掛載到本機目錄。使用 Amazon EFS，您的函數程式碼可安全地存取和修改共用資源，並發揮高度並行效能。

## 支援的地區
<a name="configuration-filesystem-supported-regions"></a>

Amazon EFS for Lambda 已在所有[商業區域](https://docs.aws.amazon.com/general/latest/gr/glos-chap.html#region)推出，但以下區域除外：亞太區域 (紐西蘭)、亞太區域 (台北)、亞太區域 (馬來西亞)、墨西哥 (中部)、亞太區域 (泰國)、加拿大西部 (卡加利)。

**Topics**
+ [

## 支援的地區
](#configuration-filesystem-supported-regions)
+ [

## 執行角色和使用者許可
](#configuration-filesystem-permissions)
+ [

## 設定檔案系統和存取點
](#configuration-filesystem-setup)
+ [

## 連線至檔案系統 (主控台)
](#configuration-filesystem-config)

## 執行角色和使用者許可
<a name="configuration-filesystem-permissions"></a>

如果檔案系統沒有使用者設定的 AWS Identity and Access Management (IAM) 政策，EFS 將使用預設政策，只要是可以使用檔案系統掛載目標連線至檔案系統的用戶端，該政策都會授予完全存取權。如果檔案系統具有使用者設定的 IAM 政策，則函數的執行角色必須具有正確的 `elasticfilesystem` 許可。

**執行角色許可**
+ **elasticfilesystem:ClientMount**
+ **elasticfilesystem:ClientWrite (唯讀連線不需要)**

這些許可包含在 **AmazonElasticFileSystemClientReadWriteAccess** 受管政策中。此外，您的執行角色必須具有[連線至檔案系統的 VPC 所需的許可](configuration-vpc.md#configuration-vpc-permissions)。

設定檔案系統時，Lambda 會使用您的許可來驗證掛載目標。若要設定函數以連線至檔案系統，您的使用者需要下列許可：

**使用者許可**
+ **elasticfilesystem:DescribeMountTargets**

## 設定檔案系統和存取點
<a name="configuration-filesystem-setup"></a>

在函數所連線的每個可用區域中，在具有掛載目標的 Amazon EFS 中建立檔案系統。為了提高效能和彈性，請至少使用兩個可用區域。例如，在簡單的組態中，您可以在不同的可用區域中擁有包含兩個私有子網路的 VPC。此函數連線到兩個子網路，每個子網路都有可用的掛載目標。確定函數和掛載目標所使用的安全群組允許 NFS 流量 (連接埠 2049)。

**注意**  
建立檔案系統時，您選擇稍後無法變更的效能模式。**General purpose (一般用途)** 模式具有較低的延遲，而 **Max I/O (IO 上限)** 模式支援較高的輸送量上限和 IOPS。如需協助選擇，請參閱 *Amazon Elastic File System 使用者指南*中的 [Amazon EFS 效能](https://docs.aws.amazon.com/efs/latest/ug/performance.html)。

存取點會將函數的每個執行個體連線至可用區域連線到的正確掛載目標。為了獲得最佳效能，請使用非根路徑建立存取點，並限制您在每個目錄中建立的檔案數目。下列範例會在檔案系統上建立名為 `my-function` 的目錄，並將擁有者 ID 設為 1001，具有標準目錄許可 (755)。

**Example 存取點組態**  
+ **名稱** – `files`
+ **使用者 ID** – `1001`
+ **群組 ID** – `1001`
+ **路徑** – `/my-function`
+ **許可** – `755`
+ **擁有者使用者 ID** – `1001`
+ **群組使用者 ID** – `1001`

當函數使用存取點時，會提供使用者 ID 1001，並具有目錄的完整存取權。

如需詳細資訊，請參閱 *Amazon Elastic File System 使用者指南*中的下列主題。
+ [為 Amazon EFS 建立資源](https://docs.aws.amazon.com/efs/latest/ug/creating-using.html)
+ [處理使用者、群組和許可](https://docs.aws.amazon.com/efs/latest/ug/accessing-fs-nfs-permissions.html)

## 連線至檔案系統 (主控台)
<a name="configuration-filesystem-config"></a>

此函數會透過 VPC 中的本機網路連線至檔案系統。您的函數連線到的子網路可能是包含檔案系統掛載點的子網路，或同一個可用區域中的子網路，其可將 NFS 流量 (連接埠 2049) 路由至檔案系統。

**注意**  
如果您的函數尚未連線至 VPC，請參閱[讓 Lambda 函數存取 Amazon VPC 中的資源](configuration-vpc.md)。

**設定檔案系統存取權**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇一個函數。

1. 選擇 **組態** ，然後選擇 **檔案系統** 。

1. 在 **檔案系統** 中，選擇 **新增檔案系統**。

1. 設定下列屬性：
   + **EFS file system** (EFS 檔案系統) - 相同 VPC 中的檔案系統存取點。
   + **Local mount path** (本機掛載路徑) - 檔案系統掛載於 Lambda 函數 (以 `/mnt/` 開頭) 的位置。

**定價**  
Amazon EFS 會針對儲存和輸送量收取費用，費率依儲存類別而異。如需詳細資訊，請參閱 [Amazon EFS 定價](https://aws.amazon.com/efs/pricing)。  
Lambda 會針對 VPC 之間的資料傳輸收取費用。這僅適用於您的函數的 VPC 對等連線到帶有檔案系統的另一個 VPC 的情況。費率與相同區域內 VPC 之間的 Amazon EC2 資料傳輸費用相同。如需詳細資訊，請參閱 [Lambda 定價](https://aws.amazon.com/lambda/pricing)。

# 建立 Lambda 函數的別名
<a name="configuration-aliases"></a>

您可以為您的 Lambda 函數建立別名。Lambda 別名是您可以更新的函數版本的指標。函數的使用者可以使用別名 Amazon Resource Name (ARN) 來存取函數版本。部署新版本時，您可以更新別名以使用新版本，或分割兩個版本之間的流量。

------
#### [ Console ]

**若要使用主控台建立別名**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇一個函數。

1. 選擇 **Aliases (別名)**，然後選擇 **Create alias (建立別名)**。

1. 在 **Create alias (建立別名)** 頁面，執行下列動作：

   1. 輸入別名的 **Name (名稱)**。

   1. (選用) 輸入別名的 **Description (描述)**。

   1. 在 **Version (版本)**中，選擇要別名指向的函數版本。

   1. (選用) 若要在別名上設定路由，請展開 **Weighted alias (加權別名)**。如需更多詳細資訊，請參閱 [使用加權別名實作 Lambda Canary 部署](configuring-alias-routing.md)。

   1. 選擇 **Save** (儲存)。

------
#### [ AWS CLI ]

若要使用 AWS Command Line Interface (AWS CLI) 建立別名，請使用 [create-alias](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-alias.html) 命令。

```
aws lambda create-alias \
  --function-name my-function \
  --name alias-name \
  --function-version version-number \
  --description " "
```

若要變更別名以指向新版本的函數，請使用 [update-alias](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-alias.html) 命令。

```
aws lambda update-alias \
  --function-name my-function \
  --name alias-name \
  --function-version version-number
```

若要刪除別名，請使用 [delete-alias](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/delete-alias.html) 命令。

```
aws lambda delete-alias \
  --function-name my-function \
  --name alias-name
```

 上述步驟中的 AWS CLI 命令會對應到下列 Lambda API 操作：
+ [CreateAlias](https://docs.aws.amazon.com/lambda/latest/api/API_CreateAlias.html)
+ [UpdateAlias](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateAlias.html)
+ [DeleteAlias](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteAlias.html)

------

# 在事件來源和許可政策中使用 Lambda 別名
<a name="using-aliases"></a>

每個別名都有唯一的 ARN。別名只能指向函數版本，而非另一個別名。您可以更新別名以指向新版本的函數。

諸如 Amazon Simple Storage Service (Amazon S3) 等事件來源會叫用您的 Lambda 函數。當事件發生時，這些事件來源會維護一個映射，以識別發生事件時要叫用的函數。如果您在映射組態中指定了 Lambda 函數別名，則不需要在函數版本變更時更新映射。如需更多詳細資訊，請參閱 [Lambda 如何處理來自串流和佇列式事件來源的記錄](invocation-eventsourcemapping.md)。

在資源政策中，您可以授予事件來源使用 Lambda 函數的許可。如果您在政策中指定了別名 ARN，則不需要在函數版本變更時更新政策。

## 資源政策
<a name="versioning-permissions-alias"></a>

您可以使用[以資源為基礎的政策](access-control-resource-based.md)，將服務、資源或帳號存取權授予您的函數。該許可的範圍取決於您是將其套用至別名、版本或整個函數。例如，如果您使用別名名稱 (例如 `helloworld:PROD`)，許可可讓您使用別名 ARN (`helloworld`) 來叫用 `helloworld:PROD` 函數。

如果您嘗試在沒有別名或特定版本的情況下叫用該函數，則會出現許可錯誤。即使您嘗試直接叫用與別名相關聯的函數版本，仍會發生此許可錯誤。

例如，當 Amazon S3 代表 `amzn-s3-demo-bucket` 時，下列 AWS CLI 命令會授予 Amazon S3 叫用 `helloworld` 函數之 PROD 別名的許可。

```
aws lambda add-permission \
  --function-name helloworld \
  --qualifier PROD \
  --statement-id 1 \
  --principal s3.amazonaws.com \
  --action lambda:InvokeFunction \
  --source-arn arn:aws:s3:::amzn-s3-demo-bucket \
  --source-account 123456789012
```

如需在政策中使用資源名稱的詳細資訊，請參閱[微調政策的資源和條件區段](lambda-api-permissions-ref.md)。

# 使用加權別名實作 Lambda Canary 部署
<a name="configuring-alias-routing"></a>

可以使用加權別名來分割相同函數的兩個不同[版本](configuration-versions.md)之間的流量。透過此方法，可以用少量流量測試新版本的函數，並視需要快速復原。這稱為 [Canary 部署](https://docs.aws.amazon.com/whitepapers/latest/overview-deployment-options/canary-deployments.html)。Canary 部署與藍/綠部署的不同之處在於只將新版本暴露於一部分請求，而不是一次切換所有流量。

一個別名可以指向最多兩個 Lambda 函數版本。版本必須符合下列條件：
+ 兩個版本必須擁有相同的[執行角色](lambda-intro-execution-role.md)。
+ 這兩個版本都必須具有相同[無效字元佇列](invocation-async-retain-records.md#invocation-dlq)組態，或是沒有無效字元佇列組態。
+ 兩個版本都必須發佈。別名不能指向 `$LATEST`。

**注意**  
Lambda 使用簡單的概率模型來在兩個函數版本之間分配流量。在流量較低時，您可能會看到每個版本已設定流量百分比與實際流量百分比之間，存在很大差異。如果您的函數使用佈建並行，透過在別名路由作用期間設定較高數目的已佈建並行執行個體，則可以避免[溢出調用](monitoring-metrics-types.md#invocation-metrics)。

## 建立加權別名
<a name="create-weighted-alias"></a>

------
#### [ Console ]

**若要使用主控台在別名上設定路由**
**注意**  
確認函數至少有兩個已發佈的版本。若要建立其他版本，請遵循[建立函數版本](configuration-versions.md#configuration-versions-config)中的指示。

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇一個函數。

1. 選擇 **Aliases (別名)**，然後選擇 **Create alias (建立別名)**。

1. 在 **Create alias (建立別名)** 頁面，執行下列動作：

   1. 輸入別名的 **Name (名稱)**。

   1. (選用) 輸入別名的 **Description (描述)**。

   1. 在 **Version (版本)**中，選擇要別名指向的第一個函數版本。

   1. 展開 **Weighted alias (加權別名)**。

   1. 在 **Additional version (其他版本)**中，選擇要別名指向的第二個函數版本。

   1. 為 **Weight (%) (權重 (%))**函數輸入一個權重值。*權數*是當別名被叫用時，指派至該版本的流量百分比。第一版收到剩餘權數。例如，若指定 10% 至 **Additional version (其他版本)**，第一版會自動指派 90%。

   1. 選擇**儲存**。

------
#### [ AWS CLI ]

使用 [create-alias](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-alias.html) 和 [update-alias](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-alias.html) AWS CLI 命令來設定兩個函數版本之間的流量權重。當您建立或更新別名時，請在 `routing-config` 參數中指定流量權重。

以下範例會建立一個名為 **routing-alias** 的 Lambda 函數別名，此別名指向函數的版本 1。函數的版本 2 會接收 3% 的流量。剩餘 97% 的流量會路由至版本 1。

```
aws lambda create-alias \
  --name routing-alias \
  --function-name my-function \
  --function-version 1  \
  --routing-config AdditionalVersionWeights={"2"=0.03}
```

使用 `update-alias` 命令可增加連入流量至版本 2 的百分比。在下列範例中，您會將流量增加到 5%。

```
aws lambda update-alias \
  --name routing-alias \
  --function-name my-function \
  --routing-config AdditionalVersionWeights={"2"=0.05}
```

若要將所有流量路由傳送至版本 2，請使用 `update-alias` 命令，將 `function-version` 屬性變更為將別名指向版本 2。此命令也會重設路由組態。

```
aws lambda update-alias \
  --name routing-alias \
  --function-name my-function  \
  --function-version 2 \
  --routing-config AdditionalVersionWeights={}
```

 上述步驟中的 AWS CLI 命令對應至下列 Lambda API 操作：
+ [CreateAlias](https://docs.aws.amazon.com/lambda/latest/api/API_CreateAlias.html)
+ [UpdateAlias](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateAlias.html)

------

## 判斷調用哪個版本
<a name="determining-routing-version"></a>

當您設定兩個函數版本之間的流量權重時，有兩種方法可判斷已叫用的 Lambda 函數版本：
+ **CloudWatch Logs** - 對於每個函數調用，Lambda 會自動發出含有已調用版本 ID 的 `START` 記錄。範例：

  `START RequestId: 1dh194d3759ed-4v8b-a7b4-1e541f60235f Version: 2` 

  對於別名叫用，Lambda 使用 `ExecutedVersion` 維度，依照已叫用的版本來篩選指標資料。如需詳細資訊，請參閱[檢視 Lambda 函數的指標](monitoring-metrics-view.md)。
+ **回應承載 (同步呼叫)** – 回應至同步函式呼叫包含 `x-amz-executed-version` 標題，以顯示已呼叫哪個函式版本。

## 使用加權別名建立滾動部署
<a name="lambda-rolling-deployments"></a>

使用 AWS CodeDeploy 和 AWS Serverless Application Model (AWS SAM) 建立滾動部署，自動偵測函數程式碼的變更、部署新版本的函數，並逐漸增加流向新版本的流量。流量和增加速率是您可以設定的參數。

在滾動部署中， 會 AWS SAM 執行下列任務：
+ 配置您的 Lambda 函數並建立別名。加權別名路由組態是實作滾動部署的基本功能。
+ 建立 CodeDeploy 應用程式和部署群組。部署群組會管理滾動部署和轉返 (如有需要)。
+ 在您建立 Lambda 函數的新版本時進行偵測。
+ 觸發 CodeDeploy 開始新版本的部署。

### 範本範例 AWS SAM
<a name="sam-template"></a>

下列範例顯示 [AWS SAM 範本](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-basics.html)，以進行簡單的滾動部署。

```
AWSTemplateFormatVersion : '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: A sample SAM template for deploying Lambda functions

Resources:
# Details about the myDateTimeFunction Lambda function
  myDateTimeFunction:
    Type: [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)
    Properties:
      Handler: myDateTimeFunction.handler
      Runtime: nodejs24.x
# Creates an alias named "live" for the function, and automatically publishes when you update the function.
      AutoPublishAlias: live
      DeploymentPreference:
# Specifies the deployment configuration
          Type: Linear10PercentEvery2Minutes
```

此範本會定義名為 `myDateTimeFunction` 的 Lambda 函數，且具備下列屬性。

**AutoPublishAlias **  
`AutoPublishAlias` 屬性會建立名為 `live` 的別名。此外，當您為該函數儲存新代碼時， AWS SAM 架構會自動偵測。之後，架構會發佈一個新的函數版本並更新 `live` 別名以指向新版本。

**DeploymentPreference**  
`DeploymentPreference` 屬性會決定 CodeDeploy 應用程式將流量從 Lambda 函數的原始版本轉移到新版本的速率。值 `Linear10PercentEvery2Minutes` 每隔兩分鐘會將額外 10% 的流量轉移到新版本。  
如需預先定義的部署組態清單，請參閱[部署組態](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-configurations.html)。

如需如何使用 CodeDeploy 建立滾動部署的詳細資訊 AWS SAM，請參閱以下內容：
+ [教學課程：使用 CodeDeploy 和 部署更新的 Lambda 函數 AWS Serverless Application Model](https://docs.aws.amazon.com/codedeploy/latest/userguide/tutorial-lambda-sam.html)
+ [使用 逐步部署無伺服器應用程式 AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/automating-updates-to-serverless-apps.html)

# 管理 Lambda 函數版本
<a name="configuration-versions"></a>

您可以使用版本來管理 函數的部署。例如，您可以發佈新版本的函式來測試 Beta 版，而不會影響穩定生產版本的使用者。每次發佈函數時，Lambda 都會建立新版本的函數。新版本是此函數未發佈版本的副本。未發布的版本名稱為 `$LATEST`。

重要的是，每當您部署函式程式碼時，都會覆寫 `$LATEST` 中的目前程式碼。若要儲存 `$LATEST` 的目前迭代，需建立新的函式版本。如果 `$LATEST` 與先前發布的版本相同，則必須先將變更部署到 `$LATEST`，才能建立新版本。這些變更可能包括更新程式碼或修改函式組態設定。

發布函數版本後，其程式碼、執行時期、架構、記憶體、層以及大多數其他組態設定都是不可變的。這意味著如果未從 `$LATEST` 發布新版本，就無法變更這些設定。您可以為已發佈的函數版本設定下列項目：
+ [觸發](lambda-services.md#lambda-invocation-trigger)
+ [目的地](invocation-async-retain-records.md#create-destination)
+ [佈建並行](provisioned-concurrency.md)
+ [非同步叫用](invocation-async.md)
+ [資料庫連線和代理](services-rds.md#rds-configuration)

**注意**  
搭配使用[執行時期管理控制項](runtimes-update.md#runtime-management-controls)與**自動**模式時，函數版本所使用的執行時期版本會自動更新。使用 **Function update** (函數更新) 或 **Manual** (手動) 模式時，不會更新執行階段版本。如需詳細資訊，請參閱[了解 Lambda 如何管理執行時期版本更新](runtimes-update.md)。

**Topics**
+ [

## 建立函數版本
](#configuration-versions-config)
+ [

## 使用版本
](#versioning-versions-using)
+ [

## 授予許可
](#versioning-permissions)

## 建立函數版本
<a name="configuration-versions-config"></a>

您只能在未發佈的函數版本上變更函數代碼和設定。當您發佈版本時，Lambda 會鎖定程式碼和大多數設定以為該版本的使用者保持一致的使用體驗。

您可以使用 Lambda 主控台建立函數版本。

**新建函數版本**

1. 開啟 Lambda 主控台中的[函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇一個函數，然後選擇 **Versions** 索引標簽。

1. 在版本組態頁面上，選擇 **Publish new version (發佈新版本)**。

1. (選用) 輸入版本描述。

1. 選擇**發布**。

或者，您可以使用 [PublishVersion](https://docs.aws.amazon.com/lambda/latest/api/API_PublishVersion.html) API 操作發佈函數的版本。

下列 AWS CLI 命令會發佈新版本的 函數。回應會傳回關於新版本的組態資訊，包含版本號碼，以及含有版本尾碼的函式 ARN。

```
aws lambda publish-version --function-name my-function
```

您應該會看到下列輸出：

```
{
  "FunctionName": "my-function",
  "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function:1",
  "Version": "1",
  "Role": "arn:aws:iam::123456789012:role/lambda-role",
  "Handler": "function.handler",
  "Runtime": "nodejs24.x",
  ...
}
```

**注意**  
Lambda 會為版本控制指派依序遞增的序號。即使刪除並重新建立函數，Lambda 也不會重複使用版本號碼。

## 使用版本
<a name="versioning-versions-using"></a>

您可以使用合格的 ARN 或不合格的 ARN 來參考您的 Lambda 函數。
+ **合格的 ARN** - 帶有版本尾碼的函數 ARN。下列範例指的是 `helloworld` 函數的版本 42。

  ```
  arn:aws:lambda:aws-region:acct-id:function:helloworld:42
  ```
+ **不合格的 ARN** - 沒有版本尾碼的函數 ARN。

  ```
  arn:aws:lambda:aws-region:acct-id:function:helloworld
  ```

您可以在所有相關 API 操作中使用合格或不合格的 ARN。但是，您無法使用不合格的 ARN 來建立別名。

如果您決定不發佈函數版本，則可以在[事件來源映射](invocation-eventsourcemapping.md)中使用合格或不合格的 ARN 來調用函數。當您使用不合格的 ARN 調用函數時，Lambda 會隱含調用 `$LATEST`。

每個 Lambda 函數版本的合格 ARN 是唯一的。發佈版本之後，您就無法變更 ARN 或函數程式碼。

只有當從未發布過程式碼或從上次發布版本後程式碼已變更，Lambda 才會發布新的函數版本。如果沒有變更，函數版本會保持在最新發佈的版本。

當您發布一個版本時，Lambda 會建立函式程式碼與組態的不可變快照。並非所有組態變更都會觸發新版本的發布。下列組態變更符合函式發布版本的條件：
+ 函數程式碼
+ 環境變數
+ 執行時期
+ 處理常式
+ 層
+ 記憶體大小
+ Timeout (逾時)
+ VPC 組態
+ 無效字母佇列 (DLQ) 組態
+ IAM 角色
+ Description
+ 架構 (x86\$164 或 arm64)
+ 暫時性儲存大小
+ 套件類型
+ 記錄組態
+ 檔案系統組態
+ SnapStart
+ 追蹤組態

[預留並行](configuration-concurrency.md)等操作設定的變更不會觸發新版本的發布。

## 授予許可
<a name="versioning-permissions"></a>

您可以使用[以資源為基礎的政策](access-control-resource-based.md)或[以身分為基礎的政策](access-control-identity-based.md)來授予您函數的存取權。許可的範圍取決於您是將政策套用至函數或函數的一個版本。如需政策中函數資源名稱的詳細資訊，請參閱[微調政策的資源和條件區段](lambda-api-permissions-ref.md)。

您可以使用 函數別名，簡化事件來源和 AWS Identity and Access Management (IAM) 政策的管理。如需詳細資訊，請參閱[建立 Lambda 函數的別名](configuration-aliases.md)。

# 在 Lambda 函數上使用標籤
<a name="configuration-tags"></a>

可以標記函數來組織和管理資源。標籤是與跨 AWS 服務支援的資源相關聯的自由格式索引鍵值對。如需標籤使用案例的詳細資訊，請參閱*《標記 AWS 資源和標籤編輯器指南*》中的[常見標記策略](https://docs.aws.amazon.com//tag-editor/latest/userguide/best-practices-and-strats.html#tag-strategies)。

標籤適用於函數層級，而不適用於版本或別名。標籤不是在您發佈版本時 AWS Lambda 建立 快照的版本特定組態的一部分。可以使用 Lambda API 來檢視和更新標籤。也可以在 Lambda 主控台中管理特定函數時檢視和更新標籤。

**Topics**
+ [

## 使用標籤所需的許可
](#fxn-tags-required-permissions)
+ [

## 搭配使用標籤與 Lambda 主控台
](#using-tags-with-the-console)
+ [

## 搭配 使用標籤 AWS CLI
](#configuration-tags-cli)

## 使用標籤所需的許可
<a name="fxn-tags-required-permissions"></a>

若要允許 AWS Identity and Access Management (IAM) 身分 (使用者、群組或角色) 讀取或設定資源上的標籤，請為其授予相應許可：
+ **lambda:ListTags**：當資源具有標籤時，將此許可授予給需要對其呼叫 `ListTags` 的任何人員。對於已標記函數，`GetFunction` 也需要此許可。
+ **lambda:TagResource**：將此許可授予給需要呼叫 `TagResource` 或在建立時執行標記的任何人員。

或者，也可以考慮授予 **lambda：UntagResource** 許可，以允許對資源進行 `UntagResource` 呼叫。

如需詳細資訊，請參閱[Lambda 適用的身分型 IAM 政策](access-control-identity-based.md)。

## 搭配使用標籤與 Lambda 主控台
<a name="using-tags-with-the-console"></a>

您可以使用 Lambda 主控台建立具有標籤的函數、將標籤新增至現有函數，以及依您新增的標籤篩選函數。

**在建立函數時新增標籤**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇**建立函數**。

1. 選擇 **Author from scratch** (從頭開始撰寫) 或 **Container image** (容器映像)。

1. 在**基本資訊**中，設定您的函數。如需有關設定函數的詳細資訊，請參閱 [設定 AWS Lambda 函數](lambda-functions.md)。

1. 展開 **Advanced settings** (進階設定)，然後選取 **Enable tags** (啟用標籤)。

1. 選擇 **Add new tag** (新增標籤)，然後輸入 **Key** (索引鍵) 和選用的 **Value** (值)。若要新增更多標籤，請重複此步驟。

1. 選擇 **Create function (建立函數)**。

**為現有函數新增標籤**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇函數的名稱。

1. 選擇 **Configuration** (組態)，然後選擇 **Tags** (標籤)。

1. 在 **Tags (標籤)** 下，選擇 **Manage tags (管理標籤)**。

1. 選擇 **Add new tag** (新增標籤)，然後輸入 **Key** (索引鍵) 和選用的 **Value** (值)。若要新增更多標籤，請重複此步驟。

1. 選擇**儲存**。

**使用標籤篩選函數**

1. 開啟 Lambda 主控台中的[函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇搜尋方塊以查看函數屬性和標籤索引鍵的清單。

1. 選擇標籤索引鍵以查看目前 AWS 區域中正在使用的值清單。

1. 選取**使用：「tag-name」**以查看所有標記有此索引鍵的函數，或選擇**運算子**以進一步依值篩選。

1. 選取標籤值，依標籤索引鍵和值的組合進行篩選。

搜尋列也支援搜尋標籤鍵。輸入 `tag` 以僅查看標籤索引鍵清單，或輸入索引鍵名稱以在清單中尋找。

## 搭配 使用標籤 AWS CLI
<a name="configuration-tags-cli"></a>

可以使用 Lambda API 在現有的 Lambda 資源 (包括函數) 上新增和移除標籤。也可以在建立函數時新增標籤，這可讓您在整個生命週期中標記資源。

### 使用 Lambda 標籤 API 來更新標籤
<a name="tags-fxn-api-config"></a>

可以透過 [TagResource](https://docs.aws.amazon.com/lambda/latest/api/API_TagResource.html) 和 [UntagResource](https://docs.aws.amazon.com/lambda/latest/api/API_UntagResource.html) API 操作來新增和移除受支援 Lambda 資源的標籤。

可使用 AWS CLI來呼叫這些操作。若要將標籤新增至現有資源，請使用 `tag-resource` 命令。此範例會新增兩個標籤，一個包含索引鍵 *Department*，另一個包含索引鍵 *CostCenter*。

```
aws lambda tag-resource \
--resource arn:aws:lambda:us-east-2:123456789012:resource-type:my-resource \
--tags Department=Marketing,CostCenter=1234ABCD
```

若要移除標籤，請使用 `untag-resource` 命令。此範例會移除具有索引鍵 *Department* 的標籤。

```
aws lambda untag-resource --resource arn:aws:lambda:us-east-1:123456789012:resource-type:resource-identifier \
--tag-keys Department
```

### 在建立函數時新增標籤
<a name="creating-tags-when-you-create-a-function-cli"></a>

若要建立帶有標籤的新 Lambda 函數，請使用 [CreateFunction](https://docs.aws.amazon.com//lambda/latest/api/API_CreateFunction.html) API 操作。指定 `Tags` 參數。可以使用 `create-function` CLI 命令和 --tags 選項來呼叫此操作。將標籤參數與 `CreateFunction` 搭配使用之前，請確保您的角色除了此操作所需的一般許可外，還擁有標記資源的許可。如需有關標記許可的詳細資訊，請參閱[使用標籤所需的許可](#fxn-tags-required-permissions)。此範例會新增兩個標籤，一個包含索引鍵 *Department*，另一個包含索引鍵 *CostCenter*。

```
aws lambda create-function --function-name my-function
--handler index.js --runtime nodejs24.x \
--role arn:aws:iam::123456789012:role/lambda-role \
--tags Department=Marketing,CostCenter=1234ABCD
```

### 檢視函數上的標籤
<a name="viewing-tags-on-a-function-cli"></a>

若要檢視套用至特定 Lambda 資源的標籤，請使用 `ListTags` API 操作。如需詳細資訊，請參閱 [ListTags](https://docs.aws.amazon.com/lambda/latest/api/API_ListTags.html)。

您可以使用 `list-tags` AWS CLI 命令呼叫此操作，方法是提供 ARN (Amazon Resource Name)。

```
aws lambda list-tags --resource arn:aws:lambda:us-east-1:123456789012:resource-type:resource-identifier
```

可以使用 [GetFunction](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html) API 操作檢視套用至特定資源的標籤。可比較的功能不可用於其他資源類型。

可以使用 `get-function` CLI 命令呼叫此操作：

```
aws lambda get-function --function-name my-function
```

### 依標籤篩選資源
<a name="tags-fxn-filtering"></a>

您可以使用 AWS Resource Groups Tagging API [GetResources](https://docs.aws.amazon.com/resourcegroupstagging/latest/APIReference/API_GetResources.html) API 操作，依標籤篩選資源。`GetResources` 操作可接收最多 10 個篩選條件，每個篩選條件皆包含標籤索引鍵與最多 10 個標籤值。為 `GetResources` 提供一個 `ResourceType`，即可依特定資源類型進行篩選。

您可以使用 `get-resources` AWS CLI 命令呼叫此操作。如需使用 `get-resources` 的範例，請參閱《AWS CLI 命令參考》中的 [get-resources](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/resourcegroupstaggingapi/get-resources.html#examples)。**

# Lambda 函數的回應串流
<a name="configuration-response-streaming"></a>

Lambda 函數可以透過 [Lambda 函數 URLs](urls-configuration.md) 或使用 [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html) API （透過 AWS SDK 或直接 API 呼叫），將回應承載原生串流回用戶端。您的 Lambda 函數也可以透過 [Amazon API Gateway 代理整合](https://docs.aws.amazon.com/apigateway/latest/developerguide/response-transfer-mode-lambda.html)串流回應承載，該整合使用 [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html) API 來叫用您的函數。透過提高第一個位元組時間 (TTFB) 效能，回應串流有益於延遲敏感應用程式。這是因為您可以在部分回應可用時將其傳回給用戶端。此外，相較於緩衝回應的 6 MB 上限，回應串流函式最多可傳回 200 MB 的承載。串流回應也意味著您的函數不需要將整個回應放在記憶體裡。若是非常大的回應，這有助於減少您需要為函數設定的記憶體容量。

**注意**  
Lambda 回應串流尚未全面提供 AWS 區域。請參閱依[AWS 區域劃分的 Builder Center 功能](https://builder.aws.com/build/capabilities)，以取得依區域劃分的功能可用性。

Lambda 串流回應的速度取決於回應的大小。函式回應的串流速度在前 6 MB 不受限制。若回應大於 6 MB，則其餘的回應會受到頻寬上限的限制。如需串流頻寬的詳細資訊，請參閱[回應串流的頻寬限制](#config-rs-bandwidth-cap)。

串流回應會產生成本，而且當叫用用戶端連線中斷時，不會中斷或停止串流回應。客戶需支付完整函數持續時間的費用，因此客戶在設定長函數逾時時應小心。

Lambda 支援 Node.js 受管執行期的回應串流。對於其他語言，包括 Python，您可以使用[自訂執行期搭配自訂執行期 API 整合](runtimes-custom.md#runtimes-custom-response-streaming)來串流回應或使用 [Lambda Web Adapter](https://github.com/awslabs/aws-lambda-web-adapter)。

**注意**  
透過 Lambda 主控台測試函數時，您一律會看到緩衝的回應。

**Topics**
+ [

## 回應串流的頻寬限制
](#config-rs-bandwidth-cap)
+ [

## VPC 與回應串流的相容性
](#config-rs-vpc-compatibility)
+ [

# 撰寫啟用回應串流的 Lambda 函數
](config-rs-write-functions.md)
+ [

# 使用 Lambda 函數 URL 調用啟用回應串流的函數
](config-rs-invoke-furls.md)
+ [

# 教學課程：建立具有函數 URL 的回應串流 Lambda 函數
](response-streaming-tutorial.md)

## 回應串流的頻寬限制
<a name="config-rs-bandwidth-cap"></a>

函式回應承載的前 6 MB 不受頻寬限制。在最初的高頻寬流量後，Lambda 會以最高 2 MBps 的速率串流您的回應。如果函式回應一直都沒超過 6 MB，則永遠不會適用此頻寬限制。

**注意**  
頻寬限制僅適用於函數的回應有效負載，不適用於函數的網路存取。

無頻寬上限的速率取決於諸多因素 (包括函數的處理速度)。一般來說，您可以預期函式回應前 6 MB 的速率會高於 2 Mbps。如果您的函數正在將回應串流到 以外的目的地 AWS，則串流速率也取決於外部網際網路連線的速度。

## VPC 與回應串流的相容性
<a name="config-rs-vpc-compatibility"></a>

在 VPC 環境中使用 Lambda 函式時，回應串流需注意下列重要考量事項：
+ Lambda 函式 URL 不支援 VPC 環境中的回應串流。
+ 您可以使用 `InvokeWithResponseStream` API 透過 AWS SDK 叫用 Lambda 函數，在 VPC 內使用回應串流。這需要為 Lambda 設定適當的 VPC 端點。
+ 對於 VPC 環境，您需要為 Lambda 建立介面 VPC 端點，用以啟用 VPC 環境中資源與 Lambda 服務之間的通訊。

VPC 環境中回應串流的典型架構可能包括：

```
Client in VPC -> Interface VPC endpoint for Lambda -> Lambda function -> Response streaming back through the same path
```

# 撰寫啟用回應串流的 Lambda 函數
<a name="config-rs-write-functions"></a>

撰寫回應串流函數的處理常式不同於典型的處理常式模式。撰寫串流函數時，請務必執行下列動作：
+ 使用 `awslambda.streamifyResponse()` 裝飾項目包裝函式。`awslambda` 全域物件由 Lambda 的 Node.js 執行時期環境提供。
+ 從容地結束串流，以確保所有資料處理都完成。

## 設定處理常式函數以串流回應
<a name="config-rs-write-functions-handler"></a>

為了向執行期指示 Lambda 應該串流函數的回應，您必須使用 `streamifyResponse()` 裝飾項目包裝函數。這會通知執行期使用適當的邏輯路徑來串流回應，並讓函數串流回應。

`streamifyResponse()` 裝飾項目接受的函數可接受以下參數：
+ `event` – 提供函數 URL 調用事件的相關資訊，例如 HTTP 方法、查詢參數和請求內文。
+ `responseStream` – 提供可寫入的串流。
+ `context` – 提供方法和屬性，以及有關調用、函數以及執行環境的資訊。

`responseStream` 物件是 [Node.js `writableStream`](https://nodesource.com/blog/understanding-streams-in-nodejs/)。與任何此類串流一樣，您應該使用 `pipeline()` 方法。

**注意**  
`awslambda` 全域物件由 Lambda 的 Node.js 執行時期自動提供，不需要匯入。

**Example 啟用回應串流的處理常式**  

```
import { pipeline } from 'node:stream/promises';
import { Readable } from 'node:stream';

export const echo = awslambda.streamifyResponse(async (event, responseStream, _context) => {
  // As an example, convert event to a readable stream.
  const requestStream = Readable.from(Buffer.from(JSON.stringify(event)));

  await pipeline(requestStream, responseStream);
});
```

雖然 `responseStream` 提供寫入串流的 `write()` 方法，但仍建議您盡可能使用 [https://nodejs.org/api/stream.html#streampipelinesource-transforms-destination-callback](https://nodejs.org/api/stream.html#streampipelinesource-transforms-destination-callback)。使用 `pipeline()` 可確保可寫入的串流不會被更快的可讀串流所淹沒。

## 結束串流
<a name="config-rs-write-functions-end"></a>

請確保在處理常式傳回之前正確結束串流。`pipeline()` 方法會自動處理這種情形。

對於其他使用案例，請呼叫 `responseStream.end()` 方法以正確結束串流。此方法發出訊號，表示不應向串流寫入更多資料。如果您使用 `pipeline()` 或 `pipe()` 寫入串流，則不需要此方法。

從 Node.js 24 開始，Lambda 不會在處理常式傳回或回應串流結束之後，再等待未解決的承諾完成。如果您的函數依賴其他非同步操作，例如計時器或擷取，您應該在處理常式中`await`執行這些操作。

**Example 使用 pipeline() 結束串流的範例**  

```
import { pipeline } from 'node:stream/promises';

export const handler = awslambda.streamifyResponse(async (event, responseStream, _context) => {
  await pipeline(requestStream, responseStream);
});
```

**Example 未使用 pipeline() 結束串流的範例**  

```
export const handler = awslambda.streamifyResponse(async (event, responseStream, _context) => {
  responseStream.write("Hello ");
  responseStream.write("world ");
  responseStream.write("from ");
  responseStream.write("Lambda!");
  responseStream.end();
});
```

# 使用 Lambda 函數 URL 調用啟用回應串流的函數
<a name="config-rs-invoke-furls"></a>

**注意**  
您的 Lambda 函數現在可以透過 [Amazon API Gateway 代理整合](https://docs.aws.amazon.com/apigateway/latest/developerguide/response-transfer-mode-lambda.html)串流回應承載。

可以透過變更函數 URL 的調用模式來調用已啟用回應串流的函數。調用模式決定了 Lambda 用來調用函數的 API 操作。可用的調用模式如下：
+ `BUFFERED` – 此為預設選項。Lambda 會使用 `Invoke` API 操作調用您的函數。承載完成時，即可使用調用結果。承載大小上限為 6 MB。
+ `RESPONSE_STREAM` – 啟用您的函數，當承載結果變得可用時串流它們。Lambda 會使用 `InvokeWithResponseStream` API 操作調用您的函數。回應承載大小上限為 200 MB。

您仍然可以透過直接呼叫 `Invoke` API 操作來調用函數而無需回應串流。不過，Lambda 會串流透過函數 URL 調用的所有回應承載，直到您將調用模式變更為 `BUFFERED`。

------
#### [ Console ]

**設定函數 URL 的調用模式 (主控台)**

1. 開啟 Lambda 主控台中的[函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇您要為其設定調用模式的函數名稱。

1. 選擇 **Configuration** (組態) 標籤，然後選擇 **Function URL** (函數 URL)。

1. 選擇**編輯**，然後選擇**其他設定**。

1. 在**調用模式**下，選擇所需的調用模式。

1. 選擇**儲存**。

------
#### [ AWS CLI ]

**若要設定函數 URL 的調用模式 (AWS CLI)**

```
aws lambda update-function-url-config \
  --function-name my-function \
  --invoke-mode RESPONSE_STREAM
```

------
#### [ CloudFormation ]

**若要設定函數 URL 的調用模式 (CloudFormation)**

```
MyFunctionUrl:
  Type: AWS::Lambda::Url
  Properties:
    AuthType: AWS_IAM
    InvokeMode: RESPONSE_STREAM
```

------

如需設定函數 URL 的詳細資訊，請參閱 [Lambda 函數 URL](urls-configuration.md)。

# 教學課程：建立具有函數 URL 的回應串流 Lambda 函數
<a name="response-streaming-tutorial"></a>

在本教學課程中，您會建立格式為 .zip 封存檔的 Lambda 函數，其包含的函數 URL 端點會傳回回應串流。如需設定函數 URL 的詳細資訊，請參閱 [函數 URL](urls-configuration.md)。

## 先決條件
<a name="response-streaming-prepare"></a>

此教學課程假設您具備基本的 Lambda 操作知識並了解 Lambda 主控台。若您尚未了解，請遵循 [使用主控台建立一個 Lambda 函數](getting-started.md#getting-started-create-function) 中的指示，建立您的第一個 Lambda 函數。

若要完成下列步驟，您需要 [AWS CLI 版本 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。命令和預期的輸出會列在不同的區塊中：

```
aws --version
```

您應該會看到下列輸出：

```
aws-cli/2.13.27 Python/3.11.6 Linux/4.14.328-248.540.amzn2.x86_64 exe/x86_64.amzn.2
```

對於長命令，逸出字元 (`\`) 用於將命令分割為多行。

在 Linux 和 macOS 上，使用您偏好的 shell 和套件軟體管理工具。

**注意**  
在 Windows 中，作業系統的內建終端不支援您常與 Lambda 搭配使用的某些 Bash CLI 命令 (例如 `zip`)。若要取得 Ubuntu 和 Bash 的 Windows 整合版本，請[安裝適用於 Linux 的 Windows 子系統](https://docs.microsoft.com/en-us/windows/wsl/install-win10)。本指南中的 CLI 命令範例使用 Linux 格式。如果您使用的是 Windows CLI，必須重新格式化包含內嵌 JSON 文件的命令。

## 建立執行角色
<a name="response-streaming-create-iam-role"></a>

建立[執行角色](lambda-intro-execution-role.md)，授予您的 Lambda 函數存取 AWS 資源的許可。

**若要建立執行角色**

1. 開啟 AWS Identity and Access Management (IAM) 主控台的 [角色](https://console.aws.amazon.com/iam/home#/roles) 頁面。

1. 選擇建**立角色**。

1. 建立具備下列屬性的角色：
   + **信任的實體類型**：**AWS 服務**
   + **使用案例**：**Lambda**
   + **許可** – **AWSLambdaBasicExecutionRole**
   + **角色名稱** - **response-streaming-role**。

**AWSLambdaBasicExecutionRole** 政策具有函數將日誌寫入 Amazon CloudWatch Logs 所需的許可。建立角色後，請記下其 Amazon Resource Name (ARN)。下一個步驟將需要此值。

## 建立回應串流函數 (AWS CLI)
<a name="response-streaming-tutorial-create-function-cli"></a>

使用 AWS Command Line Interface (AWS CLI) 建立具有函數 URL 端點的回應串流 Lambda 函數。

**建立可串流回應的函數**

1. 將下列程式碼範例複製至名為 `index.js` 的檔案中。此函式會以 1 秒的間隔串流三個回應。

   ```
   exports.handler = awslambda.streamifyResponse(
   	async (event, responseStream, _context) => {
   		// Metadata is a JSON serializable JS object. Its shape is not defined here.
   		const metadata = {
   		statusCode: 200,
   		headers: {
   			"Content-Type": "application/json",
   			"CustomHeader": "outerspace"
   		}
   		};
   	
   		// Assign to the responseStream parameter to prevent accidental reuse of the non-wrapped stream.
   		responseStream = awslambda.HttpResponseStream.from(responseStream, metadata);
   	
   		responseStream.write("Streaming with Helper \n");
   		await new Promise(r => setTimeout(r, 1000));
   		responseStream.write("Hello 0 \n");
   		await new Promise(r => setTimeout(r, 1000));
   		responseStream.write("Hello 1 \n");
   		await new Promise(r => setTimeout(r, 1000));
   		responseStream.write("Hello 2 \n");
   		await new Promise(r => setTimeout(r, 1000));
   		responseStream.end();
   		await responseStream.finished();
   	}
     );
   ```

1. 建立部署套件。

   ```
   zip function.zip index.js
   ```

1. 使用 `create-function` 命令建立一個 Lambda 函數。使用上一個步驟的角色 ARN 取代 `--role` 的值。此命令會將函式逾時設定為 10 秒，允許函式串流三個回應。

   ```
   aws lambda create-function \
     --function-name my-streaming-function \
     --runtime nodejs24.x \
     --zip-file fileb://function.zip \
     --handler index.handler \
     --timeout 10 \
     --role arn:aws:iam::123456789012:role/response-streaming-role
   ```

**建立函數 URL**

1. 為函式新增可授予 `lambda:InvokeFunctionUrl` 及 `lambda:InvokeFunction` 許可的資源型政策。每個陳述式都必須在個別命令中進行新增。將 的值取代`--principal`為您的 AWS 帳戶 ID。

   ```
   aws lambda add-permission \
     --function-name my-streaming-function \
     --action lambda:InvokeFunctionUrl \
     --statement-id UrlPolicyInvokeURL \
     --principal 123456789012 \
     --function-url-auth-type AWS_IAM
   ```

   ```
   aws lambda add-permission \
       --function-name my-streaming-function \
       --action lambda:InvokeFunction \
       --statement-id UrlPolicyInvokeFunction \
       --principal 123456789012
   ```

1. 使用 `create-function-url-config` 命令為函數建立 URL 端點。

   ```
   aws lambda create-function-url-config \
     --function-name my-streaming-function \
     --auth-type AWS_IAM \
     --invoke-mode RESPONSE_STREAM
   ```
**注意**  
如果收到有關 `--invoke-mode` 的錯誤，可能需要升級至[較新版本的 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。

## 測試函數 URL 端點
<a name="response-streaming-tutorial-test"></a>

透過調用函數來測試整合。可以在瀏覽器中開啟函數 URL，也可以使用 curl。

```
curl --request GET "https://abcdefghijklm7nop7qrs740abcd.lambda-url.us-east-1.on.aws/" --user "AKIAIOSFODNN7EXAMPLE" --aws-sigv4 "aws:amz:us-east-1:lambda" --no-buffer
```

我們的函數 URL 使用 `IAM_AUTH` 驗證類型。這表示您必須同時使用 [AWS 存取金鑰與私密金鑰](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)來簽署請求。在上一個命令中，將 取代`AKIAIOSFODNN7EXAMPLE`為 AWS 存取金鑰 ID。出現提示時輸入您的 AWS 私密金鑰。如果您沒有 AWS 私密金鑰，您可以改為[使用臨時 AWS 登入](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html)資料。

您應該看到如下回應：

```
Streaming with Helper 
Hello 0 
Hello 1
Hello 2
```

## 清除您的資源
<a name="cleanup"></a>

除非您想要保留為此教學課程建立的資源，否則您現在便可刪除。透過刪除您不再使用 AWS 的資源，您可以避免不必要的 費用 AWS 帳戶。

**刪除執行角色**

1. 開啟 IAM 主控台中的 [角色頁面](https://console.aws.amazon.com/iam/home#/roles) 。

1. 選取您建立的執行角色。

1. 選擇**刪除**。

1. 在文字輸入欄位中輸入角色的名稱，然後選擇 **刪除** 。

**若要刪除 Lambda 函數**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇您建立的函數。

1. 選擇 **Actions** (動作)、**Delete** (刪除)。

1. 在文字輸入欄位中輸入 **confirm**，然後選擇 **刪除** 。

# 使用 Lambda 中繼資料端點
<a name="configuration-metadata-endpoint"></a>

Lambda 中繼資料端點可讓您的函數探索他們在哪個可用區域 (AZ) 中執行，讓您能夠透過路由至 Amazon ElastiCache 和 Amazon RDS 端點等相同可用區域資源來最佳化延遲，並實作可用區域感知彈性模式。

端點會透過執行環境中的 localhost HTTP API 以簡單的 JSON 格式傳回中繼資料，並且可供執行時間和延伸存取。

**Topics**
+ [

## 開始使用
](#metadata-endpoint-getting-started)
+ [

## 了解可用區域 IDs
](#metadata-endpoint-az-ids)
+ [

## API 參考
](#metadata-endpoint-api-reference)

## 開始使用
<a name="metadata-endpoint-getting-started"></a>

[Powertools for AWS Lambda](https://docs.aws.amazon.com/powertools/) 提供公用程式，以存取 Python、TypeScript、Java 和 .NET 中的 Lambda 中繼資料端點。公用程式會在第一次呼叫後快取回應，並自動處理 SnapStart 快取失效。

使用 Powertools for AWS Lambda 中繼資料公用程式或直接呼叫中繼資料端點

------
#### [ Python ]

安裝 Powertools 套件：

```
pip install "aws-lambda-powertools"
```

在處理常式中使用中繼資料公用程式：

**Example 使用 Powertools 擷取 AZ ID (Python)**  

```
from aws_lambda_powertools.utilities.lambda_metadata import get_lambda_metadata

def handler(event, context):
    metadata = get_lambda_metadata()
    az_id = metadata.availability_zone_id  # e.g., "use1-az1"

    return {"az_id": az_id}
```

------
#### [ TypeScript ]

安裝 Powertools 套件：

```
npm install @aws-lambda-powertools/commons
```

在處理常式中使用中繼資料公用程式：

**Example 使用 Powertools 擷取 AZ ID (TypeScript)**  

```
import { getMetadata } from '@aws-lambda-powertools/commons/utils/metadata';

const metadata = await getMetadata();

export const handler = async () => {
  const { AvailabilityZoneID: azId } = metadata;
  return azId;
};
```

------
#### [ Java ]

將 Powertools 相依性新增至您的 `pom.xml`：

```
<dependencies>
    <dependency>
        <groupId>software.amazon.lambda</groupId>
        <artifactId>powertools-lambda-metadata</artifactId>
        <version>2.10.0</version>
    </dependency>
</dependencies>
```

在處理常式中使用中繼資料用戶端：

**Example 使用 Powertools 擷取 AZ ID (Java)**  

```
import software.amazon.lambda.powertools.metadata.LambdaMetadata;
import software.amazon.lambda.powertools.metadata.LambdaMetadataClient;

public class App implements RequestHandler<Object, String> {

    @Override
    public String handleRequest(Object input, Context context) {
        LambdaMetadata metadata = LambdaMetadataClient.get();
        String azId = metadata.getAvailabilityZoneId(); // e.g., "use1-az1"

        return "{\"azId\": \"" + azId + "\"}";
    }
}
```

------
#### [ .NET ]

安裝 Powertools 套件：

```
dotnet add package AWS.Lambda.Powertools.Metadata
```

在處理常式中使用中繼資料類別：

**Example 使用 Powertools 擷取 AZ ID (.NET)**  

```
using AWS.Lambda.Powertools.Metadata;

public class Function
{
    public string Handler(object input, ILambdaContext context)
    {
        var azId = LambdaMetadata.AvailabilityZoneId;
        return $"Running in AZ: {azId}";
    }
}
```

------
#### [ All Runtimes ]

所有 Lambda 執行期都支援中繼資料端點，包括自訂執行期和容器映像。使用以下範例，使用 Lambda 在執行環境中自動設定的環境變數，直接從您的函數存取中繼資料 API。

**Example 直接存取中繼資料端點**  

```
# Variables are automatically set by Lambda
METADATA_ENDPOINT="http://${AWS_LAMBDA_METADATA_API}/2026-01-15/metadata/execution-environment"

# Make the request
RESPONSE=$(curl -s -H "Authorization: Bearer ${AWS_LAMBDA_METADATA_TOKEN}" "$METADATA_ENDPOINT")

# Parse the AZ ID
AZ_ID=$(echo "$RESPONSE" | jq -r '.AvailabilityZoneID')

echo "Function is running in AZ ID: $AZ_ID"
```

------

## 了解可用區域 IDs
<a name="metadata-endpoint-az-ids"></a>

AZ IDs （例如，`use1-az1`) 一律在所有 AWS 帳戶中參考相同的實體位置，而 AZ 名稱 （例如，`us-east-1a`) 可能會映射到特定區域中每個 AWS 帳戶中的不同實體基礎設施。如需詳細資訊，請參閱 [AZ IDs以取得跨帳戶一致性](https://docs.aws.amazon.com/global-infrastructure/latest/regions/az-ids.html)。

**將 AZ ID 轉換為 AZ 名稱：**

若要將 AZ ID 轉換為 AZ 名稱，請使用 Amazon EC2 [DescribeAvailabilityZones](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeAvailabilityZones.html) API。若要使用此 API，請將 `ec2:DescribeAvailabilityZones`許可新增至函數的執行角色。

## API 參考
<a name="metadata-endpoint-api-reference"></a>

### 環境變數
<a name="metadata-endpoint-env-vars"></a>

Lambda 會在每個執行環境中自動設定下列環境變數：
+ `AWS_LAMBDA_METADATA_API` – 格式的中繼資料伺服器地址 `{ipv4_address}:{port}`（例如 `169.254.100.1:9001`)。
+ `AWS_LAMBDA_METADATA_TOKEN` – 目前執行環境的唯一身分驗證字符。Lambda 會在初始化時自動產生此權杖。將其包含在所有中繼資料 API 請求中。

### Endpoint
<a name="metadata-endpoint-url"></a>

`GET http://${AWS_LAMBDA_METADATA_API}/2026-01-15/metadata/execution-environment`

### 請求
<a name="metadata-endpoint-request"></a>

**必要標頭：**
+ `Authorization` – 來自具有 Bearer 結構描述之`AWS_LAMBDA_METADATA_TOKEN`環境變數的字符值：`Bearer <token>`。此字符型身分驗證可針對伺服器端請求偽造 (SSRF) 漏洞提供深度防禦。每個執行環境都會在初始化時收到唯一的隨機產生字符。

### 回應
<a name="metadata-endpoint-response"></a>

**狀態：** `200 OK`

**Content-Type：** `application/json`

**快取控制：** `private, max-age=43200, immutable`

回應在執行環境中是不可變的。用戶端應快取回應並遵循 `Cache-Control` TTL。對於 SnapStart 函數，TTL 會在初始化期間減少，因此當執行環境可能位於不同的可用區域中時，用戶端會在還原後重新整理中繼資料。如果您使用 Powertools，會自動處理快取和 SnapStart 無效。

**本文：**

```
{
  "AvailabilityZoneID": "use1-az1"
}
```

`AvailabilityZoneID` 欄位包含執行環境執行所在可用區域的唯一識別符。

**注意**  
其他欄位可能會新增至未來更新的回應。用戶端應該忽略未知欄位，如果出現新欄位，則不會失敗。

### 錯誤回應
<a name="metadata-endpoint-errors"></a>
+ **401 未授權** – `Authorization`標頭遺失或包含無效的字符。驗證您正在傳遞 `Bearer ${AWS_LAMBDA_METADATA_TOKEN}`。
+ **405 不允許的方法** – 請求方法不是 `GET`。
+ **500 內部伺服器錯誤** – 伺服器端處理錯誤。