.NET-Workloads in AWS Lambda

MODUL 4

Modul 4: Funktionsweise mit anderen AWS-Services

 LERNMODUL

Bitte beachten Sie, dass Sie den hier vorgestellten Beispielen folgen können, dies aber nicht müssen.

Es gibt verschiedene Möglichkeiten, mit anderen AWS-Services zu arbeiten.

Wenn es sich bei dem Service, auf den Sie zugreifen, um eine AWS-RDS-Datenbank wie SQL Server oder Postgres handelt, verwenden Sie dieselben Bibliotheken, die Sie verwenden würden, wenn Sie die Datenbanken auf Ihrem eigenen Computer oder Rechenzentrum hosten würden. Sie benötigen eine Verbindungszeichenfolge mit Benutzername und Passwort oder eine andere Form der Authentifizierung Ihrer Wahl. Es gibt keinen Unterschied zu Ihrer täglichen Nutzung der Datenbank. Sie benötigen keine zusätzlichen Berechtigungen, um auf den Datenbankserver zuzugreifen. Die einzige Einschränkung besteht darin, dass Sie das Lambda mit der VPC verbinden müssen, wenn die Datenbank nicht öffentlich zugänglich ist (für diesen Prozess sind zusätzliche Berechtigungen erforderlich).

Wenn Ihre Lambda-Funktion S3, DynamoDB, Kinesis usw. verwendet, verwenden Sie die AWS SDKs, um mit diesen Services zu interagieren. Die Rolle, unter der Ihre Lambda-Funktion ausgeführt wird, benötigt entsprechende Berechtigungen, um mit den einzelnen Services zu interagieren. Wenn Sie beispielsweise ein Element zu einem S3-Bucket hinzufügen möchten, benötigt die Rolle die Berechtigung, in diesen Bucket zu schreiben. Wenn Sie Elemente aus einer DynamoDB-Tabelle abrufen möchten, benötigt die Rolle Berechtigungen, um aus dieser Tabelle zu lesen.

Im dritten Szenario möchten Sie, dass ein anderer Service Ihre Lambda-Funktion als Reaktion auf ein Ereignis auslöst. Beispielsweise möchten Sie Ihre Lambda-Funktion vielleicht auslösen, wenn ein neues Element zu einem bestimmten S3-Bucket hinzugefügt wird oder wenn Ereignisse in einem Kinesis-Stream eintreffen. Dazu muss die Lambda-Funktion eine „ressourcenbasierte Richtlinie“ verwenden. Diese Richtlinie erteilt anderen Services die Erlaubnis, Ihre Lambda-Funktion aufzurufen.

 Veranschlagte Zeit

30 Minuten 

Zugriff auf RDS-Datenbankserver über eine Lambda-Funktion

Das Tolle an der Nutzung bekannter Services SQL Server, Postgres und MySQL ist, dass Sie in Bezug auf Code nichts anders machen müssen, wenn Sie sie von einer Lambda-Funktion aus aufrufen. Entity Framework/ADO/NpgSql usw. funktionieren mit einer von AWS gehosteten Datenbank genauso gut wie mit einer lokalen/gerackten Datenbank. Sie rufen Sie auf gleiche Weise auf, Sie benötigen keine AWS-SDK-Bibliothek, nur müssen Sie Ihrem Projekt natürlich trotzdem die entsprechenden NuGet-Pakete hinzufügen. Davon abgesehen ist alles gleich.

Zugriff auf AWS-Services über eine Lambda-Funktion

Um auf die meisten AWS-Services zuzugreifen, müssen Sie der Lambda-Funktion die Erlaubnis erteilen, mit diesem Service zu interagieren. Dazu fügen Sie der Rolle, unter der die Lambda-Funktion ausgeführt wird, eine Richtlinie hinzu. Die Richtlinie muss der Lambda-Funktion die Erlaubnis erteilen, mit dem Service zu interagieren. Sie können die Richtlinie auf zwei Arten erstellen:
1. als Inline-Richtlinie, wo Sie sie nur mit dieser Rolle verwenden.

