当前位置: 首页 > 知识库问答 >
问题:

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

鲁炳
2023-03-14

我的目标是能够使用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-角色。这意味着我没有任何本地配置。

但是,当我将一个具有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\u DEFAULT\u REGION。

以下是我必须复制该问题的简单代码:

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

我希望boto3能够找到EC2实例中已经存在的区域。

共有2个答案

左丘智渊
2023-03-14

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

见:

  • 配置凭据
  • https://github.com/boto/boto3/issues/375

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

所以,你需要指出你想要哪个区域。如果合适,您可以从元数据检索当前区域并使用它。或者使用环境变量AWS\u DEFAULT\u REGION。

颛孙庆
2023-03-14

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

dynamodb = boto3.resource('dynamodb', region_name='us-east-2')
 类似资料:
  • 我试图从我的windows 7机器RDP到EC2实例,但是总是得到 远程桌面无法连接到这些原因之一的远程Comupter 1.)未启用远程桌面到服务器 2.)远程计算机已关闭 3.) 远程计算机在网络上不可用。 我能够RDP其他EC2实例。另外,作为一种解决方法,我能够从其他EC2机器(而不是从我的windows7机器和网络上的其他机器)将RDP映射到subject实例中。 检查了RDP工作和RD

  • 一个和我一起工作的人给了我EC2证书,让我登录到他的EC2控制台。不是我设计的。一些实例显示公共dns名称,而另一些实例具有空白的公共dns。我希望能够连接到具有空白公共DNS的实例。我一直无法理解为什么这些显示为空白。

  • 我已经创建了一个ec2实例,并用putty连接了这个实例。但现在,我对如何上传该实例上的文件或网页感到困惑

  • 问题内容: 连接到在Amazon EC2集群中运行的Java应用程序时遇到问题。我们绝对允许“ JMX端口”(通常是RMI注册表端口) 和 服务器端口(完成大部分工作)都进入所讨论实例的安全组。Jconsole连接但似乎挂起并且从不显示任何信息。 我们正在使用以下内容运行我们的java: 我们尝试过: Telnet 连接 到端口,但不显示任何信息。 我们可以在ssh上使用remote-X11在实例

  • 我们在连接到运行在AmazonEC2集群中的Java应用程序时遇到了问题。我们明确地允许“JMX端口”(它通常是RMI注册表端口)和服务器端口(它完成了大部分工作)对所讨论的实例的安全组。Jconsole连接但似乎挂起并且从未显示任何信息。 Telnets连接到端口,但不显示任何信息。 我们可以通过ssh使用remote-X11在实例本身上运行,它可以连接并显示信息。因此JRE将其导出到本地。 打