[PYTHON] Résumé de l'écriture d'AWS Lambda

Il y a des moments où vous voulez ○○ utiliser AWS Lambda.

A cette époque, j'avais du mal avec de faibles compétences en Lambda et en langages de programmation, donc je vais résumer la stratégie pour moi et le monde.

Python est le seul langage utilisé dans cet article.

De base

Organisez ce que vous voulez faire

Tout d'abord, voyons ce que nous voulons faire avec Lambda. (En supposant que cela puisse être réalisé avec d'autres services)

Voici un exemple.

Créez un instantané automatique car il ne prend qu'une seule sauvegarde par jour. Tout ce que vous avez à faire est d'obtenir une liste d'instances RDS, d'obtenir le nom de l'instance RDS cible balisée et de prendre un instantané. Vous pouvez également spécifier le nom RDS et exécuter l'instantané.

Les instantanés EBS peuvent être automatisés à l'aide d'Amazon Data Lifecycle Manager (DLM), mais les copies régionales ne sont pas possibles, alors créez-les. Tout ce que vous avez à faire est de sélectionner l'achèvement de l'instantané EBS dans l'événement CloudWatch, de définir la cible sur Lambda et de l'utiliser comme déclencheur pour obtenir le nom EBS cible et effectuer une copie DR.

Organisons ce que nous voulons faire de cette manière. La plupart de ce que je veux faire avec Lambda semble être pour l'automatisation et la collaboration interservices. Dans le cas de l'automatisation, pensez à la partie de l'opération sur la console que vous souhaitez automatiser, et dans le cas de la coopération interservices, pensez au début et à la fin. Toutes les opérations sur la console AWS peuvent être exécutées à l'aide d'API, et la coopération interservices doit pouvoir être bien connectée en utilisant CloudWatch, SNS, etc., de sorte qu'elle est relativement facile à organiser.

Trouvez l'action que vous souhaitez faire dans la documentation de boto3

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

Une fois que vous avez décidé de ce que vous voulez faire avec Lambda, consultez la documentation de boto3 pour trouver ce que vous voulez faire.

Par exemple, si vous souhaitez notifier via SNS, reportez-vous à l'URL suivante.

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

** Request Syntax ** est la syntaxe et ** Returns ** est le résultat.

C'est facile à trouver, il suffit de sélectionner le service cible dans "Référence API" de la page supérieure de boto3 et de rechercher l'action que vous voulez faire. Écrivons maintenant Python selon la syntaxe.


import boto3

client = boto3.client('sns')

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

Une description de chaque paramètre est également fournie dans la documentation. Dans le cas ci-dessus, «TopicArn» est l'ARN du sujet SNS, «Message» est le corps et «Subject» est le sujet.

N'oubliez pas non plus de créer un objet d'instance lorsque vous utilisez boto3. Si vous regardez la documentation, vous verrez une table des matières, mais si vous la sélectionnez, elle est probablement répertoriée en premier. Après cela, il y a une liste de chaque action, alors n'oubliez pas de créer l'objet d'instance dont vous avez besoin pour ce que vous voulez utiliser (ce n'est pas ** boto3.client ** pour quoi que ce soit). Par ailleurs, dans le cas de "publish ()" du SNS utilisé ci-dessus, il est fait référence à ce qui suit.

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

Utiliser des variables d'environnement

Faisons-en une fonction à usage général en utilisant des variables d'environnement. C'est plus facile à gérer si vous n'écrivez pas autant que possible des informations dans le code.

Dans le cas de Lambda qui notifie le SNS plus tôt, vous pouvez procéder comme suit.


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

En faisant cela, si vous souhaitez modifier la rubrique SNS cible, il vous suffit de modifier la variable d'environnement pour ne pas toucher au code. Par conséquent, cela conduit à une réduction de l'erreur humaine. Profitons-en.

Techniques fréquemment utilisées

Recevez la valeur de l'événement CloudWatch

Par exemple, si vous souhaitez utiliser la valeur transmise depuis CloudWatch lors de l'utilisation de CloudWatch comme déclencheur, la variable d'événement contient la valeur. Ce qui suit est déclenché par l'achèvement de l'instantané EBS.


import boto3

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

Si vous recherchez "instantané ec2 de l'événement cloud watach", le document AWS sera atteint. Vous pouvez vérifier ce qui est passé, alors vérifions ce que vous voulez obtenir. Si vous recherchez d'autres événements CloudWatch avec le "cloudwatch event xxx" de base, les documents AWS apparaîtront dans les résultats de la recherche, c'est donc une bonne idée de voir à l'avance quelles valeurs seront transmises.

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

En passant, il existe des cas où vous n'avez pas à créer une fonction inutile en sélectionnant "Constante (texte JSON)" dans le paramètre cible de l'événement CloudWatch et en contrôlant le comportement de Lambda. Ce qui suit est Lambda qui démarre et arrête EC2.

