Je suis Wakamatsu, un débutant de Lambda (Python).
Du coup, utilisez-vous tous Lambda?
Le code fonctionne sans serveur. C'est attrayant, n'est-ce pas?
Après tout, les temps sont sans serveur. Je veux pouvoir utiliser environ une langue dans l'infrastructure.
Au milieu d'une génération généreuse qui ne va pas à l'encontre d'une telle tendance, je suis finalement entré dans Lambda.
L'introduction est devenue plus longue, mais j'espère que la boutique d'infrastructure aura l'air chaleureuse avec le sentiment de se débattre et de faire des blagues.
Je souhaite obtenir l'ID d'instance d'une instance qui a une adresse IP spécifique.
AWS Lambda Python 3.6
Pour le moment, j'ai décidé de récupérer toutes les informations de l'instance, j'ai donc écrit le code suivant.
import boto3
def lambda_handler(event, context):
ec2 = boto3.client('ec2')
responce = ec2.describe_instances()
return responce
Le retour échoue avec l'erreur suivante
{
"errorMessage": "An error occurred during JSON serialization of response",
"errorType": "datetime.datetime(2017, 5, 11, 5, 15, 59, tzinfo=tzlocal()) is not JSON serializable"
}
Il semble que le résultat ne puisse pas être traité comme JSON tel quel.
Quand j'appelle la référence boto3, il semble que la valeur de retour de describe_instances soit de type dict (dictionary). Pour le moment, il vaut mieux sortir avec print, j'ai donc décidé de changer le code.
Changer la sortie en une instruction d'impression pour le moment
import boto3
def lambda_handler(event, context):
ec2 = boto3.client('ec2')
responce = ec2.describe_instances()
print(responce)
return
Ce qui suit a été affiché dans le journal. C'est ce que vous voyez souvent dans les résultats de l'AWS CLI.
{
"Reservations": [
{
"OwnerId": "xxxxxxxxxxxx",
"ReservationId": "r-xxxxxxxxxxxxxxxxx",
"Groups": [],
"Instances": [
{
"Monitoring": {
"State": "disabled"
},
"PublicDnsName": "ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com",
"Platform": "xxxxxxx",
"State": {
"Code": 80,
"Name": "stopped"
},
"EbsOptimized": false,
"LaunchTime": "xxxx-xx-xxxxx:xx:xx.xxxx",
"PublicIpAddress": "xxx.xxx.xxx.xxx",
"PrivateIpAddress": "xxx.xxx.xxx.xxx",
"ProductCodes": [],
"VpcId": "vpc-xxxxxxx",
"StateTransitionReason": "",
"InstanceId": "i-xxxxxxxxxxxxxxxxx",
"EnaSupport": true,
"ImageId": "ami-xxxxxxxx",
Ce qui suit est omis
Ensuite, je voudrais affiner par IP.
Il semble que --filter
dans AWS CLI soit également dans boto3, j'ai donc décidé de l'utiliser.
Ajout de filtres pour se limiter aux instances qui ont une adresse IP spécifique
import boto3
def lambda_handler(event, context):
ec2 = boto3.client('ec2')
responce = ec2.describe_instances(
Filters=[{'Name':'network-interface.addresses.private-ip-address','Values':["xxx.xxx.xxx.xxx"]}]
)
print(responce)
return
Limité aux instances avec l'adresse IP spécifiée.
Ensuite, réduisez la valeur de retour à l'ID d'instance.
L'image est --query
dans AWS CLI, mais elle ne semble pas être dans boto3.
J'ai eu du mal parce que j'ai été dansé par les informations sur le net parce que je convertissais en JSON ici.
En conséquence, j'ai trouvé que le type dict semble être capable de récupérer la valeur en écrivant ["hoge"] ["fuga"] après l'objet.
import boto3
def lambda_handler(event, context):
ec2 = boto3.client('ec2')
responce = ec2.describe_instances(
Filters=[{'Name':'network-interface.addresses.private-ip-address','Values':["xxx.xxx.xxx.xxx"]}]
)["Reservations"][0]["Instances"][0]["InstanceId"]
print(responce)
return
Félicitations pour l'obtention de l'ID d'instance. Je voudrais noter qu'il est nécessaire d'écrire explicitement 0 comme «[0]» lorsqu'il y a une liste.
Qu'as-tu pensé. Le contenu que je fais est très rudimentaire, mais j'y étais accro, alors je l'ai résumé sous forme de mémorandum.
Il est étonnamment facile à déplacer, alors essayez-le. Lambda je n'ai pas peur.
Recommended Posts