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.
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.
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
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.
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/
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.
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
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.