【问题标题】:How to use boto3 on EC2 instance without local configuration?如何在没有本地配置的 EC2 实例上使用 boto3?
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 我认为对区域进行硬编码是不可取的。最好利用程序在 EC2 实例上运行这一事实,在该实例中可以轻松获得区域等信息。
    【解决方案2】:

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

    见:

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

    因此,您需要指明您想要的区域。如果合适,您可以从元数据中检索当前区域并使用它。或者使用环境变量AWS_DEFAULT_REGION

    【讨论】:

    • 说得好,这正是我正在寻找的信息。基本上,我根本无法通过配置凭据通道获取非凭据信息,例如区域。根据您的建议,我将执行以下操作:在我的 Python 代码中,我将通过实例元数据服务实用地获取该区域。这样,代码非常便携,没有什么是硬编码的。谢谢。
    猜你喜欢
    • 2020-09-30
    • 2019-07-04
    • 2015-12-28
    • 2018-04-07
    • 2018-07-14
    • 2016-07-29
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多