[PYTHON] Décrivez ec2 avec boto3 et récupérez la valeur

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.

Chose que tu veux faire

Je souhaite obtenir l'ID d'instance d'une instance qui a une adresse IP spécifique.

environnement

AWS Lambda Python 3.6

Première forme

code

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

résultat

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.

Enquête

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.

Deuxième forme

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

résultat

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

Enquête

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.

Troisième forme

code

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

résultat

Limité aux instances avec l'adresse IP spécifiée.

Enquête

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.

Forme définitive

code

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

résultat

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.

Résumé

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

Décrivez ec2 avec boto3 et récupérez la valeur
Extraire la valeur maximale avec les pandas et modifier cette valeur
lire le tag qui vous est attribué dans ec2 avec boto3
Extraire la valeur maximale avec les pandas.
Enregistrer et récupérer des fichiers avec Pepper
Pandas avec des changements subtils dans les nombres et comment y faire face
Utiliser Jupyter Lab et Jupyter Notebook avec EC2
Trouvez la valeur SHA256 avec R (avec bonus)
Utilisez .flatten () [0] de numpy pour récupérer la valeur
Remplissez la valeur manquante (null) de DataFrame avec les valeurs avant et après avec pyspark
[Astuces Python] Comment récupérer plusieurs clés avec la valeur maximale du dictionnaire
Gratter l'holojour et l'afficher dans la CLI
Trouvez la valeur de l'humeur avec python (Rike Koi)
Gérez bien AWS avec la bibliothèque Python Boto
Résolution du modèle Lorenz 96 avec Julia et Python
Archivez et compressez tout le répertoire avec python
Décrivez la destination ssh en plusieurs étapes dans la configuration, connectez-vous facilement et copiez le fichier avec scp
Transposons la matrice et multiplions les matrices par numpy.
Comment récupérer la nième plus grande valeur en Python
environnement en ligne de serveur de code (3) Lancer une instance EC2 avec Boto3
Créez Amazon Linux avec AWS EC2 et connectez-vous
Manipuler des objets S3 avec Boto3 (API de haut niveau et API de bas niveau)
[Boto3] Rechercher des utilisateurs Cognito avec l'API List Users
Prenez la valeur du thermo-hygromètre SwitchBot avec Raspberry Pi
Changer les valeurs du thermo-hygromètre Bot avec Raspberry Pi
Extraire des fichiers du stockage EC2 avec la commande scp
Obtenez des commentaires et des abonnés avec l'API de données YouTube
Installez la dernière version stable de Python avec pyenv (à la fois 2 et 3)
Installez Ubuntu 20.04 avec GUI et préparez l'environnement de développement
POSTER l'image avec json et la recevoir avec flask
[Django 2.2] Trier et obtenir la valeur de la destination de la relation
Construisez AWS EC2 et RDS avec Terraform Terraform 3 minutes de cuisson
utiliser autre chose que le profil par défaut avec boto3
Appelez la fonction C avec dart: ffi et rappelez la fonction Dart