[PYTHON] Apprenez de «Beyond the Twelve-Factor App» et «The Twelve-Factor App» et pratiquez-vous sur AWS (3) Dependency Management / Dependencies - Déclarez explicitement et séparez les dépendances

Commentaire

Ce facteur est un facteur de gestion des dépendances à la fois original et au-delà. Dans les langages de développement modernes, la plupart des outils de gestion de packages sont fournis pour résoudre les références de bibliothèques telles que npm, pip et gradle. La résolution des dépendances d'application à l'aide d'une telle gestion de package garantit qu'un ensemble d'applications bien configuré peut être créé et exécuté dans n'importe quel environnement. De plus, en termes de dépendances, vous devez prêter attention non seulement aux bibliothèques d'applications, mais également à la création de scripts et de scripts de déploiement. Il est nécessaire d'empêcher l'utilisation implicite de ces scripts pour les bibliothèques et commandes installées sur un système spécifique.

De plus, lorsque je crée une application dans un environnement Windows comme moi, si le script est écrit dans un shell, j'ai le sentiment qu'il dépend du système. Tant que vous avez une version d'exécution sur n'importe quel système d'exploitation. Je pense que nous devrions faire des efforts dans le but de pouvoir couvrir tout le développement, les tests et l'exécution de l'application dans des conditions égales. ..

Entraine toi

Cette fois également, je continuerai à pratiquer ce facteur basé sur Lambda et Python. Je vais continuer avec le flux de la gestion des packages à l'aide de pipenv de Python à la création d'un package pour déployer des fonctions Lambda basées sur celui-ci. Python à utiliser est 3.8, et l'installation d'exécution commencera à partir du point où elle est terminée.

pipenv pipenv est un outil qui intègre la gestion des paquets avec pip et la gestion de l'environnement virtuel avec venv. Je pense que c'est à un niveau élevé en tant qu'outil pour séparer et gérer explicitement les dépendances.

  1. Installez pipenv.
pip install pipenv
  1. Ajoutez des paramètres afin que l'environnement virtuel créé par pipenv puisse être placé dans le dossier directement sous le projet. Ajoutez ce qui suit aux variables d'environnement.
PIPENV_VENV_IN_PROJECT=1

Cela garantira que l'environnement virtuel créé par virtualenvv est spécifique au projet. Étant donné que plusieurs projets sont traités en même temps, il est recommandé de les séparer si loin du point de vue de la séparation des dépendances.

  1. Initialisez le projet.
pipenv --python 3.8

Le fichier Pipfile '' et le dossier .venv '' sont créés directement sous le dossier du projet, et vous êtes prêt à partir.

Package de développement

En utilisant pipenv, il est possible de l'utiliser uniquement dans l'environnement de développement et de gérer les packages inutiles dans le code produit. Des outils tels que autopep8 et pylint lui correspondent, alors installez-le comme suit.

pipenv install --dev autopep8 pylint

boto3

La version Python du kit SDK AWS, boto3, est préinstallée dans l'environnement d'exécution de Lambda. En d'autres termes, si vous souhaitez utiliser boto3 inclus dans l'environnement d'exécution, installez boto3 en tant que package de développement afin qu'il ne soit pas inclus dans le code produit. Ceci est efficace car cela réduit le temps de chargement de l'énorme code de boto3 au démarrage à froid de Lambda. Cependant, boto3 inclus dans l'environnement d'exécution a une faiblesse en ce que l'utilisateur ne peut pas contrôler la version. Si AWS modifie l'environnement d'exécution Lambda, il existe toujours un risque que la version de boto3 dans l'environnement de production change soudainement un jour. De plus, si la mise à niveau de la version inclut un changement de freinage, elle peut soudainement cesser de fonctionner. De plus, boto3 inclus dans l'environnement d'exécution est une version légèrement plus ancienne du module, il ne peut donc pas être utilisé dans les cas d'utilisation où la dernière version de boto3 est requise. Lors de l'exploitation d'un système fonctionnant 24h / 24, 365 jours par an, il est recommandé que boto3 soit inclus dans l'application, même au détriment des performances de démarrage à froid.

Cette fois, nous allons construire un projet en intégrant boto3 dans l'application. Installez le package ci-dessous.

pipenv install boto3

Emballage de la fonction Lambda

Pour déployer la fonction Lambda, les modules nécessaires, y compris les packages dépendants, doivent être compressés au format ZIP et téléchargés. Le processus de conversion en ZIP est le suivant.

  1. Créez un dossier pour la compression
  2. Ajoutez le fichier de package géré par pipenv dans le dossier de compression
  3. Ajoutez l'application au dossier de compression
  4. ZIP

