如何让Boto返回EC2实例 - S3正常工作
我在使用Boto的EC2部分时遇到了一些问题(Boto版本是2.8.0,Python版本是2.6.7)。
第一个命令可以顺利返回S3存储桶的列表,一切正常!但是第二个命令用来获取EC2实例列表时却出现了403错误,提示“查询字符串认证需要Signature、Expires和AWSAccessKeyId参数”。
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”吗……?这肯定是错的吧?我尝试过手动修正到正确的端点,但没有成功。
如果能帮忙解决这个问题,我会非常感激。谢谢!
3 个回答
0
你的IAM凭证准备好了吗?你给的访问密钥应该有使用EC2的权限。如果你不确定,可以先添加一个叫做AmazonEC2FullAccess的权限来测试,之后再根据需要调整权限。
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 教程提供了另一种方法。这个方法基本上是这样的:
import boto.ec2
for region in boto.ec2.regions():
if region.name == 'my-favorite-region':
connection = region.connect()
break
在一些旧版本的 Boto 上,这个方法一直没有成功。
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)