[PYTHON] LoL ~ Lambda exploite Lambda ~

Préface

** Il s'agit d'un plan de création d'une fonction Lambda ** qui met à jour le groupe de fonctions Lambda et défie la mise à jour Lambda continue.

Examen d'AWS Lambda

Le code exécuté sur AWS Lambda peut être distribué de trois manières.

Ce que je veux faire

En fait, quand j'ai vu les options pour la première fois, j'ai pensé que le format de téléchargement S3 ferait référence au fichier S3 à chaque démarrage de Lambda. Avec ceci, "Si vous le distribuez à S3, vous pouvez déployer le code à ce stade, n'est-ce pas?"

Pour ce qui est du comportement, il semble qu'une telle chose ne soit pas possible, j'ai donc fait un mécanisme pour se déployer localement tout en étant un peu déçu, mais basé sur l'idée que "s'il s'agit d'AWS SDK, Lambda lui-même sera-t-il également touché?"

  1. Déclenché par le POST du fichier zip du jeu de codes vers S3
  2. Extraire la liste de configuration Lambda incluse dans le zip
  3. Écraser et mettre à jour Lamda à l'aide du kit AWS SDK

Je me suis demandé si je pouvais créer un mécanisme comme celui-ci, alors j'ai créé un petit code et l'ai essayé.

De plus, il est écrit en Python pour des raisons personnelles.

Quoi préparer

Avance

Mise à jour Lamda Préparer la fonction Lambda

Définissez une fonction Lambda avec le code en ligne upsert_lambda.py dans ce Gist.

Je ne pense pas que la mémoire elle-même en ait besoin. Cependant, en fonction du contenu, il fera un bon appel API, il est donc préférable de prolonger le délai d'attente en secondes. (Je l'ai mis à 30 secondes pour le moment)

(Expliquez grossièrement dans les commentaires en pressant le contenu)

upsert_lambda.py


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


class S3Object(object):
    #Classe de simplification de la livraison
    # <Abrégé pour chaque init>

def lambda_handler(event, context):
    #Fonctions appelées par AWS Lambda
    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):
    #Obtenez json de la liste des fonctions à partir du zip téléchargé
    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:
            #Essayons de créer une fonction Lambda pour le moment
            #Obtenez au moins au moment de l'écriture de ce code_Je me souviens que cette fonction était aussi une exception
            _lambda.create_function(
                # <Argument omis>
            )
        except ClientError as err:
            #Écraser les paramètres et le code s'il existe déjà
            _lambda.update_function_configuration(**function)
            _lambda.update_function_code(
                # <Argument omis>
            )

Préparez le compartiment S3

Dans S3, vous pouvez notifier à Lambda des événements tels que la création d'objet et appeler des fonctions Lambda spécifiques. [^ 1] En utilisant ce mécanisme, ** la fonction Lambda ci-dessus peut être appelée lorsque le fichier est téléchargé dans le dossier de compartiment spécifié **.

Créer un zip qui résume l'ensemble de codes des fonctions Lambda

En gros, il n'y a aucun problème si vous créez cette zone selon la documentation Lambda. Cependant, veuillez inclure json pour créer lambda.create_function et lambda.update_function_code dans boto3. (Nommé dans functions.json)

Comme ↓

functions.json


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

Télécharger

Veuillez télécharger le zip créé à l'endroit où la notification est envoyée côté Lambda.

Je l'ai essayé

(Si vous avez le temps après la publication, collez la vidéo ou le GIF)

Développement (?)

C'est l'introduction du code que j'ai créé avant de connaître l'existence de lambda-uploader.

Recommended Posts

LoL ~ Lambda exploite Lambda ~
lambda
Faites fonctionner Dynamodb depuis Lambda comme SQL
Style Lambda