

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

# Lambda 的運作方式
<a name="concepts-basics"></a>

Lambda 函式是用來建置 Lambda 應用程式的基本建置區塊。若要編寫函式，必須了解組成 Lambda 程式設計模型的核心概念和元件。本節將引導您了解開始使用 Lambda 建置無伺服器應用程式所需的基本元素。
+ **[Lambda 函式與函式處理常式](#gettingstarted-concepts-function)** - Lambda 函數是一小段程式碼，用於回應事件。函數可以是標準 （最多 15 分鐘） 或[耐用](durable-functions.md) （最多一年）。函數是您用來建置應用程式的基本建置區塊。處理常式是 Lambda 函式程式碼處理事件物件的進入點。
+ **[Lambda 執行環境與執行時期](#gettingstarted-concepts-runtime)** – Lambda 執行環境會管理執行函式所需的資源。對於[耐用的函數](durable-functions.md)，執行環境包含自動狀態管理和檢查點功能。執行時間是您函數執行的特定語言環境。
+ **[事件與觸發程序](#gettingstarted-concepts-event)** - 其他 AWS 服務 可以調用函數以回應特定事件。對於耐用的函數，事件也可以觸發暫停工作流程的恢復。
+ **[Lambda 許可與角色](#gettingstarted-concepts-permissions)** - 控制誰可以存取您的函式，以及 AWS 服務 您的函式可以與哪些其他互動。耐用的函數需要額外的許可，才能進行狀態管理和延伸執行。

**提示**  
若要更全面地了解無伺服器開發，請參閱 *AWS Serverless Developer Guide* 中的 [Understanding the difference between traditional and serverless development](https://docs.aws.amazon.com/serverless/latest/devguide/serverless-shift-mindset.html)。

## Lambda 函式與函式處理常式
<a name="gettingstarted-concepts-function"></a>

在 Lambda 中，**函式**是您用來建立應用程式的基本建置區塊。Lambda 函式是為回應事件而執行的一段程式碼，例如使用者按一下網站上的按鈕，或檔案上傳至 Amazon Simple Storage Service (Amazon S3) 儲存貯體。透過耐用的 函數，您的程式碼可以在步驟之間暫停執行，自動維護狀態，使其非常適合長時間執行的工作流程，例如訂單處理或內容管制。您可以將函式視為一種具有下列特性的獨立程式。

Lambda **函式處理常式**是函式程式碼中處理事件的方法。當函式因回應事件而執行時，Lambda 會執行函式處理常式。導致函式執行的事件相關資料，會直接傳遞至處理常式。雖然 Lambda 函式中的程式碼可以包含多個方法或函式，但 Lambda 函式只能有一個處理常式。

若要建立 Lambda 函式，需將函式程式碼及其相依項共同封裝為部署套件。Lambda 支援兩種類型的部署套件：[.zip 壓縮檔](configuration-function-zip.md)與[容器映像](images-create.md)。
+ 一個函式有一個特定的任務或用途
+ 僅在需要回應特定事件時執行
+ 會在任務完成後自動停止執行

## Lambda 執行環境與執行時期
<a name="gettingstarted-concepts-runtime"></a>

Lambda 函式會在 Lambda 為您管理的安全隔離*[執行環境](lambda-runtime-environment.md)*中執行。對於[耐用的函數](durable-functions.md)，執行環境包含用於狀態管理和工作流程協調的其他元件。執行環境會管理執行函數所需的程序和資源。當函式首次被調用時，Lambda 會為該函式建立一個新的執行環境以在其中執行。函式執行完成後，Lambda 不會立即停止該執行環境；如果函式被再次調用，Lambda 可以重複使用現有的執行環境。

Lambda 執行環境中還包含*執行時期*，這是一種與特定程式語言相關的環境，負責在 Lambda 與您的函式之間傳遞事件資訊與回應。Lambda 提供許多適用於最熱門程式設計語言的[受管執行時期](lambda-runtimes.md#runtimes-supported)，但您也可以自行建立執行時期。

對於受管執行時期，Lambda 會自動對使用該執行時期的函式套用安全性更新與修補程式。

## 事件與觸發程序
<a name="gettingstarted-concepts-event"></a>

您也可以透過 Lambda 主控台、[AWS CLI](https://aws.amazon.com/cli/) 或任一 [AWS 軟體開發套件 (SDK)](https://aws.amazon.com/developer/tools/) 直接調用 Lambda 函式。在生產應用程式中，另一個 會調用您的函數 AWS 服務 以回應特定事件，這是較常見的做法。例如，您可能希望每當 Amazon DynamoDB 資料表新增項目時，就執行某個函式。

若要讓函式回應事件，您可以設定**觸發程序**。觸發程序會將函式連線至事件來源，且函式可以有多個觸發程序。當事件發生時，Lambda 會以 JSON 文件的形式接收事件資料，並將其轉換為程式碼能夠處理的物件。您可以為事件定義下列 JSON 格式，Lambda 執行時期會將此 JSON 文件轉換為物件，然後再將其傳遞至函式的處理常式。

**Example 自訂 Lambda 事件**  

```
{
  "Location": "SEA",
  "WeatherData":{
    "TemperaturesF":{
      "MinTempF": 22,
      "MaxTempF": 78
    },
    "PressuresHPa":{
      "MinPressureHPa": 1015,
      "MaxPressureHPa": 1027
    }
  }
}
```

Amazon Kinesis 或 Amazon SQS 等串流和佇列服務會使用[事件來源映射](invocation-eventsourcemapping.md)，而非標準觸發。事件來源映射會輪詢來源以取得新資料、批次記錄，然後使用批次事件調用函式。如需詳細資訊，請參閱[事件來源映射與直接觸發條件有何不同](invocation-eventsourcemapping.md#eventsourcemapping-trigger-difference)。

若要了解觸發程序的運作方式，建議先完成[使用 Amazon S3 觸發程序](with-s3-example.md)教學課程。若需觸發程序使用總覽，或透過 Lambda 主控台建立觸發程序的操作步驟，請參閱[整合其他服務](lambda-services.md)。

## Lambda 許可與角色
<a name="gettingstarted-concepts-permissions"></a>

對於 Lambda，您需要設定兩種主要的[許可](permissions-granting-access.md)類型：
+ 您的函數存取其他 所需的許可 AWS 服務
+ 其他使用者和 存取函數 AWS 服務 所需的許可

下列各節介紹了這兩種許可類型，並討論了套用最低權限許可的最佳實務。

### 函數存取其他 AWS 資源的許可
<a name="gettingstarted-concepts-permissions-role"></a>

Lambda 函數通常需要存取其他 AWS 資源並對其執行動作。例如，函式可能會讀取 DynamoDB 資料表中項目、將物件儲存在 S3 儲存貯體中，或向 Amazon SQS 佇列寫入資料。若要為函式提供執行這些動作所需的許可，您可以使用*[執行角色](lambda-intro-execution-role.md)*。

Lambda 執行角色是一種特殊的 AWS Identity and Access Management (IAM) [角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)，您在帳戶中建立的身分，具有*政策*中定義與其相關聯的特定許可。

每個 Lambda 函式都必須擁有執行角色，而且單一角色可供多個函式共同使用。當函式被調用時，Lambda 會擔任函式的執行角色，取得執行該角色政策中定義之動作的許可。

若您透過 Lambda 主控台建立函式，Lambda 會自動為您的函式建立執行角色。該角色的政策會授予函式基本許可，可將日誌輸出寫入 Amazon CloudWatch Logs。若要授予函數在其他 AWS 資源上執行動作的許可，您需要編輯角色以新增額外的許可。新增許可的最簡單方法是使用 AWS [受管政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)。受管政策是由 建立和管理 AWS ，並提供許多常見使用案例的許可。例如，若函式對 DynamoDB 資料表執行 CRUD 操作，您可以將 [AmazonDynamoDBFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBFullAccess.html) 政策新增至角色。

### 其他使用者與資源存取函式所需的許可
<a name="gettingstarted-concepts-permissions-resource-based"></a>

若要授予其他 AWS 服務 許可來存取您的 Lambda 函數，您可以使用以*[資源為基礎的政策](access-control-resource-based.md)*。在 IAM 中，資源型政策會連接至資源 (本案例中即您的 Lambda 函式)，並定義可存取該資源的對象，以及允許對象執行哪些動作。

若要讓另一個 AWS 服務 透過觸發叫用函數，函數的資源型政策必須授予該服務使用該`lambda:InvokeFunction`動作的許可。若您透過主控台建立觸發程序，Lambda 會自動為您新增此許可。

若要授予其他 AWS 使用者存取函數的許可，您可以在函數的資源型政策中定義此項目，方式與另一個 AWS 服務 或 資源完全相同。您也可以使用與使用者相關聯的*[身分型政策](access-control-identity-based.md)*。

### Lambda 許可的最佳實務
<a name="gettingstarted-concepts-permissions-best-practice"></a>

使用 IAM 政策設定許可時，[安全最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)是僅授予執行任務所需的許可。這稱為*最低權限*原則。若要開始授予函數的許可，您可以選擇使用 AWS 受管政策。受管政策是授予執行任務所需許可最快速且最簡單的方式，但其中可能包含您不需要的其他許可。從早期開發到進入測試及生產階段的過程中，建議透過間建立自訂[客戶管理政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies)，將許可精簡至僅保留實際所需的項目。

在使用資源型政策授予存取函式的許可時，此原則同樣適用。例如，如果您想要授予 Amazon S3 叫用函數的許可，最佳實務是限制對個別儲存貯體或儲存貯體的存取 AWS 帳戶，而不是授予 S3 服務的空白許可。