Constante {"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))

Cette méthode est basée sur l'article suivant.

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/

Déclencher SNS

Vous pouvez établir un lien avec divers services en sélectionnant le déclencheur comme sujet SNS.

Par exemple, si vous souhaitez effectuer une copie DR déclenchée par une notification de fin d'instantané d'un abonnement à un événement RDS, vous ne pouvez pas définir l'abonnement aux événements RDS comme déclencheur pour Lambda, mais vous pouvez notifier la rubrique SNS une fois et utiliser cette rubrique SNS comme déclencheur pour Lambda. Peut être exécuté.

En d'autres termes, en plaçant des ** sujets SNS entre **, chaque service et Lambda peuvent être liés. SNS peut être lié à divers services, donc si vous pensez que vous ne pouvez pas établir de lien avec Lambda, vous voudrez peut-être vérifier si vous pouvez établir un lien avec SNS.

Lire des fichiers depuis S3

Parfois, je veux lire un fichier depuis S3.

Dans ce cas, essayez ce qui suit.


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)

Ce qui précède lit un fichier CSV qui répertorie les jours fériés japonais.

Cette méthode est basée sur l'article suivant.

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

Ce que je fais personnellement


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

Je vois souvent des noms de région écrits comme ci-dessus, mais je ne les écris pas parce que je pense que je dois utiliser une autre région.


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

Mettez les constantes en dehors de la fonction. Il ne s'agit simplement pas de faire une erreur.

Si vous utilisez une bibliothèque externe, vous devrez tout télécharger en même temps avec zip, donc implémentez-la autant que possible avec une bibliothèque standard. Lors du test de Lambda, il est juste ennuyeux de télécharger à chaque fois.


Nous espérons que vous trouverez cela utile.

Thanks.

Recommended Posts

Résumé de l'écriture d'AWS Lambda
Résumé de l'étude de Python pour utiliser AWS Lambda
Résumé de l'utilisation de pandas.DataFrame.loc
Résumé de l'utilisation de pyenv-virtualenv
Résumé de l'utilisation de csvkit
Résumé de l'écriture des fichiers .proto utilisés dans gRPC
[Python] Résumé de l'utilisation des pandas
[Python2.7] Résumé de l'utilisation d'unittest
Résumé de l'utilisation de la liste Python
[Python2.7] Résumé de l'utilisation du sous-processus
Résumé de la façon d'importer des fichiers dans Python 3
[AWS / Lambda] Comment charger une bibliothèque externe Python
XPath Basics (2) - Comment écrire XPath
[Blender] Résumé de la procédure d'installation / de mise à jour / de désinstallation des modules complémentaires
Comment écrire un type liste / dictionnaire de Python3
Comment configurer Layer sur Lambda à l'aide d'AWS SAM
[Python] Résumé de la façon de spécifier la couleur de la figure
Comment utiliser Python lambda
Résumé de la façon de partager l'état avec plusieurs fonctions
[Python] Résumé des fonctions eval / exec + Comment écrire une chaîne de caractères avec des sauts de ligne
Comment écrire un exemple d'implémentation E14 Python en temps réel hors ligne
[python] Résumé de la récupération des listes et des éléments du dictionnaire
Comment activer la lecture / écriture de net.Conn avec Golang pour annuler avec le contexte
[Linux] [C / C ++] Résumé de la façon d'obtenir pid, ppid, tid
[Python] Résumé de l'utilisation des fonctions de fractionnement et de jointure
Récapitulatif si vous utilisez AWS Lambda (Python)
Comment écrire sobrement avec des pandas
Réutilisation du flacon Comment écrire du HTML
Ecrire une fonction AWS Lambda en Python
Tweet Récapitulatif WakaTime à l'aide d'AWS Lambda
Comment écrire une image de base Docker
Comment ajouter un volume AWS EBS
Comment écrire un fichier wsgi.py indépendant de l'environnement Django1.9
Comment obtenir les informations des organisations, Cost Explorer d'un autre compte AWS avec Lambda (python)
Comment créer des couches AWS Lambda lors de l'exécution de sélénium × chrome sur AWS Lambda
[Hugo] Résumé de la façon d'ajouter des pages au site créé avec Learn
Comment écrire un exemple d'implémentation Python du problème E15 en temps réel hors ligne
Grammaire de base du système Python3 (comment utiliser les fonctions, la fermeture, la fonction lambda)
J'ai essayé de résumer brièvement la procédure de démarrage du développement de Django
Comment créer une API de machine learning sans serveur avec AWS Lambda
scikit-learn Comment utiliser le résumé (apprentissage automatique)
Comment accélérer la belle instanciation de soupe
Qiita (1) Comment écrire un nom de code
Comment définir optuna (comment écrire un espace de recherche)
Comment se débarrasser des longues inclusions
Comment écrire des commentaires de document Python (Docstrings)
Publiez régulièrement sur Twitter en utilisant AWS lambda!
Comment accéder à RDS depuis Lambda (python)
Jupyter Notebook Principes d'utilisation
Bases de PyTorch (1) -Comment utiliser Tensor-
Connectez-vous à s3 avec AWS Lambda Python
Résumé de vtkThreshold (mis à jour de temps en temps)
Comment écrire ce processus en Perl?
Comment écrire Ruby to_s en Python
[AWS] Résumé des contre-mesures d'erreur d'installation de l'interface de ligne de commande
Comment écrire des commentaires pydoc et multi-lignes
[Question] Comment utiliser plot_surface de python
J'ai essayé d'informer le serveur Zabbix d'une erreur d'exécution de la fonction AWS Lambda
Un mémorandum sur la façon d'écrire des pandas que j'ai tendance à oublier personnellement