2
votes

AWS Lambda va répertorier l'ID d'instance EC2 à l'aide de python boto3

J'essaye de lister l'ID d'instance EC2 en utilisant python boto3. Je suis nouveau sur python.

Le code ci-dessous fonctionne bien

{
  "errorMessage": "'Instances'",
  "errorType": "KeyError",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\", line 10, in lambda_handler\n    for ins_id in instances['Instances']:\n"
  ]
}

La sortie est

import boto3
region = 'ap-south-1'
instance = []
ec2 = boto3.client('ec2', region_name=region)

    def lambda_handler(event, context):
        print('Into DescribeEc2Instance')
        instances = ec2.describe_instances(Filters=[{'Name': 'instance-type', 'Values': ["t2.micro", "t3.micro"]}])
        print(instances)
        for ins_id in instances['Instances']:
                print(ins_id['InstanceId'])

Maintenant, pour supprimer l'ID d'instance de la sortie ci-dessus, j'ai ajouté le code ci-dessous (2 dernières lignes) et pour une raison quelconque, cela ne fonctionne pas.

START RequestId: bb4e9b27-db8e-49fe-85ef-e26ae53f1308 Version: $LATEST
Into DescribeEc2Instance
{'Reservations': [{'Groups': [], 'Instances': [{'AmiLaunchIndex': 0, 'ImageId': 'ami-052c08d70def62', 'InstanceId': 'i-0a22a6209740df', 'InstanceType': 't2.micro', 'KeyName': 'testserver', 'LaunchTime': datetime.datetime(2020, 11, 12, 8, 11, 43, tzinfo=tzlocal()), 'Monitoring': {'State': 'disabled'}

L'erreur est

import boto3
region = 'ap-south-1'
ec2 = boto3.client('ec2', region_name=region)

def lambda_handler(event, context):
    print('Into DescribeEc2Instance')
    instances = ec2.describe_instances(Filters=[{'Name': 'instance-type', 'Values': ["t2.micro", "t3.micro"]}])
    print(instances)


2 commentaires

devrait être des instances['Reservations']['Instances']


@taras a ajouté selon votre commentaire son message d'erreur comme "errorMessage": "les index de liste doivent être des entiers ou des tranches, pas str"


3 Réponses :


3
votes

L'itération de la boucle doit être

for ins_id in instances['Reservations'][0]['Instances']:

puisque vous avez une clé de Reservation au niveau supérieur, puis un tableau et des objets dans le tableau avec la clé Instances qui est elle-même encore un autre tableau que vous itérez ensuite.


1 commentaires

Je l'ai maintenant avec votre explication ... Je dois commencer pour la boucle avec les réservations ... puis la deuxième boucle pour les instances si j'ai plus d'une instance ... je ne sais pas pourquoi quelqu'un a voté contre la question sans commentaire.



2
votes

En fait, les instances['Reservations'][0]['Instances'] peuvent ne pas avoir toutes les instances. Les instances sont regroupées par groupes de sécurité. Différents groupes de sécurité signifient que de nombreux éléments de liste seront présents. Pour obtenir toutes les instances de cette région, vous devez utiliser le code ci-dessous.

Remarque: ['Reservations'][0]['Instances'] ne répertorie pas toutes les instances, il ne vous donne que les instances qui sont regroupées par le premier groupe de sécurité. S'il existe de nombreux groupes, vous n'obtiendrez pas toutes les instances.

import boto3
region = 'ap-south-1'

ec2 = boto3.client('ec2', region_name=region)

def lambda_handler(event, context):
    instance_ids = []
    response = ec2.describe_instances(Filters=[{'Name': 'instance-type', 'Values': ["t2.micro", "t3.micro"]}])
    instances_full_details = response['Reservations']
    for instance_detail in instances_full_details:
        group_instances = instance_detail['Instances']

        for instance in group_instances:
            instance_id = instance['InstanceId']
            instance_ids.append(instance_id)
    return instance_ids


3 commentaires

Got that .. J'ai mentionné dans le commentaire précédent .. avec l'explication luk2302 c'était clair pour moi .. voter votre réponse maintenant .. cela sera utile pour d'autres personnes ..


J'espère que vous avez lu la réponse et que vous avez appris que la réponse regroupe l'ensemble des instances en fonction des groupes de sécurité


Mis en œuvre pour plus d'une instance et fonctionne comme prévu. Merci



0
votes

J'aime cette approche au cas où il y aurait plusieurs réserves:

response = ec2.describe_instances()
for reservation in response['Reservations']:
    for instance in reservation['Instances']:
        print(instance['InstanceId'])


0 commentaires