AWS Lambda 上的 .NET 工作負載

模組 6

模組 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 步:建立專案

在此步驟中,您將建立 .NET 無伺服器專案。

1.建立無伺服器 .NET 專案

dotnet new serverless.AspNetCoreWebApp -n AspNetCoreWebApp
這將在 AspNetCoreWebApp\src\AspNetCoreWebApp 目錄中建立專案。
2.開啟專案
在您最常用的 IDE 中開啟此專案。

第 2 步:對程式碼進行一些修改

在此步驟中,您將修改生成的專案程式碼。
1.更新 Index.cshtml.cs
在 IDE 中開啟專案後,在程式碼編輯器中開啟 Pages/Index.cshtml.cs。

您可以將 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

開啟 Pages/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>
保留 <svg> 元素。

執行這些變更後,您將能夠查看正在執行的 .NET 版本,以及您正在使用的處理器的類型

第 3 步:配置處理器架構

在此步驟中,您要將處理器架構設置為 Arm64。
1.將處理器架構變更為 Arm64
再進行一項變更。

開啟 serverless.template 文件。

找到「Handler」鍵,然後在下一行新增:
"Architectures": ["arm64"],
現在,您的程式碼區塊應該如下所示:
"AspNetCoreFunction": {
  "Type": "AWS::Serverless::Function",
  "Properties": {
    "Handler": "AspNetCoreWebApp::AspNetCoreWebApp.LambdaEntryPoint::FunctionHandlerAsync",
    "Architectures": ["arm64"],
2.儲存並建置
儲存所有變更並建置應用程式,以確保您不會遇到任何編譯錯誤。

第 4 步:部署函數

在此步驟中,您將部署並測試您的 Lambda 函數。
1.將函數部署到 AWS
從命令列執行:
dotnet lambda deploy-serverless --stack-name AspNetCoreWebApp --s3-bucket your-unique-bucket-name1234
等待 AWS 部署您的 Lambda 函數。

您將看到部署的每個步驟在進行和完成時的輸出。
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/
2.建立 .NET WebAPI 專案
輸出的末尾有一個 ApiURL,請在瀏覽器中將其開啟。

第 5 步:清理

在此步驟中,您將從 AWS 中刪除無伺服器專案。
1.刪除無伺服器項目
要移除執行期間建立的所有資源,請執行以下操作:
dotnet lambda delete-serverless --stack-name AspNetCoreWebApp

實驗室 2:在電腦上從 C# 程式調用 Lambda 函數

第 4 步:建立 Lambda 函數

在此步驟中,您將建立一個空白的 Lambda 專案。

1.建立專案

如果您仍位於為上一個實驗室建立的目錄中,請從中移出,轉到一個乾淨的目錄。透過命令列建立新的 Lambda 函數:

dotnet new lambda.EmptyFunction -n GetS3Buckets
這將在 AspNetCoreWebApp\src\AspNetCoreWebApp 目錄中建立專案。

第 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 應用程式。

本頁對您是否有幫助?

技能評估