0

J'essaie d'obtenir le groupe de sécurité par ID de groupe.Boto: comment obtenir le groupe de sécurité par ID?

Voici le code:

#!/usr/bin/env python2.7 
import boto.ec2 
import argparse 

parser = argparse.ArgumentParser(description="") 
parser.add_argument('sec_group_id', help='Security group id') 
parser.add_argument('region_name', help='Region name') 
args = parser.parse_args() 
sec_group_id = args.sec_group_id 
region_name = args.region_name 

conn = boto.ec2.connect_to_region(region_name); 

GivenSecGroup=conn.get_all_security_groups(sec_group_id) 

Quand j'exécute ceci:

./sec_groups.py sg-45b9a12c eu-central-1 

Je reçois la sortie:

Traceback (most recent call last): 
    File "./sec_groups.py", line 22, in <module> 
    GivenSecGroup=conn.get_all_security_groups(sec_group_id) 
    File "/usr/lib/python2.7/dist-packages/boto/ec2/connection.py", line 2969, in get_all_security_groups 
    [('item', SecurityGroup)], verb='POST') 
    File "/usr/lib/python2.7/dist-packages/boto/connection.py", line 1182, in get_list 
    raise self.ResponseError(response.status, response.reason, body) 
boto.exception.EC2ResponseError: EC2ResponseError: 400 Bad Request 
<?xml version="1.0" encoding="UTF-8"?> 
<Response><Errors><Error><Code>InvalidGroup.NotFound</Code><Message>The security group 'sg-45b9a12c' does not exist in default VPC 'vpc-d289c0bb'</Message></Error></Errors><RequestID>edf2afd0-f552-4bdf-938e-1bccef798145</RequestID></Response> 

Donc, fondamentalement, il dit: « Le groupe de sécurité « sg -45b9a12c 'n'existe pas par défaut VPC' vpc-d289c0bb '"

Mais ce groupe de sécurité existe dans VPC par défaut! Voici la preuve: AWS console screenshot

Comment puis-je faire ce travail?

Je vous serais reconnaissant de votre réponse.

Répondre

2

Réponse courte:

il suffit de changer

GivenSecGroup=conn.get_all_security_groups(sec_group_id) 

à

GivenSecGroup=conn.get_all_security_groups(group_ids=[sec_group_id]) 

Réponse longue:

get_all_security_groups premier argument i s une liste de noms de groupes de sécurité et le second est la liste des ids:

def get_all_security_groups(self, groupnames=None, group_ids=None, 
          filters=None, dry_run=False): 
    """ 
    Get all security groups associated with your account in a region. 

    :type groupnames: list 
    :param groupnames: A list of the names of security groups to retrieve. 
         If not provided, all security groups will be 
         returned. 

    :type group_ids: list 
    :param group_ids: A list of IDs of security groups to retrieve for 
         security groups within a VPC. 
+0

Merci beaucoup, Vor! C'est ce dont j'avais besoin! – Ivan

1

Je montrerai réponse alternative boto3 à côté @Vor. À mon humble avis, vous devriez passer à boto3, le développeur a précisé que boto ne supportera pas les nouvelles fonctionnalités. Vous n'avez pas besoin de spécifier la région, vous pouvez lier la région à l'intérieur du fichier d'identification, etc.

import boto3 
import argparse 
ec2=boto3.client("ec2") 
parser = argparse.ArgumentParser(description="") 
parser.add_argument('sec_group_id', help='Security group id') 
args = parser.parse_args() 
sec_group_id = args.sec_group_id 

my_sec_grp = ec2.describe_security_groups(GroupIds = [sec_group_id]) 

Boto3 sont étroitement liés à AWS Cli. Le cli AWS actuel a des fonctionnalités telles que "--query" qui permettent à l'utilisateur de filtrer le retour des résultats. Si AWS implémente ces fonctionnalités, ce sera dans boto3, pas boto.