2. Als eigenständige Richtlinie, die Sie jeder Rolle zuordnen können. In AWS wird letztere als vom Kunden verwaltete Richtlinie bezeichnet.

Es empfiehlt sich immer, der Rolle die geringstmöglichen Berechtigungen zu geben. Im folgenden Beispiel, in dem Sie aus der DynamoDB-Tabelle lesen, müssen Sie der Lambda-Rolle zwei Berechtigungen gewähren: dynamodb:GetItem und dynamodb:DescribeTable. Sie werden diese Berechtigungen auf die eine Tabelle beschränken, an der Sie interessiert sind.

Erstellen Sie zunächst eine neue DynamoDB-Tabelle mit dem Namen „People“. Die folgenden Befehle funktionieren mit PowerShell, wenn Sie die Windows-Eingabeaufforderung verwenden, oder die Linux-Shell benötigt ein anderes Escaping für die Zeichenfolgen.

Führen Sie Folgendes aus:
aws dynamodb create-table --table-name People --attribute-definitions AttributeName=PersonId,AttributeType=N --key-schema AttributeName=PersonId,KeyType=HASH --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1
Beachten Sie das TableArn, Sie werden es gleich verwenden. Sie finden es ungefähr am Ende der Ausgabe.

Fügen Sie der Tabelle ein paar Elemente hinzu:
aws dynamodb put-item --table-name People --item '{"PersonId":{"N":"1"},"State":{"S":"MA"}, "FirstName": {"S":"Alice"}, "LastName": {"S":"Andrews"}}'
aws dynamodb put-item --table-name People --item '{"PersonId":{"N":"2"},"State":{"S":"MA"}, "FirstName": {"S":"Ben"}, "LastName": {"S":"Bradley"}}'
aws dynamodb put-item --table-name People --item '{"PersonId":{"N":"3"},"State":{"S":"MA"}, "FirstName": {"S":"Claire"}, "LastName": {"S":"Connor"}}'
Sie haben jetzt eine Tabelle mit drei Elementen.

Erstellen Sie als Nächstes eine Lambda-Funktion mit:
dotnet new lambda.EmptyFunction -n LambdaFunctionDynamoDB 
Wechseln Sie zum Verzeichnis LambdaFunctionDynamoDB /src/LambdaFunctionDynamoDB und fügen Sie das NuGet-Paket AWSSDK.DynamoDBv2 hinzu:
cd LambdaFunctionDynamoDB /src/LambdaFunctionDynamoDB 
dotnet add package AWSSDK.DynamoDBv2
Öffnen Sie dann die Datei Function.cs und ersetzen Sie den Code durch den folgenden:
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DataModel;
using Amazon.Lambda.Core;

