Verwendung von Umgebungsvariablen für Serverless Framework und Python und Verwaltung von Phasen

Dieser Artikel ist eine Portierung meines persönlichen Blogs Praktisches Cloud-Python - SERVERLESS FRAMEWORK & Verwendung von PYTHON-Umgebungsvariablen zu Qiita. Vielen Dank für Ihren Besuch bei Practical Cloud Python.

Abstract

Erklärt, wie Umgebungsvariablen verwaltet werden, die von der Bühnenverwaltung und -codierung genutzt werden können.

Quelle

Die Quelle des Beispiels ist öffentlich zugänglich. Ein Implementierungsbeispiel finden Sie hier.

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

Es hat eine Konfiguration von Lambda (geplant) -> SQS-> Lambda (Queue Consumer).

Annahme

Die folgenden Pakete und Plug-Ins werden verwendet.

Serverless Framework

Python

Umgebungsvariablen werden in .env. und serverless.yml deklariert

Die Beispielquelle ist Code, der an Slack gesendet werden soll. Token und Kanalname sind vertrauliche Informationen und werden daher in .env beschrieben.

Das Serverless Framework verwendet das Serverless Dotenv Plugin, um die Definition der .env-Datei während des Bereitstellungspakets in die Datei provider.environment aufzunehmen.

Das Dotenv-Plugin lädt automatisch eine .env-Datei, die mit dem Namen der angegebenen Stufe versehen ist. Laden Sie beispielsweise in der Entwicklungsphase .env.dev als Definition der Umgebungsvariablen (siehe Abschnitt zur automatischen Auflösung von Env-Dateinamen). Verwenden Sie diese Funktion für Einstellungen, die das API-Token usw. für jede Stufe ändern.

Es wird auch in der Umgebungsvariablen deklariert, um die Ressourcennamen von SQS und DynamoDB zu verwalten. Dies liegt daran, dass die Namen der Warteschlangen- und Tabellenressourcen erforderlich sind, wenn der boto3-Client aus dem Code heraus verwendet wird.

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}

Der als "$ {self: service} -my-queue- $ {self: provider.stage}" gekennzeichnete Teil ist der Name der in dieser Quelle verwendeten Warteschlange. Die Dienst- und Stufennamen sind enthalten, um die Eindeutigkeit der Ressourcennamen bei Verwendung mehrerer Bereitstellungsstufen sicherzustellen.

Bei der Warteschlange von Python zu SQS müssen Sie QueueUrl als Zielressourcen-ID angeben. Zum Zusammenstellen von QueueUrl benötigen Sie drei Dinge: AWS-Konto-ID, AWS-Region und QueueName. Da wir in Lambda auf sie verweisen möchten, deklarieren wir sie in Umgebungsvariablen (beachten Sie, dass nur Regionen von uns selbst definiert werden müssen, da Lambda sie zur Laufzeit standardmäßig automatisch als Umgebungsvariablen festlegt. da ist nicht).

Es ist die Rede davon, ob Umgebungsvariablen in .env oder serverless.yml geschrieben werden sollen, aber ich denke, Sie sollten beurteilen, ob dies Informationen sind, die Sie geheim halten möchten. Wenn die Anzahl der Umgebungsvariablen zu groß und redundant wird, ist es besser, nur diejenigen zu erfassen, die nicht wirklich Umgebungsvariablen sind, und sie als Umgebungsvariablen zu deklarieren. Wenn es Teile gibt, die nicht unbedingt erforderlich sind (z. B. Teilzeichenfolgen, die einen Teil des Ressourcennamens ausmachen), ist es meiner Meinung nach besser, sie im benutzerdefinierten Abschnitt zu definieren.

Definieren Sie Umgebungsvariablen in Python in settings.py

Wenn Sie Umgebungsvariablen aus Python verarbeiten möchten, sollten Sie os.environ verwenden. Es gibt jedoch keine Möglichkeit, den Variablennamen Typo beim Codieren zu bemerken, da die automatische Vervollständigung der IDE bei diesem Schreiben nicht funktioniert. Es ist keine gute Entwicklungserfahrung, eine falsche Eingabe von Umgebungsvariablen zu bemerken, bis Sie sie bereitstellen. Außerdem scheint es eine Verletzung von DRY zu sein, os.environ jedes Mal zu verwenden, wenn die Anzahl der Lambda-Handler zunimmt.

Um dies zu verhindern, laden Sie Umgebungsvariablen und erstellen Sie settings.py, um sie als Python-Konstanten zu definieren. Der gesamte Python-Code sollte Umgebungsvariablen aus diesem Modul lesen. Auf diese Weise können Sie die automatische Vervollständigung der IDE nutzen und gleichzeitig DRY beibehalten, wodurch die Möglichkeit von Tippfehlern verringert wird.

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

