اللامبدات المُستحِلة: AWS SAM وبايثون

لا ضرر من قليل من إعادة استخدام الكود

Page content

هذا هو الإرشادات خطوة بخطوة حول كيفية إضافة طبقات إلى AWS Lambdas - باستخدام لغة بايثون. سأستخدم الشفرة الأساسية التي تولدها نموذج HelloWorld القياسي.

letters-layers

نعم بالتأكيد، تحتاج إلى أن يكون لديك جميع البايثون وأشياء AWS SAM مثبتة مسبقًا ومُعدة.

إنشاء وتشغيل مشروع نموذجي

الآن قم بتشغيل sam init واجبَل الأسئلة بطريقة القياسي، مثل هذا:

sam-init-answers

سيعرض الملخص

sam-init-summary

وسيقوم بإنشاء مجلد المشروع مع الهيكل والملفات. template.yaml هو القياسي.

vs-code-template-yaml

كما هو الشفرة الخاصة بالوظيفة أيضًا (سأقوم بمسح التعليقات الإضافية المُولدة):

import json

def lambda_handler(event, context):

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

الآن دعنا نبني ونقوم بتشغيل هذه الوظيفة محليًا

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

يجب أن يكون نهاية الاستجابة قريبة من تلك أدناه:

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

إضافة الطبقات

إضافة وصف الطبقات إلى template.yaml

أثناءين من الأجزاء:

  • ApiSharedLayer - كتلة تصفِّرها
  • Layers: … - !Ref ApiSharedLayer - في الوظيفة التي تستخدمها
.....
Resources:
# added code start
    ApiSharedLayer:
        Type: AWS::Serverless::LayerVersion
        Properties:
            ContentUri: api_shared_layer/
            LayerName: api-shared-layer
            Description: My api-shared-layer
            CompatibleRuntimes:
                - python3.9
            RetentionPolicy: Delete                
        Metadata:
            BuildMethod: python3.9   # Required to have AWS SAM build this layer
# added code end

  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about 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
# added code start
      Layers:
        - !Ref ApiSharedLayer
# added code end
      Events:
.....

إضافة شفرة الطبقات

في المجلد api_shared_layer أضف بعض الشفرة

layer code

تحديث الوظيفة لاستخدام هذه الشفرة

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

تشغيل الاختبار

مرة أخرى:

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

يجب أن يكون نهاية الاستجابة قريبة من تلك أدناه:

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

رائع.

روابط مفيدة