3

我正在使用 python3

我正在尝试使用 awswrangler 包从 aws athena 读取数据。

下面是代码

import boto3
import awswrangler as wr
import pandas as pd

df_dynamic=wr.athena.read_sql_query("select * from test",database="tst")

错误:

    Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.6/site-packages/awswrangler/_config.py", line 361, in wrapper

       File "/usr/local/lib/python3.6/site-packages/botocore/regions.py", line 148, in _ 
   endpoint_for_partition
     raise NoRegionError()
      botocore.exceptions.NoRegionError: You must specify a region.

我不确定指定sql查询在哪里工作

4

1 回答 1

3

与 AWS API 的所有交互(包括通过 SDK 等)都需要凭证,您可以在此处boto3找到有关如何boto3管理凭证的更多信息。

由于您在 EC2 实例上运行此程序,因此最佳实践建议通过实例配置文件管理凭证。假设您已经为 EC2 实例分配了一个 IAM 角色,您需要做的就是为您的代码指定一个区域。您可以在AWS官方文档中找到有关如何将 IAM 角色分配给您的 EC2 的信息。

AWS Data Wrangler 依赖boto3并允许指定一个区域,如下所示:

boto3.setup_default_session(region_name="us-east-2")

来源:AWS Data Wrangler - 会话

您可以像上面示例中那样对区域进行硬编码,也可以使用实例元数据端点检索部署 EC2 的区域。

以下端点:

curl http://169.254.169.254/latest/dynamic/instance-identity/document

将返回一个 json,其中包含 EC2 的区域等信息:

{
  "privateIp" : "172.31.2.15",
  "instanceId" : "i-12341ee8",
  "billingProducts" : null,
  "instanceType" : "t2.small",
  "accountId" : "1234567890",
  "pendingTime" : "2015-11-03T03:09:54Z",
  "imageId" : "ami-383c1956",
  "kernelId" : null,
  "ramdiskId" : null,
  "architecture" : "x86_64",
  "region" : "ap-northeast-1", # <- region
  "version" : "2010-08-31",
  "availabilityZone" : "ap-northeast-1c",
  "devpayProductCodes" : null
}

如果需要,您可以在 Python 中或通过其他方式轻松实现此请求。

于 2020-11-26T14:50:36.387 回答