[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace LambdaFunctionDynamoDB ;

public class Function
{
   public async Task<string> FunctionHandler(ILambdaContext lambdaContext)
 {
   AmazonDynamoDBConfig clientConfig = new AmazonDynamoDBConfig(); 
   AmazonDynamoDBClient client = new AmazonDynamoDBClient(clientConfig);
   DynamoDBContext dynamoDbContext = new DynamoDBContext(client);

   Person person = await dynamoDbContext.LoadAsync<Person>(1);

   return $"{person.FirstName} {person.LastName} lives in {person.State}";
 }
}

[DynamoDBTable("People")]
public class Person
{
    [DynamoDBHashKey]
    public int PersonId {get; set;}
    public string State {get; set;}
    public string FirstName {get; set;}
    public string LastName {get; set;}
}
Stellen Sie die Lambda-Funktion in AWS Lambda bereit, indem Sie Folgendes verwenden:
dotnet lambda deploy-function LambdaFunctionDynamoDB

Stellen Sie die Lambda-Funktion in AWS Lambda bereit, indem Sie Folgendes verwenden:

dotnet lambda deploy-function LambdaFunctionDynamoDB

Als Nächstes werden Sie gefragt: „Select IAM Role that to provide AWS credentials to your code:“ (Wählen Sie eine IAM-Rolle aus, um AWS-Anmeldeinformationen für Ihren Code bereitzustellen:). Möglicherweise wird Ihnen eine Liste der Rollen angezeigt, die Sie zuvor erstellt haben, aber am Ende der Liste befindet sich die Option „*** Create new IAM Role ***“ (*** Neue IAM-Rolle erstellen***). Geben Sie die Zahl neben dieser Option ein.

Sie sehen die Aufforderung „Enter name of the new IAM Role“ (Namen der neuen IAM-Rolle einzugeben). Geben Sie „LambdaFunctionDynamoDBRole“ ein.

Sie sehen dann die Aufforderung „Select IAM Policy to attach to the new role and grant permissions“ (IAM-Richtlinie auszuwählen, um sie an die neue Rolle anzuhängen und Berechtigungen zu gewähren), und eine Liste der Richtlinien wird angezeigt. Wählen Sie „AWSLambdaBasicExecutionRole“, das ist Nummer 6 auf meiner Liste. (Ich weiß, dass es eine Richtlinie namens AWSLambdaDynamoDBExecutionRole gibt, aber in diesem Modul sollen Sie erfahren, wie Sie die erforderlichen Berechtigungen selbst hinzufügen können).

Versuchen Sie, die Lambda-Funktion aufzurufen, indem Sie Folgendes verwenden:

dotnet lambda invoke-function LambdaFunctionDynamoDB 
Sie werden eine lange Fehlermeldung erhalten, aber ganz oben erscheint etwas, was ungefähr folgendermaßen aussieht:
 "errorMessage": "User: arn:aws:sts::YOUR_ACCOUNT_NUMBER:assumed-role/LambdaFunctionDynamoDB Role/LambdaFunctionDynamoDB  is not authorized to perform: dynamodb:DescribeTable on resource: arn:aws:dynamodb:us-east-1:YOUR_ACCOUNT_NUMBER:table/People because no identity-based policy allows the dynamodb:DescribeTable action"
Die Meldung : „... no identity-based policy allows the dynamodb:DescribeTable action“ (keine identitätsbasierte Richtlinie erlaubt die dynamoDB:DescribeTable-Aktion).

Dies bedeutet, dass die Rolle, unter der die Lambda-Funktion ausgeführt wird, nicht über die erforderliche dynamodb:DescribeTable-Berechtigung verfügt.

Um dies zu beheben, müssen Sie eine Richtlinie hinzufügen, die der Rolle die dynamodb:DescribeTable-Berechtigung gewährt. Wie oben erwähnt, können Sie eine Inline-Richtlinie (nur für diese Rolle) oder eine eigenständige Richtlinie (für alle Rollen verfügbar) hinzufügen.

Erstellen Sie eine Datei mit dem Namen DynamoDBAccessPolicy.json im Ordner LambdaFunctionDynamoDB /src/LambdaFunctionDynamoDB.

Bearbeiten Sie DynamoDBAccessPolicy, aber verwenden Sie in der Ressource Ihre Kontonummer:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeTable"
            ],
            "Resource": "arn:aws:dynamodb:us-east-1:YOUR_ACCOUNT_NUMBER:table/People"
        }
    ]
}
Führen Sie Folgendes aus:
aws iam put-role-policy --role-name LambdaFunctionDynamoDBRole --policy-name LambdaFunctionDynamoDBAccess --policy-document file://DynamoDBAccessPolicy.json
Es kann eine Weile dauern, bis die Richtlinie in Kraft tritt. Sie können ein paar Minuten warten oder die Lambda-Funktion erneut bereitstellen. Wenn Sie die Funktion erneut bereitstellen möchten, führen Sie Folgendes aus:
dotnet lambda deploy-function LambdaFunctionDynamoDB 
Nachdem die Lambda-Funktion bereitgestellt wurde, können Sie sie erneut aufrufen, indem Sie Folgendes tun:
dotnet lambda invoke-function LambdaFunctionDynamoDB
Noch ein Fehler!

Diesmal lautet die Meldung:
"errorMessage": "User: arn:aws:sts::YOUR_ACCOUNT_NUMBER:assumed-role/LambdaFunctionDynamoDB Role/LambdaFunctionDynamoDB  is not authorized to perform: dynamodb:GetItem on resource: arn:aws:dynamodb:us-east-1:YOUR_ACCOUNT_NUMBER:table/People because no identity-based policy allows the dynamodb:GetItem action",
Sie müssen „dynamodb:GetItem“ zum Berechtigungen-Array in der Richtlinie hinzufügen.

