[PYTHON] Zusammenfassung des Schreibens von AWS Lambda

Es gibt Zeiten, in denen Sie ○○ mit AWS Lambda ausführen möchten.

Zu dieser Zeit hatte ich Schwierigkeiten mit geringen Kenntnissen in Lambda und Programmiersprachen, daher werde ich die Strategie für mich und die Welt zusammenfassen.

Python ist die einzige in diesem Artikel verwendete Sprache.

Basic

Organisieren Sie, was Sie tun möchten

Lassen Sie uns zunächst klären, was wir mit Lambda machen wollen. (Vorausgesetzt, es kann mit anderen Diensten realisiert werden)

Hier ist ein Beispiel.

Erstellen Sie einen automatischen Snapshot, da nur einmal am Tag ein Backup erstellt wird. Sie müssen lediglich eine Liste der RDS-Instanzen abrufen, den Namen der markierten Ziel-RDS-Instanz abrufen und einen Snapshot erstellen. Alternativ können Sie den RDS-Namen angeben und den Snapshot ausführen.

EBS-Snapshots können mit Amazon Data Lifecycle Manager (DLM) automatisiert werden. Regionskopien sind jedoch nicht möglich. Erstellen Sie sie daher. Sie müssen lediglich den Abschluss des EBS-Snapshots im CloudWatch-Ereignis auswählen, das Ziel auf Lambda festlegen und diesen als Auslöser verwenden, um den EBS-Zielnamen abzurufen und eine DR-Kopie durchzuführen.

Lassen Sie uns organisieren, was wir auf diese Weise tun möchten. Das meiste, was ich mit Lambda machen möchte, scheint für die Automatisierung und die Zusammenarbeit zwischen Diensten zu sein. Überlegen Sie sich bei der Automatisierung, welchen Teil des Vorgangs auf der Konsole Sie automatisieren möchten, und bei der Zusammenarbeit zwischen Diensten den Anfang und das Ende. Alle Vorgänge auf der AWS-Konsole können mithilfe von APIs ausgeführt werden, und die Zusammenarbeit zwischen Diensten sollte mithilfe von CloudWatch, SNS usw. gut verbunden werden können, sodass die Organisation relativ einfach ist.

Die Aktion, die Sie ausführen möchten, finden Sie in der boto3-Dokumentation

https://boto3.amazonaws.com/v1/documentation/api/latest/index.html

Wenn Sie sich entschieden haben, was Sie mit Lambda tun möchten, lesen Sie in der boto3-Dokumentation nach, was Sie tun möchten.

Wenn Sie beispielsweise über SNS benachrichtigen möchten, beziehen Sie sich auf die folgende URL.

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sns.html#SNS.Client.publish

** Anforderungssyntax ** ist die Syntax und ** Rückgabe ** ist das Ergebnis.

Es ist leicht zu finden. Wählen Sie einfach den Zieldienst in "API-Referenz" auf der oberen Seite von boto3 aus und suchen Sie nach der Aktion, die Sie ausführen möchten. Schreiben wir nun Python gemäß der Syntax.


import boto3

client = boto3.client('sns')

response = client.publish(
    TopicArn='xxxxxx',
    Message='Hello',
    Subject='This is test'
)

Eine Beschreibung der einzelnen Parameter finden Sie auch in der Dokumentation. Im obigen Fall ist "TopicArn" die ARN des SNS-Themas, "Message" der Text und "Subject" der Betreff.

Vergessen Sie auch nicht, ein Instanzobjekt zu erstellen, wenn Sie boto3 verwenden. Wenn Sie sich die Dokumentation ansehen, sehen Sie ein Inhaltsverzeichnis. Wenn Sie es jedoch auswählen, wird es wahrscheinlich zuerst aufgeführt. Danach gibt es eine Liste aller Verhaltensweisen. Vergessen Sie also nicht, das Instanzobjekt zu erstellen, das Sie für das benötigen, was Sie verwenden möchten (es ist für nichts ** boto3.client **). Übrigens wird im Fall von "Publish ()" des oben verwendeten SNS auf Folgendes Bezug genommen.

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sns.html#client

Verwenden Sie Umgebungsvariablen

Machen wir es zu einer universellen Funktion, indem wir Umgebungsvariablen verwenden. Es ist einfacher zu verwalten, wenn Sie nicht so viele Informationen wie möglich in den Code schreiben.

Im Fall von Lambda, das den SNS früher benachrichtigt, können Sie wie folgt vorgehen.


import boto3
import os

client = boto3.client('sns')
arn_sns = os.environ['ARN']

response = client.publish(
    TopicArn=arn_sns,
    Message='Hello',
    Subject='This is test'
)

Wenn Sie auf diese Weise das SNS-Zielthema ändern möchten, müssen Sie nur die Umgebungsvariable ändern, damit Sie den Code nicht berühren. Daher führt dies zu einer Verringerung menschlicher Fehler. Lassen Sie uns davon Gebrauch machen.