Tout d'abord, la structure du projet prérequis est la suivante.

root
 + src
 |   + lambda_function.py
 + packing.py
 + Pipfile
 + Pipfile.lock
 + setup.py

__src folder __: Application pour la fonction Lambda. Contient le gestionnaire Lambda. packing.py: Code pour l'empaquetage des fonctions Lambda Pipfile: fichier de configuration pipenv Pipfile.lock: informations détaillées sur l'environnement construit avec pipenv. Utilisez ce fichier pour reproduire complètement l'environnement setup.py: fichier de configuration pour le déploiement des applications de fonction Lambda avec pip

Tout d'abord, setup.py est le suivant. Il s'agit d'un fichier de configuration pour installer un ensemble d'applications sous le dossier src avec la commande pip, qui est utilisée pour empaqueter l'application. Dans ce qui suit, lambda_function.py et les packages sous `` src '', le cas échéant, seront installés. Il s'agit du paramètre d'installation de pip.

from setuptools import setup, find_packages

setup(
    name="12factor",
    version="1.0.0",
    packages=find_packages(where='src'),
    py_modules=['lambda_function'],
    package_dir={'': 'src'},
)

Ensuite, packing.py pour l'emballage réel est le suivant. J'écris en python pour pouvoir créer des ZIP dans n'importe quel environnement sans dépendre du système. Le flux général est de collecter les fichiers nécessaires dans . Dist en tant que dossier temporaire et de les compresser. De plus, ce programme n'est pas exécuté dans l'environnement de développement, mais il est supposé être exécuté dans un environnement propre où le code source est obtenu à partir de git etc. Je l'utilise pour l'empaquetage en créant temporairement un environnement virtuel de . Venv. Soyez prudent car si vous créez un environnement virtuel de . Venv dans l'environnement de développement, il sera détruit.

  1. Créez un dossier pour ZIP. Puisqu'il ne devrait plus y avoir de déchets, supprimez-le d'abord, puis créez un dossier.
  2. Utilisez la commande pipenv sync pour collecter les packages définis dans pipfile.lock dans le dossier ZIP. La commande pipenv sync reproduit fidèlement les packages, ce qui en fait la solution la plus appropriée du point de vue de la "gestion des dépendances". Si vous spécifiez un dossier pour ZIP dans la variable d'environnement PIP_TARGET. pipenv sync Seuls les packages dépendants seront installés dans ce dossier lorsque vous exécuterez la commande.
  3. Installez l'application dans le dossier ZIP avec la commande pip instaa -t .dist .__.
  4. Enfin, créez un fichier ZIP. Vous pouvez utiliser ce fichier lambda_function.zip pour déployer sur Lambda.
import os
import shutil
import subprocess

DISTINATION_FOLDER = '.dist'

if __name__ == '__main__':
    #Créer un dossier pour ZIP
    shutil.rmtree(DISTINATION_FOLDER, ignore_errors=True)
    os.mkdir(DISTINATION_FOLDER)
    #Changer le dossier dans lequel les packages sont enregistrés lors de la synchronisation pipenv
    os.environ['PIP_TARGET'] = DISTINATION_FOLDER
    #Supprimer si l'environnement virtuel existe déjà
    subprocess.call('pipenv --rm')
    # pipfile.Reproduction de l'environnement virtuel à partir de la serrure
    subprocess.call('pipenv sync')
    #Installer le code d'application avec pip
    subprocess.call('pip install -t {} .'.format(DISTINATION_FOLDER))
    # ZIP
    shutil.make_archive('lambda_function', 'zip', DISTINATION_FOLDER)
    #Supprimer l'environnement virtuel
    subprocess.call('pipenv --rm')
    

Sommaire

Comme troisième facteur, j'ai pratiqué les méthodes de gestion des dépendances en utilisant Python et Lambda. Je pense que la sensibilité avec laquelle vous gérez les dépendances dépend du projet, mais j'espère que l'exemple présenté ici pourra être utilisé comme exemple lorsqu'il est géré le plus strictement.

La prochaine fois, "(4) Design, Build, Release, Execution / Build, Release, Execution - Séparez strictement les trois étapes de Build, Release et Execution". Table des matières de cette série Tableau de toutes les séries

Recommended Posts

Apprenez de «Beyond the Twelve-Factor App» et «The Twelve-Factor App» et pratiquez-vous sur AWS (3) Dependency Management / Dependencies - Déclarez explicitement et séparez les dépendances