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