[PYTHON] LoL ~ Lambda betreiben Lambda ~

Vorwort

** Es ist geplant, eine Lambda-Funktion zu erstellen **, die die Lambda-Funktionsgruppe aktualisiert und eine kontinuierliche Lambda-Aktualisierung in Frage stellt.

AWS Lambda Bewertung

Code, der auf AWS Lambda ausgeführt wird, kann auf drei Arten verteilt werden.

Was ich machen will; was ich vorhabe zu tun

Als ich die Optionen zum ersten Mal sah, dachte ich, dass das S3-Download-Format bei jedem Start von Lambda auf die S3-Datei verweisen würde. "Wenn Sie es an S3 verteilen, können Sie den Code an diesem Punkt bereitstellen, nicht wahr?"

Was das Verhalten angeht, scheint so etwas nicht möglich zu sein. Deshalb habe ich einen Mechanismus für die lokale Bereitstellung entwickelt, während ich ein wenig enttäuscht war, aber basierend auf der Idee: "Wenn es sich um AWS SDK handelt, wird Lambda selbst auch berührt?"

  1. Ausgelöst durch POST der Codeset-Zip-Datei an S3
  2. Extrahieren Sie die im Zip enthaltene Lambda-Konfigurationsliste
  3. Überschreiben und aktualisieren Sie Lamda mit dem AWS SDK

Ich fragte mich, ob ich einen solchen Mechanismus erstellen könnte, also machte ich einen kleinen Code und versuchte es.

Darüber hinaus ist es aus persönlichen Gründen in Python geschrieben.

Was vorzubereiten?

Voraus

Lamda-Update Bereiten Sie die Lambda-Funktion vor

Definieren Sie eine Lambda-Funktion mit Inline-Code upsert_lambda.py in dieser Liste.

Ich denke nicht, dass die Erinnerung selbst so viel erfordert. Abhängig vom Inhalt wird jedoch ein guter API-Aufruf ausgeführt, sodass es besser ist, das Timeout Sekunden länger zu halten. (Ich habe es vorerst auf 30 Sekunden eingestellt)

(Erklären Sie grob in den Kommentaren, während Sie den Inhalt zusammendrücken)

upsert_lambda.py


# -*- coding:utf8 -*-
import boto3
from botocore.exceptions import ClientError
import zipfile
import json


class S3Object(object):
    #Klasse zur Vereinfachung der Lieferung
    # <Für jede Init abgekürzt>

def lambda_handler(event, context):
    #Von AWS Lambda aufgerufene Funktionen
    records = event.get('Records', [])
    for record in records:
        s3_object = S3Object(record['awsRegion'], record['s3']['bucket']['name'], record['s3']['object']['key'])
        _update_functions('sharequiz', 'test', s3_object)


def _update_functions(project, env, s3_object):
    #Holen Sie sich json der Funktionsliste von der hochgeladenen Zip
    with zipfile.ZipFile(project_zip_path) as zfp:
        handlers_json = zfp.read('functions.json')
    functions = json.loads(handlers_json)

    _lambda = boto3.client('lambda')
    for function in functions:
        try:
            #Versuchen Sie vorerst, eine Lambda-Funktion zu erstellen
            #Holen Sie sich mindestens zum Zeitpunkt des Schreibens diesen Code_Ich erinnere mich, dass diese Funktion auch eine Ausnahme war
            _lambda.create_function(
                # <Argument weggelassen>
            )
        except ClientError as err:
            #Überschreiben Sie Einstellungen und Code, falls dieser bereits vorhanden ist
            _lambda.update_function_configuration(**function)
            _lambda.update_function_code(
                # <Argument weggelassen>
            )

Bereiten Sie den S3-Eimer vor

In S3 können Sie Lambda über Ereignisse wie die Objekterstellung informieren und bestimmte Lambda-Funktionen aufrufen. [^ 1] Mit diesem Mechanismus ** kann die obige Lambda-Funktion aufgerufen werden, wenn die Datei in den angegebenen Bucket-Ordner hochgeladen wird **.

Erstellen Sie eine Zip-Datei, die den Codesatz der Lambda-Funktionen zusammenfasst

Grundsätzlich gibt es kein Problem, wenn Sie diesen Bereich gemäß der Lambda-Dokumentation erstellen. Fügen Sie jedoch json hinzu, um lambda.create_function und lambda.update_function_code in boto3 zu erstellen. (Benannt in functions.json)

Wie ↓

functions.json


[{
	"Handler": "path/to/module.some_function",
	"Role": "arn:aws:iam::your-role",
	"FunctionName": "some_funtion",
	"Timeout": 3,
	"MemorySize": 128,
	"Description": "Einfache Verarbeitung"
}, {
	"Handler": "path/to/module.other_function",
	"Role": "arn:aws:iam::your-role",
	"FunctionName": "else_funtion",
	"Timeout": 30,
	"MemorySize": 1280,
	"Description": "Schwere Verarbeitung"
}]

Hochladen

Bitte laden Sie die erstellte Postleitzahl an die Stelle hoch, an der die Benachrichtigung an die Lambda-Seite geht.

Ich versuchte es

(Wenn Sie nach dem Posten Zeit haben, fügen Sie das Video oder GIF ein.)

Entwicklung (?)

Dies ist die Einführung des Codes, den ich gemacht habe, bevor ich die Existenz eines Lambda-Uploaders kannte.

Recommended Posts

LoL ~ Lambda betreiben Lambda ~
Lambda
Betreiben Sie Dynamodb von Lambda aus wie SQL
Lambda-Stil