Aktualisieren Sie die DynamoDBAccessPolicy.json-Datei wie folgt:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:DescribeTable",
        "dynamodb:GetItem"
      ],
      "Resource": "arn:aws:dynamodb:us-east-1:YOUR_ACCOUNT_NUMBER:table/People"
    }
  ]
}
Stellen Sie die Lambda-Funktion erneut bereit:
dotnet lambda deploy-function LambdaFunctionDynamoDB
Rufen Sie erneut auf:
dotnet lambda invoke-function LambdaFunctionDynamoDB 
Erfolg!
Amazon Lambda Tools for .NET Core applications (5.4.2)
Project Home: https://github.com/aws/aws-extensions-for-dotnet-cli, https://github.com/aws/aws-lambda-dotnet

Payload:
"Alice Andrews lives in MA"
Lambda-Fehlermeldungen sind sehr hilfreich, wenn Sie versuchen, einer Rolle die geringstmöglichen Berechtigungen zu erteilen, aber wie Sie gesehen haben, müssen Sie diesen Vorgang möglicherweise einige Male wiederholen.

Eine andere Möglichkeit besteht darin, den Mauszeiger über die SDK-Methode zu bewegen, die Sie verwenden. Die Metadaten können nützliche Informationen zu Berechtigungen enthalten. Nicht alle Methoden-Metadaten enthalten Berechtigungsinformationen.
Informationen zu den erforderlichen Berechtigungen finden Sie auch in der AWS-Servicedokumentation.

Jetzt wissen Sie, wie Sie herausfinden, welche Berechtigungen Ihre Funktion benötigt, und wie Sie der Rolle, unter der Ihre Lambda-Funktionen ausgeführt werden, die richtigen Berechtigungen gewähren.

Anderen Services erlauben, Lambda-Funktionen aufzurufen

Es gibt viele Szenarien, in denen Sie einen anderen Service benötigen, um eine Lambda-Funktion für Sie aufzurufen. Zu den gängigen Szenarien gehören das Eintreffen einer Nachricht in einer Warteschlange, das Eintreffen eines Ereignisses in einem Kinesis-Stream, eine Änderung an einem Objekt/Bucket in S3 und eine Anfrage, die an ein API-Gateway eingeht. In jedem dieser Fälle wird die Lambda-Funktion von einem anderen AWS-Service aufgerufen.

Im vorherigen Abschnitt haben Sie gelernt, wie Sie der Lambda-Funktion Berechtigungen erteilen, um Aktionen für andere Services auszuführen. In diesem Abschnitt erfahren Sie, wie Sie anderen Services Berechtigungen zum Aufrufen Ihrer Lambda-Funktion erteilen.

Wenn Sie die serverless.*-Vorlagen verwenden, erteilen Sie einem API-Gateway wahrscheinlich bereits die erforderliche Berechtigung, um Ihre Lambda-Funktion aufzurufen. Wenn Sie eine solche Funktion bereitgestellt haben, wechseln Sie zur Registerkarte „Configuration“ (Konfiguration), wählen Sie dann links „Permissions“ (Berechtigungen) aus und scrollen Sie zum Abschnitt „Resource-based policy“ (Ressourcenbasierte Richtlinie). Sie werden Richtlinien sehen, mit denen der API-Gateway Ihre Lambda-Funktion aufrufen kann. Diese Richtlinie wurde durch den Befehl dotnet lambda deploy-serverless und die serverless.template in Ihrem Projekt hinzugefügt.

In der Abbildung unten sehen Sie zwei Richtlinienanweisungen, mit denen ein API-Gateway die Lambda-Funktion aufrufen kann.
Das Beispiel, an dem Sie arbeiten werden, ermöglicht es einem S3-Bucket jedoch, Ihre Lambda-Funktion aufzurufen, wenn Sie eine Datei in diesem Bucket erstellen oder löschen.

Den S3-Bucket erstellen

