Geslagen Lambdas: AWS SAM en Python

Een beetje codehergebruik schaadt nooit

Inhoud

Dit zijn de stap-voor-stap instructies voor het toevoegen van lagen aan AWS Lambdas - in Python. We zullen gebruik maken van basiscode gegenereerd door het standaard HelloWorld sjabloonvoorbeeld.

letters-layers

En ja, natuurlijk heb je alle Python en AWS SAM dingen vooraf geïnstalleerd en geconfigureerd.

Genereren en uitvoeren van een voorbeeldproject

Roep nu sam init aan en beantwoord de vragen op de standaard manier, zoals hieronder:

sam-init-answers

het zal een overzicht tonen

sam-init-summary

en het zal de projectmap met structuur en enkele bestanden aanmaken. template.yaml is vrij standaard.

vs-code-template-yaml

en de functiecode ook (ik zal extra gegenereerde opmerkingen verwijderen)

import json

def lambda_handler(event, context):

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

Laten we nu deze functie lokaal bouwen en aanroepen

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

Het einde van de respons moet ongeveer overeenkomen met het onderstaande:

.....
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\"}"}

De laag toevoegen

Voeg een beschrijving van de laag toe aan template.yaml

Twee onderdelen:

  • ApiSharedLayer - blok dat het beschrijft
  • Layers: … - !Ref ApiSharedLayer - in de functie die het gebruikt
.....
Resources:
# toegevoegde code start
    ApiSharedLayer:
        Type: AWS::Serverless::LayerVersion
        Properties:
            ContentUri: api_shared_layer/
            LayerName: api-shared-layer
            Description: Mijn api-shared-layer
            CompatibleRuntimes:
                - python3.9
            RetentionPolicy: Delete                
        Metadata:
            BuildMethod: python3.9   # Vereist om AWS SAM deze laag te bouwen
# toegevoegde code einde

  HelloWorldFunction:
    Type: AWS::Serverless::Function # Meer info over Function Resource: 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
# toegevoegde code start
      Layers:
        - !Ref ApiSharedLayer
# toegevoegde code einde
      Events:
.....

Voeg de laagcode toe

in de map api_shared_layer voeg wat code toe

layer code

Werk de functie bij om deze code te gebruiken

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
        }),
    }

Testuitvoering

Opnieuw:

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

Het einde van de respons moet ongeveer overeenkomen met het onderstaande:

.....
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\"}"}

Prima.