【发布时间】:2020-01-02 21:13:42
【问题描述】:
我的目标是能够使用 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 实例中已经可用的区域。
【问题讨论】:
标签: python amazon-ec2 boto3