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.
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).
Die folgenden Pakete und Plug-Ins werden verwendet.
Serverless Framework
Python
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.
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.
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