Geschichtete Lambdas: AWS SAM und Python

Ein wenig Code-Wiederverwendbarkeit schadet nie.

Inhaltsverzeichnis

Dies sind die Schritt-für-Schritt-Anweisungen, wie Sie Schichten zu AWS Lambdas hinzufügen – in Python.
Wir werden den Standard-HelloWorld-Vorlagenbeispielcode verwenden.

letters-layers

Und ja, selbstverständlich benötigen Sie alle Python
und AWS SAM Dinge vorinstalliert und konfiguriert.

Erstellen und Ausführen eines Beispielprojekts

Rufen Sie jetzt sam init auf und beantworten Sie die Fragen auf die Standardweise, wie folgt:

sam-init-answers

Es wird eine Zusammenfassung anzeigen:

sam-init-summary

und erstellt den Projektordner mit Struktur und einigen Dateien. Die Datei template.yaml ist sehr standardmäßig.

vs-code-template-yaml

und auch der Funktionscode (ich werde zusätzliche generierte Kommentare entfernen):

import json

def lambda_handler(event, context):

    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": "hello world",
            # "location": ip.text.replace("\n", "")
        }),
    }

Jetzt bauen wir diese Funktion lokal und rufen sie auf:

sam validate && sam build --use-container && sam local invoke HelloWorldFunction --event events/event.json

Das Ende der Antwort sollte ungefähr wie das untenstehende aussehen:

.....
START RequestId: 6da35464-7c6a-40b2-bcc0-60796994317a Version: $LATEST
END RequestId: 737ae28d-2b99-49e6-baae-40ab9bb99599
REPORT RequestId: 737ae28d-2b99-49e6-baae-40ab9bb99599  Init Duration: 0.04 ms  Duration: 28.40 ms      Billed Duration: 29 ms  Memory Size: 128 MB     Max Memory Used: 128 MB
{"statusCode": 200, "body": "{\"message\": \"hello world\"}"}

Schicht hinzufügen

Fügen Sie die Schichtbeschreibung in template.yaml hinzu

Zwei Abschnitte:

  • ApiSharedLayer – Block, der sie beschreibt
  • Layers: … - !Ref ApiSharedLayer – in der Funktion, die sie verwendet
.....
Resources:
# added code start
    ApiSharedLayer:
        Type: AWS::Serverless::LayerVersion
        Properties:
            ContentUri: api_shared_layer/
            LayerName: api-shared-layer
            Description: Meine api-shared-layer
            CompatibleRuntimes:
                - python3.9
            RetentionPolicy: Delete                
        Metadata:
            BuildMethod: python3.9   # Erforderlich, damit AWS SAM diese Schicht baut
# added code end

  HelloWorldFunction:
    Type: AWS::Serverless::Function # Mehr Informationen über die Funktion Ressource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.9
      Architectures:
        - x86_64
# added code start
      Layers:
        - !Ref ApiSharedLayer
# added code end
      Events:
.....

Fügen Sie den Schichtcode hinzu

Fügen Sie in den Ordner api_shared_layer etwas Code hinzu:

layer code

Aktualisieren Sie die Funktion, um diesen Code zu verwenden

import json
from api_version import API_VERSION

def lambda_handler(event, context):

    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": "hello world",
            "version": API_VERSION
        }),
    }

Testlauf

Nochmals:

sam validate && sam build --use-container && sam local invoke HelloWorldFunction --event events/event.json

Das Ende der Antwort sollte ungefähr wie das untenstehende aussehen:

.....
START RequestId: 88eb1887-ae94-479d-a059-f87c4b71a282 Version: $LATEST
END RequestId: 927f7d05-4d13-44ba-9377-03e6d3e8bacf
REPORT RequestId: 927f7d05-4d13-44ba-9377-03e6d3e8bacf  Init Duration: 0.72 ms  Duration: 34.80 ms      Billed Duration: 35 ms  Memory Size: 128 MB     Max Memory Used: 128 MB
{"statusCode": 200, "body": "{\"message\": \"hello world\", \"version\": \"1.1.1\"}"}

Schön.