Häufig verwendete Techniken

Erhalten Sie den Wert des CloudWatch-Ereignisses

Wenn Sie beispielsweise den von CloudWatch übergebenen Wert verwenden möchten, wenn Sie CloudWatch als Auslöser verwenden, enthält die Ereignisvariable den Wert. Das Folgende wird durch den Abschluss des EBS-Snapshots ausgelöst.


import boto3

def lambda_handler(event,context):
    snaphost_create_time = event['time']
    print(snaphost_create_time)

Wenn Sie nach "Cloud Watach Event Ec2 Snapshot" googeln, wird das AWS-Dokument getroffen. Sie können überprüfen, was übergeben wurde. Lassen Sie uns also überprüfen, was Sie erhalten möchten. Wenn Sie mit dem grundlegenden "Cloudwatch-Ereignis xxx" nach anderen CloudWatch-Ereignissen suchen, werden AWS-Dokumente in den Suchergebnissen angezeigt. Es empfiehlt sich daher, im Voraus zu prüfen, welche Werte übergeben werden.

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-cloud-watch-events.html#create-snapshot-complete

Übrigens gibt es Fälle, in denen Sie keine nutzlose Funktion erstellen müssen, indem Sie "Konstante (JSON-Text)" auswählen, um das Verhalten von Lambda in der Zieleinstellung des CloudWatch-Ereignisses zu steuern. Das Folgende ist Lambda, das EC2 startet und stoppt.

Konstante {"Action": "start", "Instances": ["************"]}


import boto3

ec2 = boto3.client('ec2')
 
def lambda_handler(event, context):
    instances = event['Instances']
    if event['Action'] == 'start':
        ec2.start_instances(InstanceIds=instances)
        print ('started your instances: ' + ", ".join(instances))
    elif event['Action'] == 'stop':
        ec2.stop_instances(InstanceIds=instances)
        print ('stopped your instances: ' + ", ".join(instances))

Diese Methode basiert auf dem folgenden Artikel.

https://www.simpline.co.jp/tech/awslambda%E3%81%A7ec2%E3%81%AE%E8%B5%B7%E5%8B%95%E3%83%BB%E5%81%9C%E6%AD%A2%E3%82%92%E5%88%B6%E5%BE%A1%E3%81%99%E3%82%8B/

SNS auslösen

Sie können eine Verknüpfung mit verschiedenen Diensten herstellen, indem Sie den Auslöser als SNS-Thema auswählen.

Wenn Sie beispielsweise eine DR-Kopie erstellen möchten, die durch eine Benachrichtigung über den Abschluss eines Snapshots eines RDS-Ereignisabonnements ausgelöst wird, können Sie das RDS-Ereignisabonnement nicht als Auslöser für Lambda festlegen. Sie können das SNS-Thema jedoch einmal benachrichtigen und dieses SNS-Thema als Auslöser für Lambda verwenden. Kann ausgeführt werden.

Mit anderen Worten, indem ** SNS-Themen dazwischen ** gesetzt werden, können jeder Dienst und Lambda verknüpft werden. SNS kann mit verschiedenen Diensten verknüpft werden. Wenn Sie also der Meinung sind, dass Sie keine Verknüpfung mit Lambda herstellen können, sollten Sie prüfen, ob Sie eine Verknüpfung mit SNS herstellen können.

Lesen Sie Dateien aus S3

Manchmal möchte ich eine Datei aus S3 lesen.

Versuchen Sie in einem solchen Fall Folgendes.


import boto3

s3 = boto3.client('s3')
bucket_name = os.environ['BUCKET']

def lambda_handler(event, context):
    file_name = 'syukujitsu.csv' 
    
    response = s3.get_object(Bucket=bucket_name, Key=file_name)
    body = response['Body'].read()

    bodystr = body.decode('utf-8')
    lines = bodystr.split('\r\n')
    
    print(lines)

Oben wird eine CSV-Datei gelesen, in der japanische Feiertage aufgelistet sind.

Diese Methode basiert auf dem folgenden Artikel.

https://www.kabegiwablog.com/entry/2018/01/17/090000

Was ich persönlich mache


region_name = "ap-northeast-1"
ec2 = boto3.client('ec2', region_name=region)

Ich sehe oft Regionsnamen, die wie oben geschrieben sind, aber ich schreibe sie nicht, weil ich denke, dass ich eine andere Region verwenden muss.


import boto3

s3 = boto3.client('s3')
bucket_name = os.environ['BUCKET']

def lambda_handler(event, context):
    response = s3.get_object(Bucket=bucket_name, Key=file_name)
    print(response['Body'])

Setzen Sie die Konstanten außerhalb der Funktion. Dies ist einfach kein Fehler.

