2013-03-14 3 views
3

У меня возникают некоторые проблемы с битом EC2 Boto (Boto v2.8.0, Python v2.6.7).Как получить Boto для возврата экземпляров EC2 - S3 отлично работает

Первая команда возвращает список S3 Buckets - все хорошо! Вторая команда, чтобы получить список экземпляров EC2 взрывает с 403 с «аутентификацией строки запроса требуется подпись, Истекает и AWSAccessKeyId параметров»

s3_conn = S3Connection(AWSAccessKeyId, AWSSecretKey) 
print s3_conn.get_all_buckets() 

ec2_conn = EC2Connection(AWSAccessKeyId, AWSSecretKey) 
print ec2_conn.get_all_instances() 

Кроме того, мои документы все хороши (Full админ) - I протестировали их, используя Ruby aws-sdk, и EC2 и S3 работают нормально.

Я также заметил, что хозяин атрибут в объекте ec2_conn является s3-eu-west-1.amazonaws.com, «s3» ...? Неужели это неправильно? Я попробовал ретро-привязать его к правильной конечной точке, но не повезло.

Любая помощь будет большим оценить Благодаря

+0

Я посмотрел на Boto [исходный код] (https://github.com/boto/boto/blob/2.8.0/boto/ec2/__init__.py#L42), и там нет ссылки на s3. – ferrix

+0

То же самое применяется [здесь] (https://github.com/boto/boto/blob/2.8.0/boto/ec2/connection.py#L71). – ferrix

+0

Я понял это (ну, я нашел проблему). Я разрабатываю это на своем Mac, на котором установлен Python2.6. Пробовал это на одном из моих ящиков CentOS 6 - отлично работает. Проблема в том, что у меня Mac. Тем не менее, странно, как работает команда S3, но запрос EC2 получает 403 ... – user1741694

ответ

2

Существует команда connect_to_region:

import boto.ec2 

connection = boto.ec2.connect_to_region('eu-west-1', aws_access_key_id=AWSAccessKeyId, 
             aws_secret_access_key=AWSSecretKey) 

Boto tutorial дает еще один способ. Этот метод будет в основном работать так:

import boto.ec2 

for region in boto.ec2.regions(): 
    if region.name == 'my-favorite-region': 
     connection = region.connect() 
     break 

Это не работает на older versions из Бото.

+0

Привет, ferrix, спасибо за ответ. Я пробовал команду connect_to_region - ту же ошибку 403. И boto.ec2.regions(), чтобы захватить правую, но хост всегда, кажется, переходит к "s3 -..." , которая может быть красной селедкой ..? – user1741694

+0

Вы пытались указать свою конечную точку в конфигурации boto? – ferrix

+0

Ваш первый пример - действительно лучший способ получить объект соединения. Я обновлю учебник, чтобы это отразить. – garnaat

6

Вот какой рабочий код я использую, чтобы перечислять все мои экземпляры через потенциально несколько регионов. Он делает гораздо больше, чем вам нужно, но, может быть, вы можете смириться с тем, что хотите.

#!/usr/bin/python 
import boto 
import boto.ec2 
import sys 

class ansi_color: 
    red = '\033[31m' 
    green = '\033[32m' 
    reset = '\033[0m' 
    grey = '\033[1;30m' 


def name(i): 
    if 'Name' in i.tags: 
    n = i.tags['Name'] 
    else: 
    n = '???' 
    n = n.ljust(16)[:16] 
    if i.state == 'running': 
    n = ansi_color.green + n + ansi_color.reset 
    else: 
    n = ansi_color.red + n + ansi_color.reset 
    return n 

def pub_dns(i): 
    return i.public_dns_name.rjust(43) 

def pri_dns(i): 
    return i.private_dns_name.rjust(43) 

def print_instance(i): 
    print ' ' + name(i) + '| ' + pub_dns(i) + ' ' + pri_dns(i) 


regions = sys.argv[1:] 
if len(regions)==0: 
    regions=['us-east-1'] 

if len(regions)==1 and regions[0]=="all": 
    rr = boto.ec2.regions() 
else: 
    rr = [ boto.ec2.get_region(x) for x in regions ] 

for reg in rr: 
    print "========" 
    print reg.name 
    print "========" 
    conn = reg.connect() 

    reservations = conn.get_all_instances() 

    for r in reservations: 
    # print ansi_color.grey + str(r) + ansi_color.reset 
    for i in r.instances: 
     print_instance(i) 
0

У вас есть учетные данные IAM по порядку? Данный ключ доступа должен иметь права для EC2. Если вы не уверены, вы можете добавить политику AmazonEC2FullAccess для тестирования, а затем настроить ее.

Смежные вопросы