

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

# AWS Lambda
<a name="lambda-index"></a>

使用 開發和部署以 .NET Core 為基礎的 C\$1 Lambda 函數 AWS Toolkit for Visual Studio。 AWS Lambda 是一種運算服務，可讓您執行程式碼，而無需佈建或管理伺服器。Toolkit for Visual Studio 包含適用於 Visual Studio 的 AWS Lambda .NET Core 專案範本。

如需 的詳細資訊 AWS Lambda，請參閱 [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 開發人員指南。

如需 .NET Core 的詳細資訊，請參閱 Microsoft [.NET Core](https://docs.microsoft.com/en-us/dotnet/articles/core/) 指南。如需 Windows、macOS 和 Linux 平台的 .NET Core 先決條件和安裝說明，請參閱 [.NET Core Downloads](https://www.microsoft.com/net/download/core)。

下列主題說明如何 AWS Lambda 使用 Toolkit for Visual Studio 來使用 。

**Topics**
+ [基本 AWS Lambda 專案](lambda-creating-project-in-visual-studio.md)
+ [基本 AWS Lambda 專案建立 Docker 影像](lambda-creating-project-docker-image.md)
+ [教學課程：使用 建置和測試無伺服器應用程式 AWS Lambda](lambda-build-test-severless-app.md)
+ [教學課程：建立 Amazon Rekognition Lambda 應用程式](lambda-rekognition-example.md)
+ [教學課程：搭配 使用 Amazon Logging Framework AWS Lambda 來建立應用程式日誌](cw-log-frameworks.md)

# 基本 AWS Lambda 專案
<a name="lambda-creating-project-in-visual-studio"></a>

您可以在 中使用 Microsoft .NET Core 專案範本建立 Lambda 函數 AWS Toolkit for Visual Studio。

## 建立 Visual Studio .NET Core Lambda 專案
<a name="create-a-visual-studio-net-core-lam-project"></a>

您可以使用 Lambda-Visual Studio 範本和藍圖來協助加速專案初始化。Lambda 藍圖包含預先編寫的函數，可簡化彈性專案基礎的建立。

**注意**  
Lambda 服務對不同的套件類型具有資料限制。如需資料限制的詳細資訊，請參閱《[Lambda 使用者指南》中的 Lambda 配額](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)主題。 *AWS *

**在 Visual Studio 中建立 Lambda 專案**

1. 從 Visual Studio 展開**檔案**功能表，展開**新增**，然後選擇**專案**。

1. 在**新增專案**對話方塊中，將**語言**、**平台**和**專案類型**下拉式方塊設定為「全部」，然後在**aws lambda****搜尋**欄位中輸入 。選擇 **AWS Lambda 專案 (.NET Core - C\$1)** 範本。

1. 在**名稱**欄位中，輸入 **AWSLambdaSample**，指定所需的檔案**位置**，然後選擇**建立**以繼續。

1. 從**選取藍圖**頁面，選取**空白函數**藍圖，然後選擇**完成**以建立 Visual Studio 專案。

## 檢閱專案檔案
<a name="review-the-project-files"></a>

有兩個專案檔案需要檢閱： `aws-lambda-tools-defaults.json`和 `Function.cs`。

下列範例顯示 檔案，該`aws-lambda-tools-defaults.json`檔案會自動建立為專案的一部分。您可以使用此檔案中的欄位來設定建置選項。

**注意**  
 Visual Studio 中的專案範本包含許多不同的欄位，請注意下列事項：  
**function-handler**：指定 Lambda 函數執行時執行的方法
在**函數處理常式**欄位中指定值會在發佈精靈中預先填入該值。
如果您重新命名函數、類別或組件，則還需要更新 `aws-lambda-tools-defaults.json` 檔案中的對應欄位。

```
{
  "Information": [
    "This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.",
    "To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.",
    "dotnet lambda help",
    "All the command line options for the Lambda command can be specified in this file."
  ],
  "profile": "default",
  "region": "us-west-2",
  "configuration": "Release",
  "function-architecture": "x86_64",
  "function-runtime": "dotnet8",
  "function-memory-size": 512,
  "function-timeout": 30,
  "function-handler": "AWSLambdaSample::AWSLambdaSample.Function::FunctionHandler"
}
```

檢查 `Function.cs` 檔案。 `Function.cs`定義 c\$1 函數以公開為 Lambda 函數。`FunctionHandler` 這是 Lambda 函數執行時執行的 Lambda 功能。在此專案中，有一個已定義的函數：`FunctionHandler`，它會`ToUpper()`呼叫輸入文字。

您的專案現在已準備好發佈至 Lambda。

## 發佈至 Lambda
<a name="publish-to-lam"></a>

下列程序和映像示範如何使用 將函數上傳至 Lambda AWS Toolkit for Visual Studio。

![\[叫用測試函數頁面\]](http://docs.aws.amazon.com/zh_tw/toolkit-for-visual-studio/latest/user-guide/images/uploadnet8.png)


**將您的函數發佈至 Lambda**

1. 透過展開**檢視**並選擇 AWS Explorer 導覽至 **AWS Explorer**。

1. 在**解決方案總管**中，開啟您要發佈之專案的內容選單 （按一下滑鼠右鍵），然後選擇**發佈至 AWS Lambda** 以開啟**上傳 Lambda 函數**視窗。

1. 從**上傳 Lambda 函數**視窗中，完成下列欄位：

   1. **套件類型**：選擇 **Zip**。ZIP 檔案將作為建置程序的結果建立，並將上傳到 Lambda。或者，您可以選擇**套件類型** **Image**。[教學課程：基本 Lambda 專案建立 Docker 映像](lambda-creating-project-docker-image.md)說明如何使用**套件類型** 進行發佈**Image**。

   1. **Lambda 執行期**：從下拉式選單中選擇您的 Lambda 執行期。

   1. **架構**：選取您偏好架構的放射狀。

   1. **函數名稱**：選取**建立新函數**的放射狀，然後輸入 Lambda 執行個體的顯示名稱。 AWS Explorer 和 AWS 管理主控台 都會參考此名稱。

   1. **處理常**式：使用此欄位來指定函數處理常式。例如：**AWSLambdaSample::AWSLambdaSample.Function::FunctionHandler**。

   1. *（選用） ***描述**：輸入要與您的執行個體一起顯示的描述性文字，從 內 AWS 管理主控台。

   1. **組態**：從下拉式選單中選擇您偏好的組態。

   1. **架構**：從下拉式選單中選擇您偏好的架構。

   1. **儲存設定**：選取此方塊，將您目前的設定儲存`aws-lambda-tools-defaults.json`為未來部署的預設值。

   1. 選擇**下一步**以繼續進階**函數詳細資訊**視窗。

1. 在**進階函數詳細資訊**視窗中，完成下列欄位：

   1. **角色名稱**：選擇與您的帳戶相關聯的角色。此角色會為 函數中程式碼所做的任何 AWS 服務呼叫提供臨時登入資料。如果您沒有角色，請在下拉式清單中捲動以**根據 AWS 受管政策尋找新角色**，然後選擇 **AWSLambdaBasicExecutionRole**。此角色具有最低的存取許可。
**注意**  
您的帳戶必須具有執行 IAM ListPolicies 動作的許可，否則**角色名稱**清單將為空白，您將無法繼續。

   1. *（選用）* 如果您的 Lambda 函數存取 Amazon VPC 上的資源，請選取子網路和安全群組。

   1. *（選用）* 設定 Lambda 函數所需的任何環境變數。金鑰會由免費的預設服務金鑰自動加密。或者，您可以指定需要付費的 AWS KMS 金鑰。[KMS](https://aws.amazon.com/kms/) 是一項受管服務，可用來建立和控制用來加密資料的加密金鑰。如果您有 AWS KMS 金鑰，您可以從清單中選取它。

1. 選擇**上傳**以開啟**上傳函數**視窗，然後開始上傳程序。
**注意**  
**上傳函數**頁面會在函數上傳時顯示 AWS。若要在上傳後保持精靈開啟，以便您可以檢視報告，請在上傳完成之前清除**表單底部的成功完成時自動關閉精靈**。  
函數上傳後，您的 Lambda 函數即為即時。**函數：**檢視頁面隨即開啟，並顯示新的 Lambda 函數組態。

1. 從**測試函數**索引標籤`hello lambda!`，在文字輸入欄位中輸入 ，然後選擇**叫用**以手動叫用您的 Lambda 函數。您的文字會顯示在**回應**索引標籤中，並轉換為大寫。
**注意**  
您可以隨時在節點下的 **AWS Explorer** 中按兩下已部署的執行個體，以重新開啟 **函數：**檢視**AWS Lambda**。  
![\[叫用測試函數頁面\]](http://docs.aws.amazon.com/zh_tw/toolkit-for-visual-studio/latest/user-guide/images/invokeBasic.PNG)

1. *（選用）* 若要確認您已成功發佈 Lambda 函數，請登入 AWS 管理主控台 ，然後選擇 Lambda。主控台會顯示所有已發佈的 Lambda 函數，包括您剛建立的函數。

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

如果您不打算繼續使用此範例繼續開發，請刪除您部署的 函數，以免因帳戶中未使用的資源而產生費用。

**注意**  
Lambda 會自動為您監控 Lambda 函數，並透過 Amazon CloudWatch 報告指標。若要監控和疑難排解函數，請參閱《 AWS Lambda 開發人員指南》中的[使用 Amazon CloudWatch 疑難排解和監控 AWS Lambda 函數](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-functions.html)主題。

**刪除函數**

1. 從 **AWS Explorer** 展開**AWS Lambda**節點。

1. 用滑鼠右鍵按一下部署的執行個體，然後選擇**刪除**。

# 基本 AWS Lambda 專案建立 Docker 影像
<a name="lambda-creating-project-docker-image"></a>

您可以使用 Toolkit for Visual Studio 將 AWS Lambda 函數部署為 Docker 映像。使用 Docker，您可以更好地控制執行時間。例如，您可以選擇自訂執行時間，例如 .NET 8.0。您以與任何其他容器映像相同的方式部署 Docker 映像。本教學緊密模擬[教學課程：基本 Lambda 專案](lambda-creating-project-in-visual-studio.md)，有兩個差異：
+ Dockerfile 包含在專案中。
+ 已選擇替代發佈組態。

如需 Lambda 容器映像的相關資訊，請參閱《 *AWS Lambda 開發人員指南*》中的 [Lambda 部署套件](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-package.html)。

如需使用 Lambda 的詳細資訊 AWS Toolkit for Visual Studio，請參閱《 使用者指南[》中的使用 AWS Lambda 範本 AWS Toolkit for Visual Studio](lambda-index.md)主題。

## 建立 Visual Studio .NET Core Lambda 專案
<a name="create-a-visual-studio-net-core-lam-project"></a>

您可以使用 Lambda Visual Studio 範本和藍圖來協助加速專案初始化。Lambda 藍圖包含預先編寫的函數，可簡化彈性專案基礎的建立。

**建立 Visual Studio .NET Core Lambda 專案**

1. 從 Visual Studio 展開**檔案**功能表，展開**新增**，然後選擇**專案**。

1. 在**新增專案**對話方塊中，將**語言**、**平台**和**專案類型**下拉式方塊設定為「全部」，然後在**aws lambda****搜尋**欄位中輸入 。選擇 **AWS Lambda 專案 (.NET Core - C\$1)** 範本。

1. 在**專案名稱**欄位中，輸入 **AWSLambdaDocker**，指定檔案**位置**，然後選擇**建立**。

1. 在**選取藍圖**頁面上，選擇 **.NET 8 （容器映像）** 藍圖，然後選擇**完成**以建立 Visual Studio 專案。您現在可以檢閱專案的結構和程式碼。

## 檢閱專案檔案
<a name="review-the-project-files"></a>

下列各節會檢查 **.NET 8 （容器映像）** 藍圖建立的三個專案檔案：

1. `Dockerfile`

1. `aws-lambda-tools-defaults.json`

1. `Function.cs`

### 1. Dockerfile
<a name="dockerfile"></a>

會`Dockerfile`執行三個主要動作：
+ `FROM`：建立要用於此映像的基本映像。此基礎映像提供 .NET 執行期、Lambda 執行期，以及提供 Lambda .NET 程序進入點的 Shell 指令碼。
+ `WORKDIR`：將影像的內部工作目錄建立為 `/var/task`。
+ `COPY`： 會將建置程序產生的檔案從其本機位置複製到映像的工作目錄。

以下是您可以指定的選用`Dockerfile`動作：
+ `ENTRYPOINT`：基礎映像已包含 `ENTRYPOINT`，這是啟動映像時執行的啟動程序。如果您想要指定自己的 ，則您要覆寫該基本進入點。
+ `CMD`：指示您想要執行 AWS 的自訂程式碼。它預期您的自訂方法具有完整名稱。這行需要直接包含在 Dockerfile 中，也可以在發佈過程中指定。

  ```
  # Example of alternative way to specify the Lambda target method rather than during the publish process.
  CMD [ "AWSLambdaDocker::AWSLambdaDocker.Function::FunctionHandler"]
  ```

以下是 .NET 8 （容器映像） 藍圖建立的 Dockerfile 範例。

```
FROM public.ecr.aws/lambda/dotnet:8

WORKDIR /var/task

# This COPY command copies the .NET Lambda project's build artifacts from the host machine into the image. 
# The source of the COPY should match where the .NET Lambda project publishes its build artifacts. If the Lambda function is being built 
# with the AWS .NET Lambda Tooling, the `--docker-host-build-output-dir` switch controls where the .NET Lambda project
# will be built. The .NET Lambda project templates default to having `--docker-host-build-output-dir`
# set in the aws-lambda-tools-defaults.json file to "bin/Release/lambda-publish".
#
# Alternatively Docker multi-stage build could be used to build the .NET Lambda project inside the image.
# For more information on this approach checkout the project's README.md file.
COPY "bin/Release/lambda-publish"  .
```

### 2. aws-lambda-tools-defaults.json
<a name="aws-lambda-tools-defaults"></a>

`aws-lambda-tools-defaults.json` 檔案用於指定 Toolkit for Visual Studio 部署精靈和 .NET Core CLI 的預設值。下列清單說明您可以在 `aws-lambda-tools-defaults.json` 檔案中設定的欄位。
+ `profile`：設定您的 AWS 設定檔。
+ `region`：設定儲存資源 AWS 的區域。
+ `configuration`：設定用於發佈函數的組態。
+ `package-type`：將部署套件類型設定為容器映像或 .zip 檔案封存。
+ `function-memory-size`：設定函數的記憶體配置，以 MB 為單位。
+ `function-timeout`：逾時是 Lambda 函數可以執行的秒數上限。您可以以 1 秒的增量調整，直到最大值達到 15 分鐘。
+ `docker-host-build-output-dir`：設定與 中指示相關的建置程序輸出目錄`Dockerfile`。
+ `image-command`： 是您方法的完整名稱，也就是您希望 Lambda 函數執行的程式碼。語法為：`{Assembly}::{Namespace}.{ClassName}::{MethodName}`。如需詳細資訊，請參閱[處理常式簽章](https://docs.aws.amazon.com/lambda/latest/dg/csharp-handler.html#csharp-handler-signatures)。在此設定會稍後在 Visual Studio 的發佈精靈中`image-command`預先填入此值。

以下是 .NET 8 （容器映像） 藍圖所建立 aws-lambda-tools-defaults.json 的範例。

```
{
  "Information": [
    "This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.",
    "To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.",
    "dotnet lambda help",
    "All the command line options for the Lambda command can be specified in this file."
  ],
  "profile": "default",
  "region": "us-west-2",
  "configuration": "Release",
  "package-type": "image",
  "function-memory-size": 512,
  "function-timeout": 30,
  "image-command": "AWSLambdaDocker::AWSLambdaDocker.Function::FunctionHandler",
  "docker-host-build-output-dir": "./bin/Release/lambda-publish"
}
```

### 3. Function.cs
<a name="w2aac15c45c16c17c21"></a>

`Function.cs` 檔案會定義要公開為 Lambda 函數的 c\$1 函數。`FunctionHandler` 是在 Lambda 函數執行時執行的 Lambda 功能。在此專案中， `ToUpper()` 會`FunctionHandler`呼叫輸入文字。

## 發佈至 Lambda
<a name="publish-to-lam"></a>

建置程序產生的 Docker 映像會上傳至 Amazon Elastic Container Registry (Amazon ECR)。Amazon ECR 是全受管的 Docker 容器登錄檔，可用來存放、管理和部署 Docker 容器映像。Amazon ECR 託管映像，然後 Lambda 會參考該映像，以在調用時提供程式設計的 Lambda 功能。

**將您的函數發佈至 Lambda**

1. 從**解決方案總管**開啟專案的內容選單 （按一下滑鼠右鍵），然後選擇**發佈至 AWS Lambda**以開啟**上傳 Lambda 函數**視窗。

1. 從**上傳 Lambda 函數**頁面，執行下列動作：  
![\[將影像型 Lambda 函數發佈至 的上傳畫面 AWS\]](http://docs.aws.amazon.com/zh_tw/toolkit-for-visual-studio/latest/user-guide/images/lambda-upload-docker-03192024.png)

   1.  對於**套件類型**， **Image** 已自動選取為**套件類型**，因為發佈精靈在您的專案`Dockerfile`中偵測到 。

   1. 在**函數名稱**中，輸入 Lambda 執行個體的顯示名稱。此名稱是 Visual Studio 中 AWS Explorer 和 中顯示的參考名稱 AWS 管理主控台。

   1.  在**描述**中，輸入要在 中與您的執行個體一起顯示的文字 AWS 管理主控台。

   1. 在 **Image Command** 中，輸入您要 Lambda 函數執行之方法的完整路徑： **AWSLambdaDocker::AWSLambdaDocker.Function::FunctionHandler**
**注意**  
此處輸入的任何方法名稱都會覆寫 Dockerfile 內的任何 CMD 指令。只有在您的 `Dockerfile`包含 `CMD`以指示如何啟動 Lambda 函數時，輸入 **Image Command** 才為選用。

   1. 在**映像儲存庫**中，輸入新的或現有 Amazon Elastic Container Registry 的名稱。建置程序建立的 Docker 映像會上傳至此登錄檔。正在發佈的 Lambda 定義將參考該 Amazon ECR 映像。

   1.  在**映像標籤**中，輸入 Docker 標籤以與儲存庫中的映像建立關聯。

   1. 選擇**下一步**。

1. 在**進階函數詳細資訊**頁面上，在**角色名稱**中選擇與您的帳戶相關聯的角色。角色用於為 函數中程式碼所做的任何 Amazon Web Services 呼叫提供臨時登入資料。如果您沒有角色，**請根據 AWS 受管政策選擇新角色**，然後選擇 **AWSLambdaBasicExecutionRole**。
**注意**  
您的帳戶必須具有執行 IAM ListPolicies 動作的許可，否則**角色名稱**清單將為空白。

1. 選擇**上傳**以開始上傳和發佈程序。
**注意**  
**上傳函數**頁面會在函數上傳時顯示。發佈程序接著會根據組態參數建置映像、視需要建立 Amazon ECR 儲存庫、將映像上傳至儲存庫，以及使用該映像建立參考該儲存庫的 Lambda。  
上傳函數後，**函數**頁面會開啟並顯示新的 Lambda 函數組態。

1. 若要手動叫用 Lambda 函數，請在**測試函數**索引標籤上，`hello image based lambda`在請求任意文字輸入欄位中輸入 ，然後選擇**叫用**。轉換為大寫的文字將顯示在**回應**中。  
![\[已發佈函數檢視頁面的測試函數索引標籤具有按鈕，可手動叫用 Lambda 方法。\]](http://docs.aws.amazon.com/zh_tw/toolkit-for-visual-studio/latest/user-guide/images/lambda-invoke-docker-03192024.png)

1. 若要檢視儲存庫，請在 **AWS Explorer** 的 **Amazon Elastic Container Service** 下，選擇**儲存庫**。

   您可以隨時在節點下的 **AWS Explorer** 中按兩下已部署的執行個體，以重新開啟 **函數：**檢視**AWS Lambda**。
**注意**  
如果您的 AWS Explorer 視窗未開啟，您可以透過**檢視** -> **AWS Explorer** 將其停駐

1. 請注意組態索引標籤上的其他特定影像**組態**選項。此標籤提供覆寫 Dockerfile `ENTRYPOINT`中`WORKDIR`可能已指定的 `CMD`、 和 的方法。**描述**是您在上傳/發佈期間輸入的描述 （如果有的話）。

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

如果您不會繼續使用此範例繼續開發，請記得刪除已部署的 函數和 ECR 映像，這樣您就不會因帳戶中未使用的資源而收到費用。
+ 在節點下 **AWS Explorer** 中部署的執行個體上按一下滑鼠右鍵，即可刪除函數**AWS Lambda**。
+ 您可以在 **Amazon Elastic Container Service** -> 儲存庫下的 **AWS Explorer** 中刪除**儲存庫**。

## 後續步驟
<a name="next-steps-lam"></a>

如需有關建立和測試 Lambda 映像的資訊，請參閱[搭配使用容器映像與 Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-images.html)。

如需容器映像部署、許可和覆寫組態設定的相關資訊，請參閱[設定 函數](https://docs.aws.amazon.com/lambda/latest/dg/configuration-images.html)。

# 教學課程：使用 建置和測試無伺服器應用程式 AWS Lambda
<a name="lambda-build-test-severless-app"></a>

您可以使用 AWS Toolkit for Visual Studio 範本建置無伺服器 Lambda 應用程式。Lambda 專案範本包含一個用於**AWS 無伺服器應用程式的**範本，這是[AWS 無伺服器應用程式模型 (AWS SAM)](https://github.com/awslabs/serverless-application-model) 的 AWS Toolkit for Visual Studio 實作。使用此專案類型，您可以開發一組 AWS Lambda 函數，並使用 AWS CloudFormation 來協調部署，並使用任何必要的 AWS 資源將其部署為整個應用程式。

如需設定 的先決條件和資訊 AWS Toolkit for Visual Studio，請參閱 [AWS Toolkit for Visual Studio 中的使用 AWS Lambda 範本](lambda-index.md)。

**Topics**
+ [建立新的無 AWS 伺服器應用程式專案](#create-a-new-aws-serverless-application-project)
+ [檢閱無伺服器應用程式檔案](#examine-the-files-in-the-serverless-application)
+ [部署無伺服器應用程式](#deploy-the-serverless-application)
+ [測試無伺服器應用程式](#test-the-serverless-application)

## 建立新的無 AWS 伺服器應用程式專案
<a name="create-a-new-aws-serverless-application-project"></a>

AWS 無伺服器應用程式專案使用無伺服器 CloudFormation 範本建立 Lambda 函數。 CloudFormation 範本可讓您定義其他資源，例如資料庫、新增 IAM 角色，以及一次部署多個函數。這與 AWS 專注於開發和部署單一 Lambda 函數的 Lambda 專案不同。

下列程序說明如何建立新的 AWS 無伺服器應用程式專案。

1. 從 Visual Studio 展開**檔案**功能表，展開**新增**，然後選擇**專案**。

1. 在**新增專案**對話方塊中，確保**語言**、**平台**和**專案類型**下拉式方塊設定為「全部...」，然後在**aws lambda****搜尋**欄位中輸入 。

1. 選取 **AWS Serverless Application with Tests (.NET Core - C\$1)** 範本。
**注意**  
**AWS Serverless Application with Tests (.NET Core - C\$1)** 範本可能不會填入結果頂端。

1. 按一下**下一步**以開啟**設定您的新專案**對話方塊。

1. 從**設定您的新專案**對話方塊中，輸入 **ServerlessPowertools** 做為**名稱**，然後根據您的偏好設定完成其餘欄位。選擇**建立**按鈕以繼續至**選取藍圖**對話方塊。

1. 從**選取藍圖**對話方塊中選擇藍圖**的 Powertools AWS Lambda**，然後選擇**完成**以建立 Visual Studio 專案。

## 檢閱無伺服器應用程式檔案
<a name="examine-the-files-in-the-serverless-application"></a>

以下各節詳細說明為您的專案建立的三個無伺服器應用程式檔案：

1. serverless.template

1. Functions.cs

1. aws-lambda-tools-defaults.json

### 1. serverless.template
<a name="blogcs"></a>

`serverless.template` 檔案是宣告無伺服器函數和其他 AWS 資源的 AWS CloudFormation 範本。此專案隨附的 檔案包含單一 Lambda 函數的宣告，該函數將透過 Amazon API Gateway 公開為 `HTTP *Get*`操作。您可以編輯此範本來自訂現有的函數，或新增應用程式所需的更多函數和其他資源。

以下是 `serverless.template` 檔案的範例：

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::Serverless-2016-10-31",
  "Description": "An AWS Serverless Application.",
  "Resources": {
    "Get": {
      "Type": "AWS::Serverless::Function",
      "Properties": {
         "Architectures": [
            "x86_64"
            ],
         "Handler": "ServerlessPowertools::ServerlessPowertools.Functions::Get",
         "Runtime": "dotnet8",
         "CodeUri": "",
         "MemorySize": 512,
         "Timeout": 30,
         "Role": null,
         "Policies": [
            "AWSLambdaBasicExecutionRole"
            ],
         "Environment": {
            "Variables": {
               "POWERTOOLS_SERVICE_NAME": "ServerlessGreeting",
               "POWERTOOLS_LOG_LEVEL": "Info",
               "POWERTOOLS_LOGGER_CASE": "PascalCase",
               "POWERTOOLS_TRACER_CAPTURE_RESPONSE": true,
               "POWERTOOLS_TRACER_CAPTURE_ERROR": true,
               "POWERTOOLS_METRICS_NAMESPACE": "ServerlessGreeting"
               }
            },
         "Events": {
            "RootGet": {
               "Type": "Api",
               "Properties": {
                  "Path": "/",
                  "Method": "GET"
                  }
               }
            }
         }
      }
   },
  "Outputs": {
    "ApiURL": {
      "Description": "API endpoint URL for Prod environment",
      "Value": {
        "Fn::Sub": "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/"
      }
    }
  }
}
```

請注意，許多`...AWS:: Serverless::Function...`宣告欄位與 Lambda 專案部署的欄位類似。Powertools 記錄、指標和追蹤是透過下列環境變數設定：
+ POWERTOOLS\$1SERVICE\$1NAME=ServerlessGreeting
+ POWERTOOLS\$1LOG\$1LEVEL=Info
+ POWERTOOLS\$1LOGGER\$1CASE=PascalCase
+ POWERTOOLS\$1TRACER\$1CAPTURE\$1RESPONSE=true
+ POWERTOOLS\$1TRACER\$1CAPTURE\$1ERROR=true
+ POWERTOOLS\$1METRICS\$1NAMESPACE=ServerlessGreeting

如需環境變數的定義和其他詳細資訊，請參閱[AWS Lambda 參考資料網站的 Powertools](https://awslabs.github.io/aws-lambda-powertools-dotnet/references/)。

### 2. Functions.cs
<a name="functionscs"></a>

`Functions.cs` 是一種類別檔案，其中包含對應至範本檔案中宣告之單一函數的 C\$1 方法。Lambda 函數會回應來自 API Gateway `HTTP Get`的方法。以下是 `Functions.cs` 檔案的範例：

```
public class Functions
{
    [Logging(LogEvent = true, CorrelationIdPath = CorrelationIdPaths.ApiGatewayRest)]
    [Metrics(CaptureColdStart = true)]
    [Tracing(CaptureMode = TracingCaptureMode.ResponseAndError)]
    public APIGatewayProxyResponse Get(APIGatewayProxyRequest request, ILambdaContext context)
    {
        Logger.LogInformation("Get Request");

        var greeting = GetGreeting();

        var response = new APIGatewayProxyResponse
        {
            StatusCode = (int)HttpStatusCode.OK,
            Body = greeting,
            Headers = new Dictionary (string, string) { { "Content-Type", "text/plain" } }
        };

        return response;
    }

    [Tracing(SegmentName = "GetGreeting Method")]
    private static string GetGreeting()
    {
        Metrics.AddMetric("GetGreeting_Invocations", 1, MetricUnit.Count);

        return "Hello Powertools for AWS Lambda (.NET)";
    }
}
```

### 3. aws-lambda-tools-defaults.json
<a name="functionscs"></a>

`aws-lambda-tools-defaults.json` 提供 Visual Studio 內 AWS 部署精靈的預設值，以及新增至 .NET Core CLI 的 AWS Lambda 命令。以下是此專案隨附的 `aws-lambda-tools-defaults.json` 檔案範例：

```
{
  "profile": "Default",
  "region": "us-east-1",
  "configuration": "Release",
  "s3-prefix": "ServerlessPowertools/",
  "template": "serverless.template",
  "template-parameters": ""
}
```

## 部署無伺服器應用程式
<a name="deploy-the-serverless-application"></a>

若要部署無伺服器應用程式，請完成下列步驟

1. 從**解決方案總管**開啟專案的內容選單 （按一下滑鼠右鍵），然後選擇**發佈至 AWS Lambda** 以開啟**發佈無 AWS 伺服器應用程式**對話方塊。

1. 從**發佈無 AWS 伺服器應用程式**對話方塊中，在 CloudFormation 堆疊名稱欄位中輸入**堆疊容器的名稱**。

1. 在 **S3 儲存貯**體欄位中，選擇應用程式套件將上傳到的 Amazon S3 儲存貯體，或選擇**新增...**按鈕，然後輸入新 Amazon S3 儲存貯體的名稱。然後選擇**發佈**以發佈以部署您的應用程式。
**注意**  
您的 CloudFormation 堆疊和 Amazon S3 儲存貯體必須存在於相同的 AWS 區域中。您專案的其餘設定會在 `serverless.template` 檔案中定義。  
![\[發佈無 AWS 伺服器應用程式對話方塊的影像。\]](http://docs.aws.amazon.com/zh_tw/toolkit-for-visual-studio/latest/user-guide/images/lambda-upload-serverless-03192024.png)

1. 當部署完成時，**堆疊**檢視視窗會在發佈程序期間開啟，**狀態**欄位會顯示：`CREATE_COMPLETE`。  
![\[視覺化工作室中部署堆疊檢視視窗的影像。\]](http://docs.aws.amazon.com/zh_tw/toolkit-for-visual-studio/latest/user-guide/images/lambda-upload-stackview-03192024.png)

## 測試無伺服器應用程式
<a name="test-the-serverless-application"></a>

當堆疊建立完成時，您可以使用**AWS 無伺服器 URL** 檢視您的應用程式。如果您已完成本教學課程，但未新增任何其他函數或參數，存取無 AWS 伺服器 URL 會在 Web 瀏覽器中顯示下列片語：`Hello Powertools for AWS Lambda (.NET)`。

# 教學課程：建立 Amazon Rekognition Lambda 應用程式
<a name="lambda-rekognition-example"></a>

本教學課程說明如何建立使用 Amazon Rekognition 以偵測到的標籤標記 Amazon S3 物件的 Lambda 應用程式。

如需設定 的先決條件和資訊 AWS Toolkit for Visual Studio，請參閱 [AWS Toolkit for Visual Studio 中的使用 AWS Lambda 範本](lambda-index.md)。

## 建立 Visual Studio .NET Core Lambda Image Rekognition 專案
<a name="create-a-visual-studio-net-core-lam-image-rekognition-project"></a>

下列程序說明如何從 建立 Amazon Rekognition Lambda 應用程式 AWS Toolkit for Visual Studio。

**注意**  
建立時，您的應用程式具有兩個專案的解決方案：包含要部署至 Lambda 之 Lambda 函數程式碼的來源專案，以及使用 xUnit 在本機測試函數的測試專案。  
有時 Visual Studio 找不到專案的所有 NuGet 參考。這是因為藍圖需要必須從 NuGet 擷取的相依性。建立新專案時，Visual Studio 只會提取本機參考，而不是從 NuGet 提取遠端參考。若要修正 NuGet 錯誤：在參考上按一下滑鼠右鍵，然後選擇**還原套件**。

1. 從 Visual Studio 展開**檔案**功能表，展開**新增**，然後選擇**專案**。

1. 在**新增專案**對話方塊中，確保**語言**、**平台**和**專案類型**下拉式方塊設定為「全部...」，然後在**aws lambda****搜尋**欄位中輸入 。

1. 選取**AWS Lambda 含測試 (.NET Core - C\$1)** 範本的 。

1. 按一下**下一步**以開啟**設定您的新專案**對話方塊。

1. 從**設定您的新專案**對話方塊中，輸入**名稱**的「ImageRekognition」，然後根據您的偏好設定完成其餘欄位。選擇**建立**按鈕以繼續至**選取藍圖**對話方塊。

1. 從**選取藍圖**對話方塊中，選擇**偵測影像標籤**藍圖，然後選擇**完成**以建立 Visual Studio 專案。
**注意**  
此藍圖提供用於接聽 Amazon S3 事件的程式碼，並使用 Amazon Rekognition 偵測標籤，並將其新增至 S3 物件做為標籤。

## 檢閱專案檔案
<a name="examine-the-files"></a>

下列各節會檢查這些專案檔案：

1. `Function.cs`

1. `aws-lambda-tools-defaults.json`

### 1. Function.cs
<a name="functioncs"></a>

在`Function.cs`檔案中，程式碼的第一個區段是位於檔案頂端的組件屬性。根據預設，Lambda 只接受輸入參數和傳回類型的 `System.IO.Stream`。您必須註冊序列化程式，才能針對輸入參數和傳回類型使用類型類別。組件屬性會註冊 Lambda JSON 序列化程式，其會使用 `Newtonsoft.Json`將串流轉換為輸入類別。您可以在組件或方法層級設定序列化程式。

以下是組件屬性的範例：

```
// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
```

類別有兩個建構函數。第一個是 Lambda 調用函數時使用的預設建構函數。此建構函數會建立 Amazon S3 和 Amazon Rekognition 服務用戶端。建構函數也會從您在部署這些用戶端時指派給函數的 IAM 角色擷取這些用戶端的 AWS 登入資料。用戶端 AWS 的區域設定為 Lambda 函數執行所在的區域。在此藍圖中，只有在 Amazon Rekognition 服務對標籤具有最低的可信度時，才想要將標籤新增至 Amazon S3 物件。 Amazon Rekognition 此建構函數會檢查環境變數`MinConfidence`，以判斷可接受的可信度等級。您可以在部署 Lambda 函數時設定此環境變數。

以下是 中第一類建構函數的範例`Function.cs`：

```
public Function()
{
    this.S3Client = new AmazonS3Client();
    this.RekognitionClient = new AmazonRekognitionClient();

    var environmentMinConfidence = System.Environment.GetEnvironmentVariable(MIN_CONFIDENCE_ENVIRONMENT_VARIABLE_NAME);
    if(!string.IsNullOrWhiteSpace(environmentMinConfidence))
    {
        float value;
        if(float.TryParse(environmentMinConfidence, out value))
        {
            this.MinConfidence = value;
            Console.WriteLine($"Setting minimum confidence to {this.MinConfidence}");
        }
        else
        {
            Console.WriteLine($"Failed to parse value {environmentMinConfidence} for minimum confidence. Reverting back to default of {this.MinConfidence}");
        }
    }
    else
    {
        Console.WriteLine($"Using default minimum confidence of {this.MinConfidence}");
    }
}
```

下列範例示範如何利用第二個建構函數進行測試。測試專案會設定自己的 S3 和 Rekognition 用戶端，並將其傳遞至：

```
public Function(IAmazonS3 s3Client, IAmazonRekognition rekognitionClient, float minConfidence)
{
    this.S3Client = s3Client;
    this.RekognitionClient = rekognitionClient;
    this.MinConfidence = minConfidence;
}
```

以下是 `Function.cs` 檔案內 `FunctionHandler`方法的範例。

```
public async Task FunctionHandler(S3Event input, ILambdaContext context)
{
    foreach(var record in input.Records)
    {
        if(!SupportedImageTypes.Contains(Path.GetExtension(record.S3.Object.Key)))
        {
            Console.WriteLine($"Object {record.S3.Bucket.Name}:{record.S3.Object.Key} is not a supported image type");
            continue;
        }

        Console.WriteLine($"Looking for labels in image {record.S3.Bucket.Name}:{record.S3.Object.Key}");
        var detectResponses = await this.RekognitionClient.DetectLabelsAsync(new DetectLabelsRequest
        {
            MinConfidence = MinConfidence,
            Image = new Image
            {
                S3Object = new Amazon.Rekognition.Model.S3Object
                {
                    Bucket = record.S3.Bucket.Name,
                    Name = record.S3.Object.Key
                }
            }
        });

        var tags = new List();
        foreach(var label in detectResponses.Labels)
        {
            if(tags.Count < 10)
            {
                Console.WriteLine($"\tFound Label {label.Name} with confidence {label.Confidence}");
                tags.Add(new Tag { Key = label.Name, Value = label.Confidence.ToString() });
            }
            else
            {
                Console.WriteLine($"\tSkipped label {label.Name} with confidence {label.Confidence} because maximum number of tags reached");
            }
        }

        await this.S3Client.PutObjectTaggingAsync(new PutObjectTaggingRequest
        {
            BucketName = record.S3.Bucket.Name,
            Key = record.S3.Object.Key,
            Tagging = new Tagging
            {
                TagSet = tags
            }
        });
    }
    return;
}
```

 `FunctionHandler` 是 Lambda 在建構執行個體之後呼叫 的方法。請注意，輸入參數為 類型`S3Event`，而非 `Stream`。您可以因為已註冊的 Lambda JSON 序列化程式而執行此操作。`S3Event` 包含 Amazon S3 中觸發之事件的所有資訊。函數會循環瀏覽屬於事件一部分的所有 S3 物件，並告知 Rekognition 偵測標籤。偵測到標籤後，它們會新增為 S3 物件的標籤。

**注意**  
此程式碼包含對 的呼叫`Console.WriteLine()`。當函數在 Lambda 中執行時，所有`Console.WriteLine()`重新導向至 Amazon CloudWatch Logs 的呼叫。

### 2. aws-lambda-tools-defaults.json
<a name="toolsdefaults"></a>

`aws-lambda-tools-defaults.json` 檔案包含藍圖設定為預先填入部署精靈中部分欄位的預設值。它也有助於設定命令列選項以與 .NET Core CLI 整合。

若要存取 .NET Core CLI 整合，請導覽至函數的專案目錄並輸入 **dotnet lambda help**。

**注意**  
函數處理常式指出 Lambda 呼叫 以回應調用函數的方法。此欄位的格式為：`<assembly-name>::<full-type-name>::<method-name>`。命名空間必須包含在類型名稱中。

## 部署 函數
<a name="deploy-the-function"></a>

下列程序說明如何部署 Lambda 函數。

1. 從**解決方案總管**中，在 Lambda 專案上按一下滑鼠右鍵，然後選擇**發佈至 AWS Lambda** 以開啟**上傳至 AWS Lambda**視窗。
**注意**  
預設值會從 `aws-lambda-tools-defaults.json` 檔案擷取。

1. 從**上傳到 AWS Lambda**視窗中，在**函數名稱**欄位中輸入名稱，然後選擇**下一步**按鈕以進入**進階函數詳細資訊**視窗。
**注意**  
此範例使用**函數名稱** **ImageRekognition**。  
![\[AWS Lambda function upload interface with package type, runtime, and configuration options.\]](http://docs.aws.amazon.com/zh_tw/toolkit-for-visual-studio/latest/user-guide/images/lambda-upload-imgrek-03192024.png)

1. 從**進階函數詳細資訊**視窗中，選取授予程式碼存取 Amazon S3 和 Amazon Rekognition 資源許可的 IAM 角色。
**注意**  
如果您遵循此範例，請選取`AWSLambda_FullAccess`角色。

1. 將環境變數`MinConfidence`設定為 60，然後選擇**上傳**以啟動部署程序。當**函數**檢視顯示在 **AWS Explorer** 中時，發佈程序即完成。  
![\[AWS Lambda function configuration interface showing permissions, execution, and environment settings.\]](http://docs.aws.amazon.com/zh_tw/toolkit-for-visual-studio/latest/user-guide/images/lambda-upload-imgrek-advanced-03192024.png)

1. 成功部署後，請導覽至事件**來源**索引標籤，設定 Amazon S3 將其事件傳送至您的新函數。

1. 從**事件來源**索引標籤中，選擇**新增**按鈕，然後選取要與您的 Lambda 函數連線的 Amazon S3 儲存貯體。
**注意**  
儲存貯體必須與 Lambda 函數位於相同的 AWS 區域。

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

現在已部署 函數，並將 S3 儲存貯體設定為其事件來源，請從您選取的儲存貯體的 **AWS Explorer** 開啟 S3 儲存貯體瀏覽器。然後上傳一些影像。

上傳完成時，您可以查看函數檢視中的日誌，以確認函數執行。或者，在儲存貯體瀏覽器中的映像上按一下滑鼠右鍵，然後選擇**屬性**。在**標籤**索引標籤上，您可以檢視套用至物件的標籤。

![\[Properties window showing metadata tags for an image file in a cloud storage bucket.\]](http://docs.aws.amazon.com/zh_tw/toolkit-for-visual-studio/latest/user-guide/images/lambda-object-properties.png)


# 教學課程：搭配 使用 Amazon Logging Framework AWS Lambda 來建立應用程式日誌
<a name="cw-log-frameworks"></a>

您可以使用 Amazon CloudWatch Logs 來監控、存放和存取應用程式的日誌。若要取得 CloudWatch Logs 的日誌資料，請使用 AWS SDK 或安裝 CloudWatch Logs 代理程式來監控特定日誌資料夾。CloudWatch Logs 與數個熱門的 .NET 記錄架構整合，可簡化工作流程。

若要開始使用 CloudWatch Logs 和 .NET 記錄架構，請將適當的 NuGet 套件和 CloudWatch Logs 輸出來源新增至您的應用程式，然後像平常一樣使用您的記錄程式庫。這可讓您的應用程式使用 .NET 架構記錄訊息，將訊息傳送到 CloudWatch Logs，並在 CloudWatch Logs 主控台中顯示應用程式的日誌訊息。您也可以根據應用程式的日誌訊息，從 CloudWatch Logs 主控台設定指標和警示。

支援的 .NET 記錄架構包括：
+ **NLog**：若要檢視，請參閱 [nuget.org NLog 套件](https://www.nuget.org/packages/AWS.Logger.NLog)。
+ **Log4net**：若要檢視，請參閱 [nuget.org Log4net 套件](https://www.nuget.org/packages/AWS.Logger.NLog)。
+ **ASP.NET Core 記錄架構**：若要檢視，請參閱 [nuget.org ASP.NET Core 記錄架構套件](https://www.nuget.org/packages/AWS.Logger.AspNetCore/)。

以下是 `NLog.config` 檔案的範例，可透過將 `AWS.Logger.NLog` NuGet 套件和 AWS 目標新增至 ，同時啟用 CloudWatch Logs 和 主控台做為日誌訊息的輸出`NLog.config`。

```
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      throwExceptions="true">
  <targets>
    <target name="aws" type="AWSTarget" logGroup="NLog.ConfigExample" region="us-east-1"/>
    <target name="logfile" xsi:type="Console" layout="${callsite} ${message}" />
  </targets>
  <rules>
    <logger name="*" minlevel="Info" writeTo="logfile,aws" />
  </rules>
</nlog>
```



記錄外掛程式全都建置在 之上， 適用於 .NET 的 AWS SDK 並在類似於 SDK 的程序中驗證您的 AWS 登入資料。下列範例詳細說明記錄外掛程式登入資料存取 CloudWatch Logs 所需的許可：

**注意**  
 AWS .NET 記錄外掛程式是開放原始碼專案。如需其他資訊、範例和指示，請參閱 [AWS 記錄 .NET GitHub ](https://github.com/aws/aws-logging-dotnet)儲存庫中的[範例](https://github.com/aws/aws-logging-dotnet/tree/master/samples)和[指示](https://github.com/aws/aws-logging-dotnet/blob/master/README.md)主題。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogGroups"
      ],
      "Resource": [
        "arn:aws:logs:*:*:*"
      ]
    }
  ]
}
```

------