如何授权 Lambda 函数发布到 BigQuery?

Posted

技术标签:

【中文标题】如何授权 Lambda 函数发布到 BigQuery?【英文标题】:How to authorize Lambda function to post to BigQuery? 【发布时间】:2020-01-07 08:26:19 【问题描述】:

过去两天我一直被这个问题困扰。我想使用 Lambda 作为 Cron 操作从我的数据库中获取数据并将其发布到 BigQuery。

我想知道如何使用我的 Lambda 函数中的服务账户文件授权对 BigQuery 的访问。

上下文

我正在使用以下内容:

Serverless repo 用于部署我的 Lambda。 BigQuery SDK @google-cloud/bigquery

尝试

在我的本地使用 sls invoke local --function main 一切正常。我在.env 中设置了GOOGLE_APPLICATION_CREDENTIALS=/path/to/key.json。但是,显然/path/to/key.json 是一个本地路径。 作为测试,我尝试将我的服务帐户文件放入项目的根目录并设置GOOGLE_APPLICATION_CREDENTIALS=./key.json(注意我使用了相对路径)。这在本地或云中不起作用。是的,我知道这不是好的做法——我只是想让它发挥作用。我相信这可能是 WebPack 的事情,尽管我对如何使用 WebPack 一无所知。 我还考虑过使用 AWS KMS 加密 json 并将其作为键值对存储在参数存储中(这是我最终想要使用的方式)。但是,我注意到 BigQuery 需要接受文件路径而不是秘密本身See here。

问题

所以这是我的问题:

    是否可以使用无服务器框架通过文件路径和 .env 文件连接到 BigQuery? 为什么 Google 不允许您使用访问密钥连接到 BigQuery?相反,我必须指定我的文件的路径。 有没有办法在 KMS 中存储文件并在部署到 Lambda 时解密?

【问题讨论】:

在 GCP 中创建您的服务帐户 -> 为其提供适当的 ACL(在本例中为 BigQuery)-> 将其与您的 Lambda 函数/zip 打包 -> 在您的代码中引用它,如下所示:github.com/googleapis/nodejs-bigquery/blob/… @GrahamPolley 高级结构不是我的问题。问题主要出在您描述的步骤中(使用您的 Lambda 函数/zip 打包)。 docs.aws.amazon.com/lambda/latest/dg/… 【参考方案1】:

我知道这是旧的,但我是怎么做到的:

我使用 cred.json 文件创建了一个 lambda 层,并将 lambda 层附加到我的 serverless.yml 中使用 gcp 大查询的特定函数。

我在 .yml 之外创建它,因为我不希望我的 cred.json 成为我在 github 中的团队存储库的一部分(安全问题)。

使用 lambda 层,在每个 lambda 启动时,文件将在本地机器的路径中可用:'/opt/cred.json'

将以下内容添加到 serverless.yml 中的功能块中:

layers:
  - arn:aws:lambda:$region:$account):layer:lambda-layer-gcp-bigquery-keyfile:1

【讨论】:

以上是关于如何授权 Lambda 函数发布到 BigQuery?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 lambda 调用 IAM 授权的 AWS ApiGateway 端点?

如何在 API 网关上的 cognito 授权方保护的 lambda 函数中获取 AWS Cognito 用户数据

从自定义授权方 Lambda 函数访问 POST 请求正文

AWS Lambda、API 网关和 Cognito:如何在 lambda 函数中获取身份对象?

如何授权 lambda 使用 CDK 执行 ses:SendEmail?

AWS ApiGateway Lambda 代理访问授权者