Google Adwords 脚本在 AWS Lambda 上运行:[Errno 30] 只读文件系统:“/home/sbx_user1051”

Yan*_*g L 1 python-3.x aws-lambda google-ads-api

python 脚本获取 google adwords 报告,它在我的本地计算机中按预期工作,但是当部署在 AWS Lambda 函数中时,出现以下错误

{
  "errorMessage": "[Errno 30] Read-only file system: '/home/sbx_user1051'",
  "errorType": "OSError",
  "stackTrace": [
    [
      "/var/task/lambda_function.py",
      24,
      "lambda_handler",
      "report_downloader = client.GetReportDownloader(version='v201809')"
    ],
    [
      "/var/task/googleads/adwords.py",
      370,
      "GetReportDownloader",
      "return ReportDownloader(self, version, server)"
    ],
    [
      "/var/task/googleads/adwords.py",
      1213,
      "__init__",
      "self.proxy_config, self._namespace, self._adwords_client.cache)"
    ],
    [
      "/var/task/googleads/common.py",
      819,
      "__init__",
      "transport = _ZeepProxyTransport(timeout, proxy_config, cache)"
    ],
    [
      "/var/task/googleads/common.py",
      667,
      "__init__",
      "cache = zeep.cache.SqliteCache()"
    ],
    [
      "/var/task/zeep/cache.py",
      77,
      "__init__",
      "self._db_path = path if path else _get_default_cache_path()"
    ],
    [
      "/var/task/zeep/cache.py",
      155,
      "_get_default_cache_path",
      "os.makedirs(path)"
    ],
    [
      "/var/lang/lib/python3.6/os.py",
      210,
      "makedirs",
      "makedirs(head, mode, exist_ok)"
    ],
    [
      "/var/lang/lib/python3.6/os.py",
      210,
      "makedirs",
      "makedirs(head, mode, exist_ok)"
    ],
    [
      "/var/lang/lib/python3.6/os.py",
      220,
      "makedirs",
      "mkdir(name, mode)"
    ]
  ]
}
Run Code Online (Sandbox Code Playgroud)

我知道在 Lambda 中它只能写入位于 tem 文件夹中的文件,但令我困惑的是,在我的脚本中,我根本不写入任何文件,这是我的脚本的主要结构:

client = adwords.AdWordsClient.LoadFromStorage('tmp/googleads.yaml')
report_downloader = client.GetReportDownloader(version='v201809')
report_query = (adwords.ReportQueryBuilder()
                  .Select( str)
                  .From('ACCOUNT_PERFORMANCE_REPORT')
                  .During('LAST_7_DAYS')
                  .Build())
results=report_downloader.DownloadReportAsStringWithAwql( report_query, 'TSV', skip_report_header=True, skip_column_header=True, skip_report_summary=True, include_zero_impressions=False)
campaigns=results.splitlines()
Run Code Online (Sandbox Code Playgroud)

请告知如何解决此问题。环境是python 3.6

std*_*bar 10

看起来 Adwords 正在使用缓存,并且默认情况下,该缓存会进入运行代码的用户的主目录。要解决此问题,请将环境变量设置XDG_CACHE_HOME/tmp/.cache。您可以在 Lambda 环境变量中进行设置。

  • @YangL - 我遵循了源代码。`common.py` 中的最后一个错误指向[此处](https://github.com/googleads/googleads-python-lib/blob/master/googleads/common.py#L667)。这行代码最终指向[这里](https://github.com/mvantellingen/python-zeep/blob/master/src/zeep/cache.py#L158),而那一行代码引导我到[这里](https: //github.com/ActiveState/appdirs/blob/master/appdirs.py#L265)。您的错误显示了 Unix 路径,因此导致我看到[这一行](https://github.com/ActiveState/appdirs/blob/master/appdirs.py#L314)。有时这就是开源的意义所在。 (7认同)