Der erste Schritt besteht darin, einen S3-Bucket zu erstellen.

Wenn Ihr Bucket in us-east-1 sein soll, können Sie den folgenden Befehl verwenden:
aws s3api create-bucket --bucket my-unique-bucket-name-lambda-course
Wenn Sie Ihren Bucket in einer anderen Region haben möchten, können Sie den folgenden Befehl verwenden:
aws s3api create-bucket --bucket my-unique-bucket-name-lambda-course --create-bucket-configuration LocationConstraint=REGION
Eine Liste der gültigen Regionen für LocationConstraint finden Sie unter dem folgenden Link: https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/create-bucket.html.

Beachten Sie, dass der Bucket-Name eindeutig sein muss. Weitere Informationen finden Sie hier

Die Lambda-Funktion erstellen

Es gibt eine Lambda-Funktionsvorlage, die Ihnen bei der Handhabung von S3-Ereignissen hilft. Die erforderlichen SDK-NuGet-Pakete wurden bereits hinzugefügt. Sie müssen immer noch die erforderliche Rollenberechtigung hinzufügen und die ressourcenbasierte Richtlinie erstellen, damit S3 die Funktion aufrufen kann.

Führen Sie in der Befehlszeile Folgendes aus:
dotnet new lambda.S3 -n S3EventHandler
Wechseln Sie in das Verzeichnis S3EventHandler/src/S3EventHandler:
cd S3EventHandler/src/S3EventHandler
Öffnen Sie die Datei Function.cs und ersetzen Sie die FunctionHandler-Methode durch Folgendes:
public async Task FunctionHandler(S3Event evnt, ILambdaContext context)
{
    context.Logger.LogInformation($"A S3 event has been received, it contains {evnt.Records.Count} records.");   
    foreach (var s3Event in evnt.Records)
    {
        context.Logger.LogInformation($"Action: {s3Event.EventName}, Bucket: {s3Event.S3.Bucket.Name}, Key: {s3Event.S3.Object.Key}");
       if (!s3Event.EventName.Contains("Delete"))
        {   
            try 
            {
                var response = await this.S3Client.GetObjectMetadataAsync(s3Event.S3.Bucket.Name, s3Event.S3.Object.Key);
                context.Logger.LogInformation( $"The file type is {response.Headers.ContentType}");
            } 
            catch (Exception e) 
            {
                context.Logger.LogError(e.Message);
                context.Logger.LogError($"An exception occurred while retrieving {s3Event.S3.Bucket.Name}/{s3Event.S3.Object.Key}. Exception - ({e.Message})");
            }
        } 
        else 
        {
            context.Logger.LogInformation($"You deleted {s3Event.S3.Bucket.Name}/{s3Event.S3.Object.Key}");
        }
    }
}
Wenn die Lambda-Funktion ein S3-Ereignis empfängt, protokolliert die Lambda-Funktion die Ereignisdetails in CloudWatch. Wenn das S3-Ereignis eine Reaktion auf die Erstellung eines Objekts ist, verwendet die Funktion das AWS SDK, um S3 aufzurufen, um den Dateityp abzurufen, und protokolliert dann die Details.

Wenn das S3-Ereignis auf das Löschen eines Objekts reagiert, protokolliert die Funktion die Bucket-/Schlüsselnamen in CloudWatch.

Die Lambda-Funktion löschen

Führen Sie in der Befehlszeile Folgendes aus:
dotnet lambda deploy-function S3EventHandler

Als Nächstes werden Sie gefragt: „Select IAM Role that to provide AWS credentials to your code:“ (Wählen Sie eine IAM-Rolle aus, um AWS-Anmeldeinformationen für Ihren Code bereitzustellen:). Möglicherweise wird Ihnen eine Liste der Rollen angezeigt, die Sie zuvor erstellt haben, aber am Ende der Liste befindet sich die Option „*** Create new IAM Role ***“ (*** Neue IAM-Rolle erstellen***). Geben Sie die Zahl neben dieser Option ein.

Sie sehen die Aufforderung „Enter name of the new IAM Role“ (Namen der neuen IAM-Rolle einzugeben). Geben Sie „S3EventHandlerRole“ ein.

