

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

# 建立 Lambda 耐用函數
<a name="durable-getting-started"></a>

若要開始使用 Lambda 耐用函數，請使用 Lambda 主控台建立耐用函數。在幾分鐘內，您可以建立和部署耐久的 函數，該函數使用步驟 並等待示範檢查點型執行。

執行教學課程時，您將學習基本的耐用函數概念，例如如何使用 `DurableContext` 物件、使用步驟建立檢查點，以及使用等待暫停執行。您也將了解當您的函數在等待後恢復時，重播的運作方式。

為了保持簡單，本教學課程說明如何使用 Python 或 Node.js 執行期來建立函數。您可以使用這些轉譯語言，直接在主控台的內建程式碼編輯器中編輯函數程式碼。

**注意**  
耐用函數目前支援 Python、Node.js (JavaScript/TypeScript) 和 Java 執行期，以及容器映像 (OCI)。如需支援執行時間版本和容器映像選項的完整清單，請參閱[耐用函數支援的執行時間](durable-supported-runtimes.md)。如需搭配 Lambda 使用容器映像的詳細資訊，請參閱[《Lambda 開發人員指南》中的建立 Lambda 容器映像](https://docs.aws.amazon.com/lambda/latest/dg/images-create.html)。

**提示**  
若要了解如何建置**無伺服器解決方案**，請參閱[無伺服器開發人員指南](https://docs.aws.amazon.com/serverless/latest/devguide/)。

## 先決條件
<a name="durable-getting-started-prerequisites"></a>

### 註冊 AWS 帳戶
<a name="sign-up-for-aws"></a>

如果您沒有 AWS 帳戶，請完成下列步驟來建立一個。

**註冊 AWS 帳戶**

1. 開啟 [https://portal.aws.amazon.com/billing/signup](https://portal.aws.amazon.com/billing/signup)。

1. 請遵循線上指示進行。

   部分註冊程序需接收來電或簡訊，並在電話鍵盤輸入驗證碼。

   當您註冊 時 AWS 帳戶，*AWS 帳戶根使用者*會建立 。根使用者有權存取該帳戶中的所有 AWS 服務 和資源。作為安全最佳實務，請將管理存取權指派給使用者，並且僅使用根使用者來執行[需要根使用者存取權的任務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)。

AWS 會在註冊程序完成後傳送確認電子郵件給您。您可以隨時登錄 [https://aws.amazon.com/](https://aws.amazon.com/) 並選擇**我的帳戶**，以檢視您目前的帳戶活動並管理帳戶。

### 建立具有管理存取權的使用者
<a name="create-an-admin"></a>

註冊 後 AWS 帳戶，請保護 AWS 帳戶根使用者、啟用 AWS IAM Identity Center和建立管理使用者，以免將根使用者用於日常任務。

**保護您的 AWS 帳戶根使用者**

1.  選擇**根使用者**並輸入 AWS 帳戶 您的電子郵件地址，以帳戶擁有者[AWS 管理主控台](https://console.aws.amazon.com/)身分登入 。在下一頁中，輸入您的密碼。

   如需使用根使用者登入的說明，請參閱 *AWS 登入 使用者指南*中的[以根使用者身分登入](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html#introduction-to-root-user-sign-in-tutorial)。

1. 若要在您的根使用者帳戶上啟用多重要素驗證 (MFA)。

   如需說明，請參閱《*IAM 使用者指南*》中的[為您的 AWS 帳戶 根使用者 （主控台） 啟用虛擬 MFA 裝置](https://docs.aws.amazon.com/IAM/latest/UserGuide/enable-virt-mfa-for-root.html)。

**建立具有管理存取權的使用者**

1. 啟用 IAM Identity Center。

   如需指示，請參閱《AWS IAM Identity Center 使用者指南》**中的[啟用 AWS IAM Identity Center](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-set-up-for-idc.html)。

1. 在 IAM Identity Center 中，將管理存取權授予使用者。

   如需使用 IAM Identity Center 目錄 做為身分來源的教學課程，請參閱*AWS IAM Identity Center 《 使用者指南*》中的[使用預設值設定使用者存取 IAM Identity Center 目錄](https://docs.aws.amazon.com//singlesignon/latest/userguide/quick-start-default-idc.html)。

**以具有管理存取權的使用者身分登入**
+ 若要使用您的 IAM Identity Center 使用者簽署，請使用建立 IAM Identity Center 使用者時傳送至您電子郵件地址的簽署 URL。

  如需使用 IAM Identity Center 使用者登入的說明，請參閱*AWS 登入 《 使用者指南*》中的[登入 AWS 存取入口網站](https://docs.aws.amazon.com/signin/latest/userguide/iam-id-center-sign-in-tutorial.html)。

**指派存取權給其他使用者**

1. 在 IAM Identity Center 中，建立一個許可集來遵循套用最低權限的最佳實務。

   如需指示，請參閱《AWS IAM Identity Center 使用者指南》**中的[建立許可集](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-started-create-a-permission-set.html)。

1. 將使用者指派至群組，然後對該群組指派單一登入存取權。

   如需指示，請參閱《AWS IAM Identity Center 使用者指南》**中的[新增群組](https://docs.aws.amazon.com//singlesignon/latest/userguide/addgroups.html)。

## 使用主控台建立 Lambda 耐用函數
<a name="getting-started-create-durable-function"></a>

在此範例中，您的耐用函數會使用自動檢查點處理多個步驟的訂單。函數會取得包含訂單 ID 的 JSON 物件、驗證訂單、處理付款，以及確認訂單。每個步驟都會自動檢查點，因此如果函數中斷，則會從上次完成的步驟繼續執行。

您的函數也會示範等待操作，暫停執行一小段時間以模擬等待外部確認。

**使用主控台建立耐用的函數**

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

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

1. 選取**從頭開始撰寫**。

1. 在**基本資訊**窗格中，為**函數名稱**輸入 `myDurableFunction`。

1. 針對**執行期**，選擇 **Node.js 24** 或 **Python 3.14。**

1. 選取**啟用持久性執行**。

Lambda 會使用包含檢查點操作 (`lambda:CheckpointDurableExecution` 和 ) 許可的[執行角色](lambda-intro-execution-role.md)來建立您的耐用函數`lambda:GetDurableExecutionState`。

**注意**  
Lambda 執行時間包含持久性執行 SDK，因此您可以測試持久性函數，而無需封裝相依性。不過，我們建議您在部署套件中包含 開發套件，以供生產使用。這可確保版本一致性，並避免可能影響函數的潛在執行時間更新。

使用主控台的內建程式碼編輯器來新增您的耐用函數程式碼。

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

**若要在主控台中修改程式碼**

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

   在主控台的內建程式碼編輯器中，您應該會看到 Lambda 建立的函數程式碼。如果您在程式碼編輯器中沒看到 **index.mjs** 標籤，請在檔案總管中選取 **index.mjs**，如下圖所示。  
![顯示主控台程式碼編輯器和檔案總管中 index.mjs 檔案的圖](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/durable-nodejs.png)

1. 將以下程式碼貼到 **index.mjs** 標籤中，替換 Lambda 建立的程式碼。

   ```
   import {
     withDurableExecution,
   } from "@aws/durable-execution-sdk-js";
   
   export const handler = withDurableExecution(
     async (event, context) => {
       const orderId = event.orderId;
       
       // Step 1: Validate order
       const validationResult = await context.step(async (stepContext) => {
         stepContext.logger.info(`Validating order ${orderId}`);
         return { orderId, status: "validated" };
       });
       
       // Step 2: Process payment
       const paymentResult = await context.step(async (stepContext) => {
         stepContext.logger.info(`Processing payment for order ${orderId}`);
         return { orderId, status: "paid", amount: 99.99 };
       });
       
       // Wait for 10 seconds to simulate external confirmation
       await context.wait({ seconds: 10 });
       
       // Step 3: Confirm order
       const confirmationResult = await context.step(async (stepContext) => {
         stepContext.logger.info(`Confirming order ${orderId}`);
         return { orderId, status: "confirmed" };
       });
           
       return {
         orderId: orderId,
         status: "completed",
         steps: [validationResult, paymentResult, confirmationResult]
       };
     }
   );
   ```

1. 在 **DEPLOY** 區段中，選擇**部署**以更新函數的程式碼：  
![Lambda 主控台程式碼編輯器中的「部署」按鈕](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

**了解您的耐用函數程式碼**  
在進行下一個步驟之前，讓我們先查看函數程式碼，並了解關鍵的耐久函數概念。
+ `withDurableExecution` 包裝函式：

  您的耐用函數會包裝在 中`withDurableExecution`。此包裝函式提供 `DurableContext` 物件和管理檢查點操作，以啟用持久的執行。
+ `DurableContext` 物件：

  您的函數會收到 ，而不是標準 Lambda 內容`DurableContext`。此物件提供建立檢查點等耐久操作的方法`wait()`，例如 `step()`和 。
+ 步驟和檢查點：

  每個`context.step()`呼叫都會在執行前後建立檢查點。如果您的函數中斷，則會從上次完成的檢查點繼續執行。函數不會重新執行完成的步驟。它會改用其儲存的結果。
+ 等待操作：

  `context.wait()` 呼叫會暫停執行，而不會耗用運算資源。當等待完成時，Lambda 會再次叫用您的函數，並重播檢查點日誌，以儲存的值取代已完成的步驟。
+ 重播機制：

  當您的函數在等待或中斷後繼續時，Lambda 會從頭開始執行您的程式碼。不過，已完成的步驟不會重新執行。Lambda 會從檢查點日誌重播其結果。這就是您的程式碼必須具有決定性的原因。

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

**若要在主控台中修改程式碼**

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

   在主控台的內建程式碼編輯器中，您應該會看到 Lambda 建立的函數程式碼。如果您在程式碼編輯器中沒看到 **lambda\_function.py**，請在檔案總管中選取 **lambda\_function.py**，如下圖所示。  
![顯示主控台程式碼編輯器和檔案總管中 lambda_function.py 檔案的圖](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/durable-python.png)

1. 將以下程式碼貼到 **lambda\_function.py** 標籤中，替換 Lambda 建立的程式碼。

   ```
   from aws_durable_execution_sdk_python import (
       DurableContext,
       durable_execution,
       durable_step,
   )
   from aws_durable_execution_sdk_python.config import Duration
   
   @durable_step
   def validate_order(step_context, order_id):
       step_context.logger.info(f"Validating order {order_id}")
       return {"orderId": order_id, "status": "validated"}
   
   @durable_step
   def process_payment(step_context, order_id):
       step_context.logger.info(f"Processing payment for order {order_id}")
       return {"orderId": order_id, "status": "paid", "amount": 99.99}
   
   @durable_step
   def confirm_order(step_context, order_id):
       step_context.logger.info(f"Confirming order {order_id}")
       return {"orderId": order_id, "status": "confirmed"}
   
   @durable_execution
   def lambda_handler(event, context: DurableContext):
       order_id = event['orderId']
       
       # Step 1: Validate order
       validation_result = context.step(validate_order(order_id))
       
       # Step 2: Process payment
       payment_result = context.step(process_payment(order_id))
       
       # Wait for 10 seconds to simulate external confirmation
       context.wait(Duration.from_seconds(10))
       
       # Step 3: Confirm order
       confirmation_result = context.step(confirm_order(order_id))
           
       return {
           "orderId": order_id,
           "status": "completed",
           "steps": [validation_result, payment_result, confirmation_result]
       }
   ```

1. 在 **DEPLOY** 區段中，選擇**部署**以更新函數的程式碼：  
![Lambda 主控台程式碼編輯器中的「部署」按鈕](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

**了解您的耐用函數程式碼**  
在進行下一個步驟之前，讓我們先查看函數程式碼，並了解關鍵的耐久函數概念。
+ `@durable_execution` 裝飾項目：

  您的處理常式函數會裝飾為 `@durable_execution`。此裝飾項目透過提供 `DurableContext` 物件和管理檢查點操作來實現持久的執行。
+ `@durable_step` 裝飾項目：

  每個步驟函數都以 裝飾`@durable_step`。此裝飾項目會將函數標記為建立檢查點的耐久步驟。
+ `DurableContext` 物件：

  您的函數會收到 ，而不是標準 Lambda 內容`DurableContext`。此物件提供建立檢查點等耐久操作的方法`wait()`，例如 `step()`和 。
+ 步驟和檢查點：

  每個`context.step()`呼叫都會在執行前後建立檢查點。如果您的函數中斷，則會從上次完成的檢查點繼續執行。函數不會重新執行完成的步驟。它會改用其儲存的結果。
+ 等待操作：

  `context.wait()` 呼叫會暫停執行，而不會耗用運算資源。當等待完成時，Lambda 會再次叫用您的函數，並重播檢查點日誌，以儲存的值取代已完成的步驟。
+ Python SDK 是同步的：

  請注意，Python SDK 不使用 `await`。所有耐用的操作都是同步方法呼叫。

------

## 使用主控台程式碼編輯器叫用耐用函數
<a name="get-started-invoke-durable-manually"></a>

未指定明確版本 （或發佈） 時，主控台會使用`$LATEST`版本限定詞叫用耐久函數。不過，為了確定性執行程式碼，您必須一律使用指向穩定版本的合格 ARN。

**發佈函數的版本**

1. 選擇**版本**索引標籤。

1. 選擇 **Publish new version (發佈新版本)**。

1. 針對**版本描述**，輸入 **Initial version**（選用）。

1. 選擇**發布**。

1. Lambda 會建立函數的第 1 版。請注意，函數 ARN 現在`:1`會在結尾包含 ，表示這是第 1 版。

現在建立測試事件以傳送至您的 函數。事件是包含訂單 ID 的 JSON 格式文件。

**若要建立測試事件**

1. 在主控台程式碼編輯器的 **TEST EVENTS** 區段中，選擇**建立測試事件**。  
![在 Lambda 主控台程式碼編輯器中建立測試事件按鈕](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/getting-started-tutorial/test-event.png)

1. **Event Name (事件名稱)** 輸入 **myTestEvent**。

1. 在**事件 JSON** 區段中，將預設 JSON 取代為下列項目：

   ```
   {
     "orderId": "order-12345"
   }
   ```

1. 選擇**儲存**。

**測試您的耐用函數並檢視執行**

在主控台程式碼編輯器的 **TEST EVENTS** 區段中，選擇測試事件旁邊的執行圖示：

![Lambda 主控台程式碼編輯器中的「執行測試事件」按鈕](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/getting-started-tutorial/run-test-event.png)


您的耐用函數會開始執行。因為它包含 10 秒的等待時間，初始調用會快速完成，而且函數會在等待期間之後繼續。您可以在**持久性執行索引標籤中檢視執行**進度。

**檢視您的耐久函數執行**

1. 選擇**持久性執行**索引標籤。

1. 在清單中尋找您的執行。執行會顯示目前狀態 （執行中、成功或失敗）。

1. 選擇執行 ID 以檢視詳細資訊，包括：
   + 顯示每個步驟完成時間的執行時間表
   + 檢查點歷史記錄
   + 等待期間
   + 步驟結果

您也可以在 CloudWatch Logs 中檢視函數的日誌，以查看每個步驟的主控台輸出。

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

1. 開啟 CloudWatch 主控台的 [日誌群組](https://console.aws.amazon.com/cloudwatch/home#logs:) 頁面。

1. 為函數 (`/aws/lambda/myDurableFunction`) 選擇日誌群組名稱。

1. 向下捲動並選擇要查看的函數調用**日誌串流**。  
![Lambda 函數的日誌串流清單。](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/log-stream.png)

   您應該會看到每次叫用函數的日誌項目，包括初始執行和等待後的重播。

**注意**  
當您從 `DurableContext`（例如 `context.logger`或 `stepContext.logger`) 使用記錄器時，日誌也會出現在 Lambda 主控台的耐久執行和步驟檢視中。這些日誌可能需要一些時間才能載入。

## 清除
<a name="gettingstarted-durable-cleanup"></a>

當您完成使用範例耐用函數時，請將其刪除。您還可以刪除存放函數日誌的日誌群組，以及主控台建立的[執行角色](lambda-intro-execution-role.md)。

**若要刪除 Lambda 函數**

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

1. 選擇您建立的函數。

1. 選擇 **Actions** (動作)、**Delete** (刪除)。

1. 在文字輸入欄位中輸入 **confirm**，然後選擇**刪除**。

**刪除日誌群組**

1. 開啟 CloudWatch 主控台的 [日誌群組](https://console.aws.amazon.com/cloudwatch/home#logs:) 頁面。

1. 選取函數的日誌群組 (`/aws/lambda/myDurableFunction`)。

1. 選擇 **動作** 、**刪除日誌群組** 。

1. 在 **刪除日誌群組** 對話方塊中，選擇 **刪除** 。

**刪除執行角色**

1. 開啟 AWS Identity and Access Management (IAM) 主控台的角色[頁面](https://console.aws.amazon.com/iam/home?#/roles)。

1. 選取函數的執行角色，(例如 `myDurableFunction-role-{{31exxmpl}}`)。

1. 選擇 **刪除**。

1. 在**刪除角色**對話方塊中輸入角色名稱，然後選擇**刪除**。

## 其他資源和後續步驟
<a name="durable-getting-started-more-resources"></a>

現在您已使用 主控台建立並測試簡單的耐用函數，請採取這些後續步驟：
+ 了解耐用函數的常見使用案例，包括分散式交易、訂單處理和人工審核工作流程。請參閱[範例](durable-examples.md)。
+ 了解如何使用 CloudWatch 指標和執行歷史記錄監控持久的函數執行。請參閱[監控和偵錯](durable-monitoring.md)。
+ 了解如何同步和非同步叫用耐久函數，以及管理長時間執行的執行。請參閱[叫用耐用函數](durable-invoking.md)。
+ 遵循撰寫確定性程式碼、管理檢查點大小和最佳化成本的最佳實務。請參閱[最佳實務](durable-best-practices.md)。
+ 了解如何在本機和雲端測試耐用的函數。請參閱[測試耐用函數](durable-testing.md)。
+ 比較耐用的函數與 Step Functions，以了解每個方法最有效的時機。請參閱[耐用函數或 Step Functions](durable-step-functions.md)。