模組 6:實作實驗室:建立和部署 Lambda 函數
實作實驗室
實驗室目標
在這些實驗室中,您將把在本課程中學到的知識付諸實踐
您將建立、部署和調用各種 NET 6/7 Lambda 函數。
本模組有 3 個實驗室:
實驗室 1:在 Arm64 上執行的 .NET 6 Web 應用程式
實驗室 2:在電腦上從 C# 程式調用 Lambda 函數
實驗室 3:從其他位置調用一個 Lambda 函數
先決條件
您有 AWS 帳戶。
您有一個已附加 AdministratorAccess 政策的 AWS 用戶,如需瞭解詳情,請參閱模組 3 中的「許可權說明」部分。/p>
您已安裝 .NET 6 SDK。
您已安裝適用於 .NET CLI 的 AWS 擴充功能 (dotnet lambda…)。
您已安裝 AWS Lambda for .NET Core 範本。
您已安裝 PowerShell。如果您需要為 Window/Mac/Linux 安裝 PowerShell,請參閱 https://github.com/PowerShell/PowerShell。
您可以在模組 2 中找到有關上述工具的更多資訊。
您有適用於 CloudFormation 堆疊的 S3 儲存貯體。如果您沒有,請按照以下指示進行操作。
完成時間
45 分鐘
實驗室 1:在 Arm64 上執行的 .NET 6 Web 應用程式
第 1 步:建立專案
1.建立無伺服器 .NET 專案
dotnet new serverless.AspNetCoreWebApp -n AspNetCoreWebApp
第 2 步:對程式碼進行一些修改
您可以將 using 陳述式和命名空間保持原樣,但將 IndexModel 類替換為以下內容:
public class IndexModel : PageModel
{
public string? Architecture { get; set; }
public string? DotnetVersion { get; set; }
public void OnGet()
{
Architecture = System.Runtime.InteropServices.RuntimeInformation.ProcessArchitecture.ToString();
DotnetVersion = Environment.Version.ToString();
}
}
2.更新 Index.cshtml
將檔中向下直到 </h2> 的內容替換為以下內容:
@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
}
<div class="text-center">
<h1 class="display-4">Welcome to .NET Lambda functions on AWS!</h1>
<h2>Your application is using .NET <code>@Model.DotnetVersion</code>, <code>@Model.Architecture</code>.</h2>
</div>
執行這些變更後,您將能夠查看正在執行的 .NET 版本,以及您正在使用的處理器的類型
第 3 步:配置處理器架構
開啟 serverless.template 文件。
找到「Handler」鍵,然後在下一行新增:
"Architectures": ["arm64"],
"AspNetCoreFunction": {
"Type": "AWS::Serverless::Function",
"Properties": {
"Handler": "AspNetCoreWebApp::AspNetCoreWebApp.LambdaEntryPoint::FunctionHandlerAsync",
"Architectures": ["arm64"],
第 4 步:部署函數
dotnet lambda deploy-serverless --stack-name AspNetCoreWebApp --s3-bucket your-unique-bucket-name1234
您將看到部署的每個步驟在進行和完成時的輸出。
8/9/2022 1:45 PM AspNetCoreFunctionProxyResourcePermissionProd CREATE_COMPLETE
8/9/2022 1:45 PM AspNetCoreWebApp CREATE_COMPLETE
Stack finished updating with status: CREATE_COMPLETE
Output Name Value
------------------------------ --------------------------------------------------
ApiURL https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/Prod/
第 5 步:清理
dotnet lambda delete-serverless --stack-name AspNetCoreWebApp
實驗室 2:在電腦上從 C# 程式調用 Lambda 函數
第 4 步:建立 Lambda 函數
在此步驟中,您將建立一個空白的 Lambda 專案。
1.建立專案
如果您仍位於為上一個實驗室建立的目錄中,請從中移出,轉到一個乾淨的目錄。透過命令列建立新的 Lambda 函數:
dotnet new lambda.EmptyFunction -n GetS3Buckets
第 2 步:程式碼變更
在此步驟中,您將修改生成的專案程式碼。
1.新增套件
變更 GetS3Buckets\src\ GetS3Buckets 資料夾,並將 AWS SDK S3 套件新增到專案:
cd GetS3Buckets\src\ GetS3Buckets
dotnet add package AWSSDK.S3
2.更新 Function.cs
在 IDE 中開啟 Function.cs,然後將程式碼替換為以下內容:
using Amazon.Lambda.Core;
using Amazon.S3;
using Amazon.S3.Model;
// 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))]
namespace GetS3Buckets;
public class Function
{
public async Task<IEnumerable<string>> FunctionHandler(ILambdaContext context)
{
var s3Client = new AmazonS3Client();
ListBucketsRequest listBucketsRequest = new ListBucketsRequest();
ListBucketsResponse listBucketsResponse = await s3Client.ListBucketsAsync(listBucketsRequest);
var bucketNames = listBucketsResponse.Buckets.Select(b => b.BucketName);
return bucketNames;
}
}
第 3 步:部署函數
在此步驟中,您將部署並測試您的 Lambda 函數。
1.將函數部署到 AWS
使用以下程式碼將函數部署到 AWS:
dotnet lambda deploy-function GetS3Buckets
當系統要求您選擇角色時,請選擇用於建立新角色的選項。使用名稱 GetS3BucketsRole 作為角色名稱。
當系統要求您附加政策時,請選擇針對 AWSLambdaBasicExecutionRole 的選項,在我的清單中,該選項在第 6 位。
第 4 步:新增 ListAllMyBuckets 許可權
在此步驟中,您將新增許可權來列出 S3 儲存貯體。
1.建立 IAM 政策
您附加到該角色的政策沒有必要許可權,無法列出 S3 儲存貯體。
建立一個名為 S3ListAllMyBucketsPolicy.json 的新文件。
將以下內容貼至該檔案:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
}
]
}
2.為角色新增政策
將政策新增到 GetS3BucketsRole:。
aws iam put-role-policy --role-name GetS3BucketsRole --policy-name ListAllMyBuckets --policy-document file://S3ListAllMyBucketsPolicy.json
請稍等片刻,讓許可權得以應用。
第 5 步:從命令列調用 Lambda 函數
在此步驟中,您將部署並測試您的 Lambda 函數。
1.從命令列調用函數
在建立 C# 程式以調用函數之前,請先嘗試從命令列調用它:
dotnet lambda invoke-function --function-name GetS3Buckets
您應該會看到輸出中列出了您的所有儲存貯體。
這會驗證 Lambda 函數是否按預期執行。
第 6 步:從命令列調用 Lambda 函數
在此步驟中,您將建立用於調用 Lambda 函數的 C# 程式。
1.建立控制台應用程式
使用以下程式碼建立 .NET 控制台應用程式:
dotnet new console -n GetS3BucketsCallFromLocal
2.新增 AWSSDK.Lambda 套件
變更為 GetS3BucketsCallFromLocal 資料夾。
cd GetS3BucketsCallFromLocal
新增 AWS SDK Lambda 套件,以便調用 Lambda 函數:
dotnet add package AWSSDK.Lambda
3.更新 Program.cs
開啟 Program.cs 檔並將其替換為以下內容:
using System.Text.Json;
using Amazon.Lambda;
using Amazon.Lambda.Model;
AmazonLambdaClient client = new AmazonLambdaClient();
var request = new InvokeRequest
{
FunctionName = "GetS3Buckets"
};
var result = await client.InvokeAsync(request);
var buckets = JsonSerializer.Deserialize<IEnumerable<string>>(result.Payload);
foreach (var bucket in buckets)
{
Console.WriteLine(bucket);
}
第 7 步:試用
在此步驟中,您將測試控制台程式並調用 Lambda 函數。
1.執行控制台應用程式
從 GetS3BucketsCallFromLocal 目錄的命令列中,執行:
dotnet run
您應該會看到儲存貯體名稱列表。
第 8 步:清理
在下一個實驗室中,您會用到此函數,因此暫時不要清理。
實驗室 3:從其他位置調用一個 Lambda 函數
第 1 步:建立 GetS3Buckets 函數
完成之前的實驗室。
第 2 步:建立 Lambda 函數
在此步驟中,您將建立一個 Lambda 函數來調用 GetS3Buckets 函數。
1.建立一個空白的 Lambda 專案
從命令列執行:
dotnet new lambda.EmptyFunction -n GetS3BucketsCallFromLambdaFunction
2.變更資料夾
變更為 GetS3BucketsCallFromLambdaFunction\src\GetS3BucketsCallFromLambdaFunction 目錄。
第 3 步:更新程式碼
在此步驟中,您將更新專案程式碼。
1.新增 AWSSDK.Lambda 套件
將 AWS SDK Lambda 套件新增到專案:
dotnet add package AWSSDK.Lambda
2.更新 Function.cs
開啟 Function.cs 檔,將程式碼替換為以下內容:
using Amazon.Lambda;
using Amazon.Lambda.Core;
using Amazon.Lambda.Model;
using System.Text.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))]
namespace GetS3BucketsCallFromLambdaFunction;
public class Function
{
public async Task<IEnumerable<string>> FunctionHandler(ILambdaContext context)
{
AmazonLambdaClient client = new AmazonLambdaClient();
var request = new InvokeRequest
{
FunctionName = "GetS3Buckets",
};
var result = await client.InvokeAsync(request);
var bucketNames = JsonSerializer.Deserialize<IEnumerable<string>>(result.Payload);
return bucketNames;
}
}
在此示例中,GetS3BucketsCallFromLambdaFunction Lambda 函數正在調用 GetS3Buckets 函數並返回回應,沒有對回應做任何變更。
第 4 步:部署 GetS3BucketsCallFromLambdaFunction
在此步驟中,您要將 GetS3BucketsCallFromLambdaFunction Lambda 函數部署到 AWS。
1.部署函數
從命令列執行:
dotnet lambda deploy-function GetS3BucketsCallFromLambdaFunction
2.建立角色
為已命名的函數建立新角色
GetS3BucketsCallFromLambdaFunctionRole.
3.將政策附加到角色
將 AWSLambdaBasicExecutionRole 政策附加到角色。
第 5 步,嘗試調用 GetS3BucketsCallFromLambdaFunction
在此步驟中,您將嘗試調用函數。
1.部署函數
嘗試調用 GetS3BucketsCallFromLambdaFunctionRole:
dotnet lambda invoke-function --function-name GetS3BucketsCallFromLambdaFunction
您將會遇到類似如下的錯誤:
Payload:
{
"errorType": "AmazonLambdaException",
"errorMessage": "User: arn:aws:sts::000000000000:assumed-role/GetS3BucketsCallFromLambdaFunctionRole/GetS3BucketsCallFromLambdaFunction
is not authorized to perform: lambda:InvokeFunction on resource: arn:aws:lambda:us-east-1:000000000000:function:GetS3Buckets because no
identity-based policy allows the lambda:InvokeFunction action",
這是因為 GetS3BucketsCallFromLambdaFunction 需要有許可權才能調用 GetS3Buckets。
在下一步中,您將新增內聯政策,為 GetS3BucketsCallFromLambdaFunction 授予所需許可權
第 6 步:授權 GetS3BucketsCallFromLambdaFunction 調用 GetS3Buckets
在此步驟中,您將授權 GetS3BucketsCallFromLambdaFunction 調用 GetS3Buckets。
1.獲取 GetS3Buckets 的 ARN
在授予 GetS3BucketsCallFromLambdaFunction 調用許可權之前,您需要先獲取 GetS3Buckets 的 Amazon Resource Name (ARN)。
您可以透過幾種方式來做到這一點。第一種,使用 AWS Console。轉到 Lambda 服務,然後選擇「GetS3Buckets」函數
您可以在兩個突出顯示的區域中按一下「複製 ARN」。
要從命令列中獲取 GetS3Buckets 的 ARN,請執行:
dotnet lambda get-function-config GetS3Buckets
您將看到如下所示的輸出:
專案首頁:https://github.com/aws/aws-extensions-for-dotnet-cli
https://github.com/aws/aws-lambda-dotnet
Name: GetS3Buckets
Arn: arn:aws:lambda:us-east-1:000000000000:function:GetS3Buckets
Package Type: Zip
Runtime: dotnet6
Function Handler: GetS3Buckets::GetS3Buckets.Function::FunctionHandler
Last Modified: 2022-08-10T13:58:29.211+0000
Memory Size: 256
Ephemeral Storage Size: 512
Role: arn:aws:iam::000000000000:role/GetS3Buckets
Timeout: 30
Version: $LATEST
State: Active
Last Update Status: Successful
KMS Key ARN: (default) aws/lambda
有用資訊有很多,但您需要的資訊位於表格的第二行,即 ARN。
建立名為 InvokeGetS3Buckets.json 的檔,為其新增以下內容:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action":[
"lambda:InvokeFunction"
],
"Resource": "arn:aws:lambda:us-east-1:000000000000:function:GetS3Buckets"
}
]
}
Repl
將「Resource」替換為您從命令列或控制台使用者介面中獲取的 Lambda 函數 ARN。
2.更新許可權
執行以下命令:
aws iam put-role-policy --role-name GetS3BucketsCallFromLambdaFunctionRole
--policy-name InvokeGetS3BucketsFunction
--policy-document file://InvokeGetS3Buckets.json
在 AWS 上更新許可權可能需要幾分鐘。
第 7 步:再次調用 GetS3BucketsCallFromLambdaFunction
在此步驟中,您將再次調用函數。
1.使用 dotnet lambda invoke-function 調用函數
這一次,您能夠調用函數:
dotnet lambda invoke-function --function-name GetS3BucketsCallFromLambdaFunction
結語
在這些實驗中,您將所學知識付諸實踐。首先,您建立了一個可以全球範圍內均可存取的 Web 應用程式。然後,您部署了可以直接在電腦上從 C# 程式中調用的 Lambda 函數。之後,您在第二個實驗基礎上進行建置,您部署了另一個 Lambda 函數並從其他地方調用了一個 Lambda 函數。您還必須解決出現的許可權問題。
在這裡,您可以嘗試使用其他支援 Lambda 函數的 AWS 服務並建置更複雜的 Lambda 應用程式。