如何让Boto返回EC2实例 - S3正常工作

3 投票
3 回答
8844 浏览
提问于 2025-04-17 19:05

我在使用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)

撰写回答