Wenn Sie eine externe Bibliothek verwenden, müssen Sie alle gleichzeitig mit zip hochladen. Implementieren Sie sie daher so weit wie möglich mit einer Standardbibliothek. Beim Testen von Lambda ist es nur ärgerlich, jedes Mal hochzuladen.


Wir hoffen, Sie finden dies hilfreich.

Thanks.

Recommended Posts

Zusammenfassung des Schreibens von AWS Lambda
Zusammenfassung des Studiums von Python zur Verwendung von AWS Lambda
Zusammenfassung der Verwendung von pandas.DataFrame.loc
Zusammenfassung der Verwendung von pyenv-virtualenv
Zusammenfassung der Verwendung von csvkit
Zusammenfassung zum Schreiben von in gRPC verwendeten .proto-Dateien
[Python] Zusammenfassung der Verwendung von Pandas
[Python2.7] Zusammenfassung der Verwendung von unittest
Zusammenfassung der Verwendung der Python-Liste
[Python2.7] Zusammenfassung der Verwendung des Unterprozesses
Zusammenfassung zum Importieren von Dateien in Python 3
[AWS / Lambda] Laden einer externen Python-Bibliothek
XPath-Grundlagen (2) - So schreiben Sie XPath
[Blender] Zusammenfassung der Installation / Aktualisierung / Deinstallation von Add-Ons
So schreiben Sie einen Listen- / Wörterbuchtyp von Python3
So konfigurieren Sie Layer auf Lambda mit AWS SAM
[Python] Zusammenfassung, wie die Farbe der Figur angegeben wird
Wie benutzt man Python Lambda?
Zusammenfassung, wie der Status mit mehreren Funktionen geteilt wird
[Python] Zusammenfassung der Funktionen eval / exec + Schreiben einer Zeichenfolge mit Zeilenumbrüchen
Offline-Echtzeit zum Schreiben eines E14 Python-Implementierungsbeispiels
[Python] Zusammenfassung zum Abrufen von Listen und Wörterbuchelementen
So aktivieren Sie das Lesen / Schreiben von net.Conn mit golang, um mit dem Kontext abzubrechen
[Linux] [C / C ++] Zusammenfassung, wie man pid, ppid, tid bekommt
[Python] Zusammenfassung der Verwendung von Split- und Join-Funktionen
Zusammenfassung bei Verwendung von AWS Lambda (Python)
Wie man nüchtern mit Pandas schreibt
Wiederverwendung von Flaschen Wie schreibe ich HTML?
Schreiben Sie die AWS Lambda-Funktion in Python
Tweet WakaTime Zusammenfassung mit AWS Lambda
So schreiben Sie ein Docker-Basis-Image
So fügen Sie ein AWS EBS-Volume hinzu
Wie schreibe ich Django1.9 umweltunabhängig wsgi.py
So erhalten Sie Informationen von Organisationen, Cost Explorer eines anderen AWS-Kontos bei Lambda (Python)
So erstellen Sie AWS Lambda-Schichten, wenn Selen × Chrom auf AWS Lambda ausgeführt wird
[Hugo] Zusammenfassung zum Hinzufügen von Seiten zu der mit Learn erstellten Site
Offline-Echtzeit zum Schreiben eines Python-Implementierungsbeispiels für das E15-Problem
Grundlegende Grammatik des Python3-Systems (Verwendung von Funktionen, Schließung, Lambda-Funktion)
Ich habe versucht, das Entwicklungsstartverfahren von Django kurz zusammenzufassen
So erstellen Sie mit AWS Lambda eine serverlose API für maschinelles Lernen
scikit-learn Verwendung der Zusammenfassung (maschinelles Lernen)
Wie man die schöne Suppeninstanziierung beschleunigt
Qiita (1) Wie schreibe ich einen Codenamen?
Wie man optuna einstellt (wie man einen Suchraum schreibt)
Wie man lange Einschlüsse loswird
So schreiben Sie Python-Dokumentkommentare (Docstrings)
Poste regelmäßig mit AWS Lambda auf Twitter!
Zugriff auf RDS von Lambda (Python)
Jupyter Notebook Grundlagen der Verwendung
Grundlagen von PyTorch (1) - Verwendung von Tensor-
Stellen Sie mit AWS Lambda Python eine Verbindung zu s3 her
Zusammenfassung von vtkThreshold (von Zeit zu Zeit aktualisiert)
Wie schreibe ich diesen Prozess in Perl?
Wie schreibe ich Ruby to_s in Python
[AWS] Zusammenfassung der Gegenmaßnahmen gegen CLI-Installationsfehler
Wie schreibe ich pydoc und mehrzeilige Kommentare
[Frage] Wie verwende ich plot_surface von Python?
Ich habe versucht, Zabbix Server über einen Ausführungsfehler der AWS Lambda-Funktion zu informieren
Ein Memorandum darüber, wie man Pandas schreibt, das ich persönlich oft vergesse