Sie sehen dann die Aufforderung „Select IAM Policy to attach to the new role and grant permissions“ (IAM-Richtlinie auszuwählen, um sie an die neue Rolle anzuhängen und Berechtigungen zu gewähren), und eine Liste der Richtlinien wird angezeigt. Wählen Sie „AWSLambdaBasicExecutionRole“, das ist Nummer 6 auf meiner Liste. Sie müssen eine Richtlinie hinzufügen, um Zugriff auf den S3-Bucket zu gewähren, damit der Aufruf GetObjectMetadataAsync (..) funktioniert.

Der Lambda-Funktion Berechtigungen zum Abrufen der Objektmetadaten erteilen

Im vorherigen Beispiel haben Sie eine Inline-Richtlinie erstellt, die nur für die Rolle gilt, die Sie verwendet haben. Dieses Mal erstellen Sie eine Richtlinie, die jede Rolle verwenden kann.

Sie bekommen verschiedene Möglichkeiten dafür gezeigt.
Befehlszeile
 
Erstellen Sie eine Datei mit dem Namen S3AccessPolicyForCourseBucket.json im Ordner S3EventHandler/src/S3EventHandler.

Die Richtlinie wird so aussehen, wird aber Ihren Bucket-Namen in der Ressource enthalten. Beachten Sie das /* am Ende, das bedeutet, dass S3:GetObject für alle Objekte im Bucket gilt:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::my-unique-bucket-name-lambda-course/*"
        }
    ]
}
Führen Sie Folgendes aus:
aws iam create-policy --policy-name S3AccessPolicyForCourseBucket --policy-document file://S3AccessPolicyForCourseBucket.json
Notieren Sie sich den ARN der Richtlinie.

Hängen Sie dann die Richtlinie an die Rolle an, die Sie zuvor erstellt haben. Führen Sie Folgendes aus:
aws iam attach-role-policy --role-name S3EventHandlerRole --policy-arn arn:aws:iam::694977046108:policy/S3AccessPolicyForCourseBucket
AWS-Konsole
 
Rufen Sie die Lambda-Funktion in der AWS-Konsole auf.

Klicken Sie auf den Tab „Configuration“ (Konfiguration), dann auf der linken Seite auf „Permissions“ (Berechtigungen) und dann auf den Namen der Rolle.
Dadurch wird eine neue Seite mit Details zur Rolle geöffnet.

Klicken Sie auf Add permissions (Berechtigungen hinzufügen) und Attach policies (Richtlinien anhängen).

Klicken Sie auf Create policy (Richtlinie erstellen)

Geben Sie im Servicebereich s3 in das hervorgehobene Textfeld ein und wählen Sie S3 aus.

Geben Sie im Abschnitt „Actions“ (Aktionen) GetObject ein und wählen Sie GetObject aus der Liste aus.

Wählen Sie im Abschnitt „Resources“ (Ressourcen) die Option „Specific“ (Spezifisch) aus und klicken Sie auf Add ARN (ARN hinzufügen).

Geben Sie den Bucket-Namen ein und wählen Sie „Any“ (Beliebig) als Objektnamen aus.
Geben Sie einen Namen für die Richtlinie ein und klicken Sie auf „Create policy“ (Richtlinie erstellen)

Kehren Sie zu dem Tab zurück, auf dem Sie auf „Create policy“ (Richtlinie erstellen) geklickt haben. Gehen Sie folgendermaßen vor:

1. Laden Sie die Liste der Richtlinien erneut

2. Geben Sie in dem Filter S3AccessPolicyForCourseBucket ein

3. Kreuzen Sie das Kästchen neben der Richtlinie an

4. Klicken Sie auf Attach policies (Richtlinien anfügen)

Zu diesem Zeitpunkt verfügen Sie über einen S3-Bucket, die Lambda-Funktion und die erforderlichen Berechtigungen, um die Objektmetadaten aus dem S3-Bucket abzurufen.

Jetzt ist es an der Zeit, den S3-Bucket mit der Lambda-Funktion zu verbinden, sodass Erstellungs- und Löschereignisse die Lambda-Funktion auslösen.

Die Lambda-Funktion vom S3-Bucket aus auslösen

Wie Sie gesehen haben, ist es gut, wenn Sie die AWS-Befehlszeilentools und die UI-Konsole verwenden können. Für den nächsten Schritt werden Sie die UI-Konsole verwenden, da sie in diesem Schritt einfacher und übersichtlicher ist.

Öffnen Sie die Liste der Buckets in S3 https://s3.console.aws.amazon.com/s3/buckets.

Klicken Sie auf den Bucket, den Sie erstellt haben.
Öffnen Sie die Registerkarte „Properties“ (Eigenschaften).

Scrollen Sie nach unten zum Abschnitt „Event notifications“ (Ereignisbenachrichtigungen).

Klicken Sie auf Create event notification (Ereignisbenachrichtigung erstellen).

Geben Sie einen Namen für die Ereignisbenachrichtigung ein.

Aktivieren Sie die ersten beiden Kontrollkästchen auf der linken Seite: All object create events (Alle Ereignisse zum Erstellen von Objekten) und All object removal events (Alle Ereignisse zum Entfernen von Objekten).

Scrollen Sie nach unten zum Abschnitt „Destination“ (Ziel).

Wählen Sie die „Lambda function“ (Lambda-Funktion) als Ziel aus.

Geben Sie in der Dropdownliste den Namen der Lambda-Funktion ein, die Sie zuvor erstellt haben.

Klicken Sie auf Save changes (Änderungen speichern).

Wenn Sie fertig sind, wird diese neue Ereignisbenachrichtigung im Abschnitt „Event notifications“ (Ereignisbenachrichtigungen) aufgeführt.

Rufen Sie in der AWS-Konsole die Lambda-Funktion auf, die Sie zuvor erstellt haben.

Beachten Sie, dass S3 jetzt als Trigger für die Lambda-Funktion aufgeführt ist.

Klicken Sie auf die Registerkarte Configuration (Konfiguration) und dann links auf Permissions (Berechtigungen).

Scrollen Sie nach unten zum Abschnitt „Resource-based policy“ (Ressourcenbasierte Richtlinie)

Sie sehen eine Richtlinienanweisung, die es S3 ermöglicht, die Lambda-Funktion aufzurufen.
Klicken Sie auf die Kontoauszug-ID, um die Richtlinienanweisung zu überprüfen.

Testen

Diese Lambda-Funktion gibt nichts an den Aufrufer (in diesem Fall S3) zurück.

Stattdessen protokolliert die Lambda-Funktion in CloudWatch, sodass Sie dort prüfen müssen, wie Ihre Funktion funktioniert.

Erstellen Sie eine Textdatei auf Ihrem Computer, um sie in S3 hochzuladen.

Führen Sie in der Befehlszeile Folgendes aus:
aws s3api put-object --bucket my-unique-bucket-name-lambda-course --key Hello.txt --body Hello.txt --content-type "text/plain"
aws s3api delete-object --bucket my-unique-bucket-name-lambda-course --key Hello.txt

Gehen Sie nun zu Ihrer Lambda-Funktion in der AWS-Konsole und überprüfen Sie die Protokolle.

Klicken Sie auf die Registerkarte Monitor (Überwachen) und dann auf View Logs in CloudWatch (Protokolle in CloudWatch anzeigen).

Ihnen wird eine Liste von Protokollstreams angezeigt. Wählen Sie den neuesten aus.
Sie sollten Protokolleinträge sehen, die die S3-Ereignisse und den Text enthalten, den Sie in CloudWatch protokolliert haben.
Eine andere Möglichkeit, die Protokolle zu überprüfen, besteht darin, die AWS-Erweiterung für Visual Studio, Visual Studio Code und Rider zu verwenden.

Der Vorgang ist für alle drei ähnlich. Öffnen Sie die AWS-Erweiterung, klicken Sie auf „CloudWatch logs“ (CloudWatch-Protokolle) und suchen Sie den Protokollstream/die Gruppe für /aws/lambda/S3EventHandler. Öffnen Sie dann den neuesten Stream.
Eine andere Möglichkeit, die Protokolle zu überprüfen, besteht darin, die AWS-Erweiterung für Visual Studio, Visual Studio Code und Rider zu verwenden.

Der Vorgang ist für alle drei ähnlich. Öffnen Sie die AWS-Erweiterung, klicken Sie auf „CloudWatch logs“ (CloudWatch-Protokolle) und suchen Sie den Protokollstream/die Gruppe für /aws/lambda/S3EventHandler. Öffnen Sie dann den neuesten Stream.

Zusammenfassung

In diesem relativ kurzen Modul haben Sie viel gelernt. Manche würden sagen, dass zu den wichtigsten Kenntnissen für AWS gehört, Rollen und Richtlinien zu verstehen. Hoffentlich hat Ihnen dies eine gute Grundlage für das Thema in Bezug auf Lambda-Funktionen gegeben.

Hier ist die wichtigste Erkenntnis: Wenn Sie möchten, dass Ihre Lambda-Funktion mit anderen AWS-Services interagiert, müssen Sie Ihrer Funktion die Berechtigungen erteilen, auf diesen anderen Service zu reagieren.

Wenn Sie möchten, dass andere Services Ihre Funktion aufrufen, müssen Sie ressourcenbasierte Richtlinien verwenden, um diesen Services Zugriff auf Ihre Funktion zu gewähren.

Wissensabfrage

Sie haben jetzt Modul 4, Funktionsweise mit anderen AWS-Services, abgeschlossen. Mit dem folgenden Test können Sie überprüfen, was Sie bisher gelernt haben.

1. Was müssen Sie tun, wenn ein anderer Service eine Lambda-Funktion aufrufen soll? (wählen Sie eine aus)

a. Erstellen Sie ein ACL-Dokument, das der Rolle, die der andere Service ausführt, die Berechtigung zum Aufrufen der Lambda-Funktion zuweist5

b. Erstellen Sie ein ressourcenbasiertes Richtliniendokument, das den aufrufenden Services die Erlaubnis erteilt, die Lambda-Funktion aufzurufen

c. Nichts, Lambda vertraut allen anderen AWS-Services

d. Fügen Sie der Rolle, die die Lambda-Funktion ausführt, die richtigen Berechtigungen hinzu1

2. Was müssen Sie einer Rolle hinzufügen, um ihr Berechtigungen für den Zugriff auf AWS-Services zu erteilen? (Wählen Sie eine Antwort aus)

a. Nichts, alle Rollen können auf andere AWS-Services zugreifen.

b. Eine ressourcenbasierte Richtlinie

c. Eine Richtlinie mit den erforderlichen Berechtigungen

d. Ein Dokument mit einer Zugriffskontrollliste

3. Welche zwei Möglichkeiten gibt es, eine vom Kunden verwaltete Richtlinie zur Verwendung mit der Rolle zu erstellen, unter der eine Lambda-Funktion ausgeführt wird? (Wählen Sie zwei Antworten aus)

a. Über die Befehlszeile

b. Aufnahme in den Quellcode der Funktion

c. Über die AWS-Konsole

d. Fügen Sie sie der Nutzlast hinzu, wenn Sie die Funktion ausführen

Antworten: 1-b, 2-c, 3-ac

Zusammenfassung

In diesem relativ kurzen Modul haben Sie viel gelernt. Manche würden sagen, dass zu den wichtigsten Kenntnissen für AWS gehört, Rollen und Richtlinien zu verstehen. Hoffentlich hat Ihnen dies eine gute Grundlage für das Thema in Bezug auf Lambda-Funktionen gegeben.

Hier ist die wichtigste Erkenntnis: Wenn Sie möchten, dass Ihre Lambda-Funktion mit anderen AWS-Services interagiert, müssen Sie Ihrer Funktion die Berechtigungen erteilen, auf diesen anderen Service zu reagieren.

Wenn Sie möchten, dass andere Services Ihre Funktion aufrufen, müssen Sie ressourcenbasierte Richtlinien verwenden, um diesen Services Zugriff auf Ihre Funktion zu gewähren.

War diese Seite hilfreich?

MODULTESTS UND DEBUGGING