Comment utiliser les variables d'environnement Serverless Framework et Python et gérer les étapes

Cet article est un portage de mon blog personnel Practical Cloud Python --SERVERLESS FRAMEWORK & How to use PYTHON environment variables vers Qiita. Merci d'avoir visité Practical Cloud Python.

Abstract

Explique comment gérer les variables d'environnement qui peuvent être appréciées par la gestion de la scène et le codage.

La source

La source de l'exemple est ouverte au public, veuillez donc consulter ici un exemple de mise en œuvre.

https://github.com/hassaku63/sls-env-example

Il a une configuration de Lambda (planifié) -> SQS-> Lambda (consommateur de file d'attente).

supposition

Les packages et plug-ins suivants sont utilisés.

Serverless Framework

Python

Les variables d'environnement sont déclarées dans .env. et serverless.yml

L'exemple de source est le code qui est censé être publié sur Slack. Le jeton et le nom du canal sont des informations confidentielles, ils sont donc décrits dans .env.

La structure sans serveur utilise le plug-in Serverless Dotenv pour inclure la définition du fichier .env dans provider.environment lors de l'empaquetage de déploiement.

Le plugin Dotenv charge automatiquement un fichier .env suffixé avec le nom de l'étape spécifiée. Par exemple, à l'étape de développement, chargez .env.dev comme définition de la variable d'environnement (voir la section sur la résolution automatique des noms de fichiers Env). Utilisez cette fonction pour les paramètres qui modifient le jeton API, etc. pour chaque étape.

Il est également déclaré dans la variable d'environnement pour gérer les noms de ressources de SQS et DynamoDB. Cela est dû au fait que les noms des ressources de la file d'attente et de la table sont requis lors de l'utilisation du client boto3 à partir du code.

https://gist.github.com/hassaku63/0e4e61db60bd48b5d86459ceabb9dd34

provider:
  name: aws
  runtime: python3.8
  profile: ${opt:profile, default}
  stage: ${opt:stage, dev}
  region: ${opt:region, us-east-1}
  timeout: 30
  environment:
    # To tell lambda function to AWS AccountId by use pseudo-parameters plugin.
    # AccountId is used to construct SQS Queue URL
    AWS_ACCOUNT_ID: '#{AWS::AccountId}'
    # MY_QUEUE_NAME is used to construct Queue URL in lambda.
    # And also convenient to reference resource ARN in IAM Policy statement
    MY_QUEUE_NAME: ${self:service}-my-queue-${self:provider.stage}

La partie marquée comme $ {self: service} -my-queue- $ {self: provider.stage} est le nom de la file d'attente utilisée dans cette source. Les noms de service et d'étape sont inclus pour garantir l'unicité des noms de ressources lors de l'utilisation de plusieurs étapes de déploiement.

Lors de la mise en file d'attente de Python vers SQS, vous devez spécifier QueueUrl comme identificateur de ressource cible. Pour assembler QueueUrl, vous avez besoin de trois éléments: ID de compte AWS, région AWS et QueueName. Puisque nous voulons pouvoir y faire référence dans Lambda, nous les déclarons dans des variables d'environnement (notez que seules les régions doivent être définies par nous-mêmes car Lambda les définit automatiquement comme variables d'environnement par défaut lors de l'exécution. il n'y a pas).

Il est question de savoir si les variables d'environnement doivent être écrites en .env ou serverless.yml, mais je pense que vous devriez juger s'il s'agit d'informations que vous voulez garder secrètes. Si le nombre de variables d'environnement devient trop grand et qu'il devient redondant, il est préférable de ne sélectionner que celles qui ne sont pas vraiment des variables d'environnement et de les déclarer comme variables d'environnement. S'il y a des parties qui ne sont pas essentielles (telles que des sous-chaînes qui font partie du nom de la ressource), je pense que ce serait une bonne idée de les définir dans la section personnalisée.

Définissez les variables d'environnement en Python dans settings.py

Si vous souhaitez gérer des variables d'environnement à partir de Python, vous devez utiliser os.environ. Cependant, il n'y a aucun moyen de remarquer le nom de la variable Typo lors du codage, car l'auto-complétion IDE ne fonctionne pas avec cette écriture. Ce n'est pas une bonne expérience de développement de remarquer une mauvaise saisie des variables d'environnement jusqu'à ce que vous les déployez. En outre, utiliser os.environ à chaque fois que le nombre de gestionnaires Lambda augmente est une violation de DRY.

Pour éviter cela, chargez des variables d'environnement et créez settings.py pour les définir en tant que constantes Python. Tout le code Python doit lire les variables d'environnement de ce module. Cela vous permettra de profiter de l'auto-complétion IDE tout en préservant DRY et de réduire la possibilité de faute de frappe.

https://gist.github.com/hassaku63/0e971fb0823aea561f33db880d0269e4

"""
Declare all environment variables defined in .env.<stage-name> and serverless.yml as python variables.
If you would like to use environment variables in your code, you import this module then reference as constants of python variable.
By use this technique, you are able to use IDE auto-completion effectively when you writing python code.
It is useful to reduce miss-typing of environment variables.
"""
import os
import pathlib
import json
import dotenv

project_root_dir = pathlib.Path(__file__).parent / '../'

dotenv.load_dotenv()
MYAPP_STAGE_NAME = os.environ.get('MYAPP_STAGE_NAME')

stage_env_path = project_root_dir / f'.env.{MYAPP_STAGE_NAME}'
dotenv.load_dotenv(stage_env_path.resolve())

# Slack
SLACK_BOT_TOKEN = os.environ.get('SLACK_BOT_TOKEN')
SLACK_CHANNEL = os.environ.get('SLACK_CHANNEL')

# AWS
AWS_ACCOUNT_ID = os.environ.get('AWS_ACCOUNT_ID')
# Notice: You don't need to define AWS_REGION in .env and serverless.yml
# because of lambda runtime automatically set AWS_REGION env var when execute.
AWS_REGION = os.environ.get('AWS_REGION') 

# SQS
MY_QUEUE_NAME = os.environ.get('MY_QUEUE_NAME', '')

À ce stade, python-dotenv est utilisé pour charger le .env en fonction de l'étape. Je m'attends à ce que .env soit à la racine du projet. Recherchez le répertoire relatif des paramètres dans Pathlib, utilisez la variable d'environnement MYAPP_STAGE_NAME pour déterminer le nom de l'étape et utilisez ce nom comme suffixe .env.

Résumé

Serverless Framework et Python ont des packages supplémentaires pour travailler avec .env. Faisons bon usage des variables d'environnement en les utilisant.

Il peut y avoir des références à des noms de ressources dans votre code, tels que les identificateurs de ressources DynamoDB et SQS. Les variables d'environnement peuvent également être utilisées dans de tels cas. En la définissant comme une variable d'environnement, la variable peut être réutilisée même en faisant référence au nom de la ressource dans le modèle.

Utilisons os.environ pour créer un module de regroupement des variables d'environnement en constantes Python. Vous pouvez également utiliser la complétion automatique de l'EDI, et comme la description est centralisée en un seul endroit, une erreur de frappe est moins susceptible de se produire et c'est facile.

Recommended Posts

Comment utiliser les variables d'environnement Serverless Framework et Python et gérer les étapes
Comment installer et utiliser pandas_datareader [Python]
python: Comment utiliser les locals () et globals ()
Comment utiliser le zip Python et énumérer
Comment utiliser is et == en Python
[Python] Comment utiliser la fonction de hachage et taple.
Utilisez os.getenv pour obtenir des variables d'environnement en Python
[Python] [Django] Comment utiliser le champ de choix et comment ajouter des options
python3: Comment utiliser la bouteille (2)
[Python] Comment utiliser la liste 1
Comment utiliser Python Argparse
Python: comment utiliser pydub
[Python] Comment utiliser checkio
Julia Quick Look Note [01] Comment utiliser les variables et les constantes
[Python] Comment utiliser input ()
Comment utiliser Python lambda
[Python] Comment utiliser virtualenv
python3: Comment utiliser la bouteille (3)
python3: Comment utiliser la bouteille
Comment utiliser les octets Python
[Python] Comment jouer avec les variables de classe avec décorateur et métaclasse
[Introduction à l'application Udemy Python3 +] 36. Utilisation de In et Not
[Python] Résumé de l'utilisation des fonctions de fractionnement et de jointure
Comparaison de l'utilisation des fonctions d'ordre supérieur dans Python 2 et 3
Vue d'ensemble de l'environnement virtuel Python et comment le créer
Python: comment utiliser async avec
Comment installer et utiliser Tesseract-OCR
[Python] Comment utiliser la série Pandas
Comment utiliser les requêtes (bibliothèque Python)
Comment utiliser SQLite en Python
Comment utiliser .bash_profile et .bashrc
Comment installer et utiliser Graphviz
[Python] Comment utiliser la liste 3 Ajouté
Comment utiliser Mysql avec python
Comment utiliser l'API Python d'OpenPose
Comment utiliser ChemSpider en Python
Python: Comment utiliser pydub (lecture)
Comment utiliser PubChem avec Python
Comment utiliser la fonction zip de python
[Python] Comment utiliser l'API Typetalk
Comment utiliser les fonctions dans des fichiers séparés version Perl et version Python
[Introduction à Python] Comment utiliser l'opérateur booléen (et ・ ou ・ non)
Comment créer un environnement d'exécution Python et Jupyter avec VSCode
[Python] Résumé de l'utilisation des pandas
Comment empaqueter et distribuer des scripts Python
[Python] Utiliser et et ou lors de la création de variables
Comment définir dynamiquement des variables en Python
[python] Comment utiliser __command__, explication des fonctions
Comment préparer l'environnement de développement Python [Mac]
[Python] Comment utiliser import sys sys.argv
[Python] Organisation de l'utilisation des instructions
Mémorandum sur l'utilisation du python gremlin
[Python2.7] Résumé de l'utilisation d'unittest
Pour référencer des variables d'environnement en Python dans Blender
Comment utiliser __slots__ dans la classe Python
Comment utiliser Tensorflow dans un environnement Docker
Comment utiliser "deque" pour les données Python