如何让Boto返回EC2实例-S3 works fin

2024-09-27 07:30:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Boto的EC2位(Boto v2.8.0,pythonv2.6.7)有一些问题。

第一个命令返回一个S3存储桶列表-一切正常!获取EC2实例列表的第二个命令是403,其中包含“Query string authentication requires The Signature,Expires and AWSAccessKeyId parameters”

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

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

另外,我的证书都是好的(完全管理)-我使用Ruby aws sdk测试了它们,EC2和S3都工作得很好。

我还注意到ec2_conn对象中的host属性是s3-eu-west-1.amazonaws.com,“s3”。。。?那当然是错的?我试过将它重新修复到正确的端点,但没有成功。

任何帮助都将非常感谢 谢谢


Tags: 实例命令列表gets3allec2conn
3条回答

下面是一些工作代码,用于列出可能跨越多个区域的所有实例。 它做的比你需要的多得多,但也许你可以把它削减到你想要的程度。

#!/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)

您有您的IAM证书吗?给定的访问密钥应该具有EC2的权限。如果不确定,可以将策略AmazonEC2FullAccess添加到test中,然后将其调低。

有“连接到”区域命令:

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

这并没有对Boto的older versions起作用。

相关问题 更多 >

    热门问题