【问题标题】:list_datasets() method does nothing in AWS Lambdalist_datasets() 方法在 AWS Lambda 中不执行任何操作
【发布时间】:2019-09-13 14:21:24
【问题描述】:

我正在尝试从 AWS lambda 中的 BigQuery 获取数据集列表。但是,在执行 client.list_datasets() 方法时,它什么也不做,并且 lambda 超时。

我的代码如下:

from google.cloud.bigquery import Client
from google.oauth2.service_account import Credentials

credentials = Credentials.from_service_account_info(
            service_account_dict)

client = Client(
            project=service_account_dict.get("project_id"),
            credentials=credentials
        )

datasets = client.list_datasets()
print(datasets)

for dataset in datasets:
    print("dataset info", dataset.__dict__)

第一个打印语句的输出是:

<google.api_core.page_iterator.HTTPIterator object at 0x7fbae4975550>

但是,dataset.__dict__ 的第二个打印没有被打印。或者,不执行对 HTTPIterator 对象的循环。

顺便说一句,代码在本地机器上运行良好。

【问题讨论】:

  • 您的 Lambda 函数是否具有适当的网络访问权限?
  • @ArkaMukherjee 是的,Lambda 函数具有适当的网络访问权限。它在 VPC 内,但我设置了允许所有出站流量的安全组。
  • 我会尝试调查数据集的大小和其他详细信息,看看您是否也收到错误对象
  • @TamirKlein,datasets.__dict__ 的输出是这样的{'_started':False,'client':<google.cloud.bigquery.client.Clientobjectat..>,'item_to_value':<function_item_to_datasetat..>,'max_results':None,'page_number':0,'next_page_token':None,'num_results':0,'api_request':functools.partial(<boundmethodClient._call_apiof<google.cloud.bigquery.client.Clientobjectat...>>,<google.api_core.retry.Retryobjectat...>),'path':'/projects/firebase-test/datasets','_items_key':'datasets','extra_params':{'all':True},'_page_start':<function_do_nothing_page_startat...>,'_next_token':'nextPageToken'}
  • 如您所见,api 返回零 (0) 结果。你能在本地机器上打印这个项目并比较结果吗?另外,您确定您的服务帐户已正确上传到 lambda 节点容器吗?

标签: python-3.x amazon-web-services google-cloud-platform aws-lambda google-bigquery


【解决方案1】:

我在 lambda 函数中使用的 AWS VPC 导致了这个问题。 VPC 阻止了对外部 API(在我的例子中是 BigQuery API)的请求。

配置 VPC 子网和 NAT 网关以向互联网 (0.0.0.0/0) 公开 lambda 函数解决了该问题。

【讨论】:

    猜你喜欢
    • 2013-03-31
    • 1970-01-01
    • 2020-10-11
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 2020-07-11
    相关资源
    最近更新 更多