Boto3 ec2 describe_instances始终返回空

时间:2017-12-07 16:59:22

标签: python amazon-web-services amazon-ec2 boto3

我有一个非常简单的沙箱,我正在努力工作,所以我可以在更大的应用程序中使用它:

ec2_client = boto3.client(
    'ec2',
    aws_access_key_id=ACCESS_KEY,
    aws_secret_access_key=SECRET_KEY)

response = ec2_client.describe_instances()
print(response)

导致......

{
  'Reservations': [], 
  'ResponseMetadata': {
    'RequestId': '2c28e8aa-da6d-4ca4-8ea7-f672518cac9f',
    'HTTPStatusCode': 200, 
    'HTTPHeaders': {
      'content-type': 'text/xml;charset=UTF-8', 
      'transfer-encoding': 'chunked', 
      'vary': 'Accept-Encoding', 
      'date': 'Thu, 07 Dec 2017 16:44:30 GMT', 
      'server': 'AmazonEC2'
  }, 
  'RetryAttempts': 0}
}

问题无论我运行多少次Reservations都是空的:(。

在AWS consonle中,我可以清楚地看到一个实例正在运行......

running ec2 instance

我尝试启动更多实例,重新启动我运行的实例。我把我的初始脚本放在一个循环中并在重复时运行它,同时我这样做寻找Reservation数组实际上有数据的任何标志。

我仔细检查了我的aws ACCESS_KEY和SECRET_KEY是否正确并指向正确的帐户。他们是。

我不知道为什么会这样。它如此简单,应该工作。我是AWS的新手,所以感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

似乎您忘记添加该区域。

创建客户端时设置区域

ec2_client = boto3.client(
  'ec2',
  aws_access_key_id=ACCESS_KEY,
  aws_secret_access_key=SECRET_KEY,
  region_name=REGION_NAME
)

response = ec2_client.describe_instances()
print(response)

如果你的EC2实例在俄勒冈州,你可以region_name='us-west-2'

不建议使用硬编码凭据。您可以使用awscli配置个人资料,然后在代码中引用它。

session = boto3.Session(profile_name='dev')
# Any clients created from this session will use credentials
# from the [dev] section of ~/.aws/credentials.
ec2_client = session.client('ec2')

您可以阅读有关Boto3凭据Boto3 Credentials

的更多信息

答案 1 :(得分:0)

问题在于boto3正在使用我的实例未运行的区域。解决方案是在初始化客户端时指定区域:

ec2_client = boto3.client(
    'ec2',
    region_name='us-east-2',
    aws_access_key_id=ACCESS_KEY,
    aws_secret_access_key=SECRET_KEY)

所有归功于@kichik,告诉我要去哪里看看!