模組 1:AWS Lambda 簡介
學習模組
概觀
在本教學中,您將學習如何將 .NET 與 AWS Lambda 搭配使用。您不需要事先了解 AWS Lambda 也可學習本課程,但您應該熟悉 AWS 和 .NET。在本課程中,您將學習使用命令列、Visual Studio、Visual Studio Code 和 Rider 建立、部署、執行、測試和偵錯 .NET Lambda 函數。
在這個簡介模組中,您將了解什麼是無伺服器運算、它有哪些優勢,以及它與 AWS Lambda 的關係。隨後您會看到兩個範例,展示開始使用 .NET AWS Lambda 函數有多輕鬆。
完成時間
45 分鐘
無伺服器運算
在討論無伺服器運算之前,我們先簡單講講傳統運算。
無論規模如何,許多公司都使用本機伺服器或基於資料中心的伺服器來執行其應用程式。在這些公司需要增加伺服器時,他們只能購買、實際安裝、設定、保護和維護額外的伺服器。(在某些情況下,資料中心可能會代您進行物理安裝,但其餘工作仍然需要您負責完成。)
在所有這些工作都完成後,公司才能將其應用程式部署到這些伺服器上。對許多公司來說,這個過程都可能需要數週或數月的時間。過去,這樣的延誤增加了擴展應用程式的難度,
雲端運算簡化了這一切。公司只需幾分鐘即可啟動一個 (或多個) 伺服器執行個體。公司可以建立自己的電腦映像,並按照自己想要的方式設定虛擬機器和作業系統。這減少了伺服器啟動後所需的配置工作量,但他們仍然需要安裝補丁、安全更新和軟體更新等,從而讓伺服器保持最新狀態。
在許多情況下,這些伺服器往往是全天候執行的,儘管它們並非一直處於使用狀態。通常佈建伺服器來處理應用程式預期的峰值工作負載。但在非峰值情況下,至少有部分伺服器處於空閒狀態。雖然利用適當的擴展策略來實現精簡有助於應對此問題,但很難處理得當。
此外,伺服器的佈建和維護工作以及伺服器閒置時間都會產生成本,而這對公司沒有直接好處。
無伺服器運算是此類情景的替代方案。無需伺服器、無需維護,擴展由我們代您處理。您只需編寫和部署程式碼,基礎架構由 AWS 為您打理。
AWS 為無伺服器計算提供了兩種可選方案:AWS Fargate,適合基於容器的應用程式;AWS Lambda,適合事件驅動的應用程式。
AWS Lambda
AWS Lambda 是一項無伺服器運算服務,它能執行您的程式碼,以回應服務接收到的事件。事件可以由其他 AWS 服務產生,例如 SNS、SQS、S3、DynamoDB、API Gateway 等。
利用 API 閘道或 Lambda 函數 URL,您可以觸發 Lambda 函數的執行,以回應 HTTP 請求。您還可以直接調用 Lambda 函數,雖然這也會視為一個事件。
您無需佈建任何基礎架構即可使用 AWS Lambda。AWS 還負責自動擴展來滿足應用程式的需求,無論是每天執行幾次,還是每秒執行數萬次,它都能處理得當。由 AWS 管理的 Lambda 基礎架構具有高可用性和容錯性的特點。
使用 Lambda 函數時,您只需為您使用的運算資源付費。未執行程式碼就不必付費。
您使用自己熟悉的 IDE 編寫 .NET 應用程式,然後在 AWS 工具 (或您選擇的 IaC) 的幫助下,將應用程式部署到 AWS Lambda。
當事件調用 Lambda 函數時,將會建立一個執行環境來執行您的初始化代碼 (構造函數等),然後執行處理該事件的程式碼。
執行完成後,執行環境在一段時間內仍可重複使用,而且這段時間並不是固定的。
如果收到另一個事件,則使用相同的執行環境,並且不會再次執行初始化程式碼。
如果沒有可用的執行環境,則建立新的執行環境,此時要再次執行初始化程式碼。
AWS Lambda 函數目前為 .NET Core 3.1 和 .NET 6 提供託管執行期系統。如果您想在其他版本的 .NET 中編寫應用程式,則可以使用 Lambda 自訂執行期系統,或者基於容器的應用程式版本。
AWS 為 Lambda 函數提供 C# 和 F# 專案範本。您可以透過命令列、Visual Studio、Visual Studio Code 和 Rider 使用這些範本。
您可以在 x86_64 和 arm64 處理器上執行 .NET Lambda 函數。無論選擇何種處理器架構,您編寫應用程式的方式都不受影響。部署到您選擇的處理器上輕而易舉,只需更改一組態參數即可。
AWS Lambda 的主要特徵
您不需要學習新的程式設計語言,而是可以運用現有 C# 和 F# 知識來編寫 Lambda 函數。
您可以將 Lambda 函數與其他 AWS 服務 (例如 SNS、SQS、S3、Step Functions 和 DynamoDB) 配合使用,以建立事件驅動的應用程式,還可以執行自訂任務,以回應來自這些服務的事件。
如果您需要編排多個正在執行的 Lambda 函數,則可以使用 AWS Step Functions。借助 Step Functions,您可以建立管理 Lambda 函數執行的狀態機。
因此無需佈建或管理基礎架構。AWS 可以為您處理好這一切。您只需要確定處理器架構,以及要分配給該函數的記憶體數量。AWS 將根據您選擇的記憶體,選擇適當的 CPU 速度、網路頻寬和磁碟片 I/O。
您的 Lambda 函數具有高可用性和容錯性,可在每個區域的多個可用區中執行。
在收到事件後的幾毫秒內,AWS Lambda 函數就會啟動,並且能快速自動擴展以匹配傳入事件的數量。
您只需按實際用量付費,計費精確到毫秒。
Lambda 提供慷慨且始終免費的方案,包括每月 1 百萬次免費請求以及每月 400000GB-秒的計算時間
如果遇到突發流量模式,Lambda 將根據需求擴展,在流量減少時,您無需為不再需要的資源付費。
Lambda 是 Compute Savings Plans 的一部分,該方案提供較為低的價格,要求是承諾在一到三年內使用一定的運算時間。
在下一節中,您將看到開始使用 AWS Lambda 有多麼輕鬆。只需幾分鐘時間,您就可以在雲端執行兩個 .NET AWS Lambda 函數
另外還有兩個示例,展示了開始使用 .NET AWS Lambda 函數有多輕鬆
預計時長:30 分鐘
請注意,您可以按照此處提供的範例執行操作,但這並非強制要求。
如果您從未使用過無伺服器技術,那麼最初可能會覺得有些膽怯,甚至难以弄清楚如何入手。
在學完這個簡短的模組後,您將在 AWS 上啟動並執行兩個 .NET Lambda 函數。
其中一個是從命令列調用的,另一個是透過公共 HTTPS 端點調用的,設置幾乎毫不費力。
您將使用命令列建立、組建和部署這兩個範例。
先決條件
1.一個 AWS 帳戶。
如果您沒有 AWS 帳戶,請參閱有關建立和啟用帳戶頁面。 創建新帳戶時,系統會自動為您啟動免費方案。免費方案提供部分免費的 AWS 服務,但每項服務的用量都有限額。在這裡進一步了解免費方案。
2.安裝和設定完畢的 AWS CLI。
如果沒有 AWS CLI,請下載並安裝。然後使用您的憑證和預設區域來設定 AWS CLI 。您預設的區域選擇將取決於您的地理位置和要使用的 AWS 服務。服務可用性因地區而異。
AWS 使用者應附加 AdministratorAccess 政策,如需了解詳情,請參閱模組 3 中的「許可權說明」部分。
3..NET 6 SDK
如果沒有安裝 .NET 6 SDK,請下載並安裝。
取得工具和範本
後續將有一個模組詳細解釋可用工具和範本,不過現在請執行以下兩條命令來開始使用:
dotnet tool install -g Amazon.Lambda.Tools
dotnet new -i Amazon.Lambda.Templates
演示 1:Lambda 函數「Hello World」
這是您可以編寫的最基本的 Lambda 函數,它需要一些輸入,然後返回回應,您只要幾分鐘時間即可啟動並執行它。
第 1 步 – 建立 .NET 專案
在命令列/終端視窗中,執行以下命令來建立新的 Lambda 函數。
dotnet new lambda.EmptyFunction -n HelloLambda
第 2 步 – 部署 Lambda 函數
轉至 HelloLambda/src/HelloLambda 目錄:
cd HelloLambda/src/HelloLambda
如果您有興趣,可以開啟這個目錄中的專案。您會看到一個名為 Function.cs 的檔案。其中包含執行您的函數的程式碼。請暫時不要更改此檔中的任何內容。
在命令列中執行以下命令,以部署您的函數:
dotnet lambda deploy-function --function-name HelloLambda
您將看到如下輸出。
AWS Toolkit for Visual Studio 不支援使用 ECR 公有登錄,也不支援為私有登錄中的新儲存庫啟用自動掃描和儲存庫加密之類的功能。如果需要這些功能,請使用 AWS 管理主控台或命令列工具 (例如 AWS CLI 和 AWS Tools for PowerShell) 建立儲存庫。
此時,可能發生的情況有兩種。
- 如果您的 AWS 帳戶中沒有角色,系統會提示您「輸入新 IAM 角色的名稱」,請按要求操作。使用 HelloLambdaRole 這個名稱。
- 如果您的 AWS 帳戶中有角色,則系統會顯示一個清單,但在底部會顯示建立新的 IAM 角色色,輸入與該角色相關聯的數字。隨後,系統將要求您「輸入新 IAM 角色的名稱」。使用 HelloLambdaRole 這個名稱。
接下來,您將看到可以為所建立的角色附加的許可權限清單。選擇 AWSLambdaBasicExecutionRole。在我的清單中,它在第 6 位。
等待幾秒鐘,此時系統會建立角色、許可權和 Lambda 函數。
第 3 步 – 調用 Lambda 函數
從命令列執行:
dotnet lambda invoke-function --function-name HelloLambda --payload "Hello World!"
在輸出中,您會看到:
您完成了! 您已經將 Lambda 函數部署到了雲端!
第 4 步:清除
使用 Lambda 函數時,只要不執行函數,您就不必付費,但若使用其他 AWS 服務,即使服務處於空閒狀態,您也可能要付費。所以最好刪除未使用的資源。
執行以下命令可刪除 Lambda 函數:
dotnet lambda delete-function --function-name HelloLambda
請注意,這並不會刪除您創建的角色,只會刪除函數。
演示 2:在 Lambda 函數中執行的 .NET API
在此演示中,您將創建一個處理 HTTPS 請求的 .NET API 應用程式。您可以使用較新的最簡 API 範本,也可以使用帶有控制器的較舊完整 API 範本,兩者的步驟是一樣的。如果您熟悉 .NET 6 頂級陳述式和 API 端點,可以考慮使用最簡範本,即 serverless.AspNetCoreMinimalAPI。如果您不熟悉頂級語句,請使用較舊的範本,即 serverless.AspNetCoreWebAPI。
第 1 步 – 建立 .NET 專案
如果您想使用最簡 API 範本,請執行以下命令:
dotnet new serverless.AspNetCoreMinimalAPI -n HelloLambdaAPI
如果您更熟悉帶有控制器的完整 API 範本,請執行以下命令:
dotnet new serverless.AspNetCoreWebAPI -n HelloLambdaAPI
第 2 步 – 建立 S3 儲存貯體
此步驟僅需執行一次。第 3 步中的命令需要 S3 儲存貯體來存儲部署相關檔案。
在建立儲存貯體時,您需要確保這個名稱在所有 AWS 帳戶 (不僅僅是您的) 和所有區域中都是唯一的。
如果您使用的是 us-east-1 區域,請執行以下命令:
aws s3api create-bucket --bucket your-unique-bucket-name1234
如果想使用不同的區域,請執行:
aws s3api create-bucket --bucket your-unique-bucket-name1234 --create-bucket-configuration LocationConstraint=REGION
如果您選擇的儲存貯體名稱已被使用,則會收到以下錯誤:
調用 CreateBucket operation 作業時出錯 (BucketAlreadyExists):請求的儲存貯體名稱不可用。儲存貯體命名空間由系統的所有使用者共享。請選取其他名稱,然後再試一次。
第 3 步 – 部署 Lambda 函數
轉至 the HelloLambdaAPI/src/HelloLambdaAPI 目錄。
在命令列中執行以下命令,以部署您的函數:
dotnet lambda deploy-serverless --stack-name HelloLambdaAPI --s3-bucket your-unique-bucket-name1234
耐心等待片刻…
您將看到一些與構建和部署過程相關的輸出,最後會有一個連結:
Output Name Value
------------------------------ --------------------------------------------------
ApiURL https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/Prod/
在瀏覽器中打開此連結。根據您選擇的專案範本,您將看到以下訊息之一:
第 4 步:清除
若要移除 Lambda 函數和相關資源,請執行以下命令:
dotnet lambda delete-serverless HelloLambdaAPI