3

Boto の EC2 ビット (Boto v2.8.0、Python v2.6.7) に問題があります。

最初のコマンドは S3 バケットのリストを返します - すべて問題ありません! EC2 インスタンスのリストを取得する 2 番目のコマンドは、「クエリ文字列認証には署名、有効期限、および AWSAccessKeyId パラメータが必要です」という 403 で失敗します。

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 に答える