Zu diesem Zeitpunkt wird python-dotenv verwendet, um die .env entsprechend der Stufe zu laden. Ich erwarte, dass .env im Projektstamm ist. Suchen Sie das relative Verzeichnis für Einstellungen in Pathlib, verwenden Sie die Umgebungsvariable MYAPP_STAGE_NAME, um den Stufennamen zu bestimmen, und verwenden Sie diesen Namen als Suffix .env.

Zusammenfassung

Sowohl Serverless Framework als auch Python verfügen über zusätzliche Pakete für die Arbeit mit .env. Lassen Sie uns Umgebungsvariablen gut nutzen, indem Sie diese verwenden.

Möglicherweise enthält Ihr Code Verweise auf Ressourcennamen, z. B. DynamoDB- und SQS-Ressourcenkennungen. In solchen Fällen können auch Umgebungsvariablen verwendet werden. Durch die Definition als Umgebungsvariable kann die Variable auch dann wiederverwendet werden, wenn auf den Ressourcennamen in der Vorlage verwiesen wird.

Verwenden wir os.environ, um ein Modul zum Gruppieren von Umgebungsvariablen in Python-Konstanten zu erstellen. Sie können auch die automatische Vervollständigung der IDE verwenden. Da die Beschreibung an einer Stelle zentralisiert ist, ist es weniger wahrscheinlich, dass Fehler auftreten, und dies ist einfach.

Recommended Posts

Verwendung von Umgebungsvariablen für Serverless Framework und Python und Verwaltung von Phasen
So installieren und verwenden Sie pandas_datareader [Python]
Python: Verwendung von Einheimischen () und Globalen ()
Verwendung von Python zip und Aufzählung
Verwendung ist und == in Python
[Python] Verwendung von Hash-Funktion und Taple.
Verwenden Sie os.getenv, um Umgebungsvariablen in Python abzurufen
[Python] [Django] Verwendung des Auswahlfelds und Hinzufügen von Optionen
python3: Verwendung der Flasche (2)
[Python] Verwendung von Liste 1
Wie benutzt man Python Argparse?
Python: Wie man pydub benutzt
[Python] Verwendung von checkio
Julia Quick Look Note [01] Verwendung von Variablen und Konstanten
[Python] Verwendung von input ()
Wie benutzt man Python Lambda?
[Python] Verwendung von virtualenv
python3: Verwendung der Flasche (3)
python3: Wie man eine Flasche benutzt
Verwendung von Python-Bytes
[Python] Wie man mit Klassenvariablen mit Dekorator und Metaklasse spielt
[Einführung in die Udemy Python3 + -Anwendung] 36. Verwendung von In und Not
[Python] Zusammenfassung der Verwendung von Split- und Join-Funktionen
Vergleich der Verwendung von Funktionen höherer Ordnung in Python 2 und 3
Übersicht über die virtuelle Python-Umgebung und deren Erstellung
Python: So verwenden Sie Async mit
So installieren und verwenden Sie Tesseract-OCR
[Python] Verwendung der Pandas-Serie
Verwendung von Anfragen (Python Library)
Verwendung von SQLite in Python
Verwendung von .bash_profile und .bashrc
So installieren und verwenden Sie Graphviz
[Python] Verwendung von Liste 3 Hinzugefügt
Wie man MySQL mit Python benutzt
Verwendung der Python-API von OpenPose
Verwendung von ChemSpider in Python
Python: Verwendung von pydub (Wiedergabe)
Verwendung von PubChem mit Python
Verwendung der Zip-Funktion von Python
[Python] Verwendung der Typetalk-API
Verwendung von Funktionen in separaten Dateien Perl-Version und Python-Version
[Einführung in Python] Verwendung des Booleschen Operators (und ・ oder ・ nicht)
So erstellen Sie eine Python- und Jupyter-Ausführungsumgebung mit VSCode
[Python] Zusammenfassung der Verwendung von Pandas
So verpacken und verteilen Sie Python-Skripte
[Python] Verwenden Sie und und oder beim Erstellen von Variablen
Dynamisches Definieren von Variablen in Python
[Python] Verwendung von __command__, Funktionserklärung
So bereiten Sie die Python-Entwicklungsumgebung vor [Mac]
[Python] Verwendung von import sys sys.argv
[Python] Organisieren der Verwendung für Anweisungen
Memorandum über die Verwendung von Gremlin Python
[Python2.7] Zusammenfassung der Verwendung von unittest
Verweisen auf Umgebungsvariablen in Python in Blender
Verwendung von __slots__ in der Python-Klasse
Verwendung von Tensorflow unter Docker-Umgebung
Verwendung von "deque" für Python-Daten