3

我对 Boto 的 EC2 位(Boto v2.8.0,Python v2.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 对象中的主机属性是s3-eu-west-1.amazonaws.com,“s3”...?确定是错的吗?我已经尝试将它复古修复到正确的端点,但没有运气。

任何帮助将不胜感激谢谢

4

3 回答 3

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)
于 2013-03-14T14:32:21.727 回答
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。

于 2013-03-14T13:50:03.007 回答
0

您是否按顺序准备好 IAM 凭证?给定的访问密钥应该具有 EC2 的权限。如果您不确定,可以添加策略 AmazonEC2FullAccess 进行测试,然后将其调低。

于 2016-01-08T13:51:43.630 回答