在没有本地配置的情况下如何在EC2实例上使用boto3?

时间:2019-08-29 14:51:50

标签: python amazon-ec2 boto3

我的目标是能够使用boto3运行Python程序来访问DynamoDB,而无需任何本地配置。我一直在关注这个AWS文档https://boto3.amazonaws.com/v1/documentation/api/latest/guide/configuration.html),使用'IAM角色'选项https://boto3.amazonaws.com/v1/documentation/api/latest/guide/configuration.html#iam-role似乎是可行的。这意味着我在本地没有任何配置。

但是,当我将具有DynamoDB访问权限的角色附加到EC2实例时,Python程序正在运行并运行boto3.resources('dynamodb'),我不断收到以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/ubuntu/.local/lib/python3.6/site-packages/boto3/__init__.py", line 100, in resource
    return _get_default_session().resource(*args, **kwargs)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/boto3/session.py", line 389, in resource
    aws_session_token=aws_session_token, config=config)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/boto3/session.py", line 263, in client
    aws_session_token=aws_session_token, config=config)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/botocore/session.py", line 839, in create_client
    client_config=config, api_version=api_version)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/botocore/client.py", line 86, in create_client
    verify, credentials, scoped_config, client_config, endpoint_bridge)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/botocore/client.py", line 328, in _get_client_args
    verify, credentials, scoped_config, client_config, endpoint_bridge)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/botocore/args.py", line 47, in get_client_args
    endpoint_url, is_secure, scoped_config)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/botocore/args.py", line 117, in compute_client_args
    service_name, region_name, endpoint_url, is_secure)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/botocore/client.py", line 402, in resolve
    service_name, region_name)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/botocore/regions.py", line 122, in construct_endpoint
    partition, service_name, region_name)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/botocore/regions.py", line 135, in _endpoint_for_partition
    raise NoRegionError()
botocore.exceptions.NoRegionError: You must specify a region.

我已经搜索了互联网,似乎大多数解决方案都指向具有本地配置(例如〜/ .aws / config,boto3配置文件等)。

此外,我已经验证了从EC2实例可以从实例元数据中获取区域:

$ curl --silent http://169.254.169.254/latest/dynamic/instance-identity/document
{
    ...
  "region" : "us-east-2",
    ...
}

我现在的解决方法是通过Docker命令行提供环境变量AWS_DEFAULT_REGION。

这是我要复制问题的简单代码:

>>>import boto3
>>>dynamodb = boto3.resource('dynamodb')

我希望boto3能够以某种方式拾取EC2实例中已经可用的区域。

2 个答案:

答案 0 :(得分:1)

您可以将region作为参数传递给任何boto3资源。

dynamodb = boto3.resource('dynamodb', region_name='us-east-2')

答案 1 :(得分:0)

boto3中有两种类型的配置数据:凭证和非凭证(包括区域)。 boto3如何读取它们。

请参阅:

具体地说,boto3从实例元数据服务中检索凭据,但不是其他配置项(例如区域)。

因此,您需要指出所需的区域。您可以从元数据中检索当前区域,并在适当时使用它。或使用环境变量AWS_DEFAULT_REGION