为了账号安全,请及时绑定邮箱和手机立即绑定

从 AWS SageMaker 访问 Google BigQuery

从 AWS SageMaker 访问 Google BigQuery

开满天机 2021-12-29 20:17:38
在本地运行时,我的 Jupyter notebook 能够像这样引用 Google BigQuery:%%bigquery some_bq_tableSELECT *FROM  `some_bq_dataset.some_bq_table` 因此,稍后在我的笔记本中,我可以将 some_bq_table 引用为 Pandas 数据框,如下所示:https ://cloud.google.com/bigquery/docs/visualize-jupyter我想在 AWS SageMaker 上运行我的笔记本来测试一些东西。要使用 BigQuery 进行身份验证,似乎只有两种方法是使用 GCP(或本地)上的服务帐户或使用 env var 将 SDK 指向凭证 JSON(如此处所述:https : //cloud.google.com/文档/身份验证/入门)。例如export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/[FILE_NAME].json"是否有一种简单的方法可以从 SageMaker 连接到 bigquery?我现在最好的想法是从某处下载 JSON 到 SageMaker 实例,然后从 python 代码设置环境变量。例如,我会这样做:os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "/home/user/Downloads/[FILE_NAME].json"但是,这不是很安全 - 我不喜欢将我的凭据 JSON 下载到 SageMaker 实例的想法(这意味着我必须将凭据上传到某个私有 s3 存储桶,然后将它们存储在 SageMaker 实例上)。不是世界末日,但我宁愿避免这种情况。有任何想法吗?
查看完整描述

1 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

正如您提到的,GCP 目前使用服务帐户、凭据 JSON 和 API 令牌进行身份验证。您可以考虑使用 AWS Secrets Manager 或 AWS Systems Manager Parameter Store 来存储 GCP 凭证,然后在 Jupyter notebook 中获取它们,而不是将凭证存储在 S3 存储桶中。通过这种方式可以保护凭证,并且仅在需要时才从 Secrets Manager 创建凭证文件。


这是我之前用于从 SageMaker 实例连接到 BigQuery 的示例代码。


import os

import json

import boto3

from google.cloud.bigquery import magics

from google.oauth2 import service_account


def get_gcp_credentials_from_ssm(param_name):

    # read credentials from SSM parameter store

    ssm = boto3.client('ssm')

    # Get the requested parameter

    response = ssm.get_parameters(Names=[param_name], WithDecryption=True)

    # Store the credentials in a variable

    gcp_credentials = response['Parameters'][0]['Value']

    # save credentials temporarily to a file

    credentials_file = '/tmp/.gcp/service_credentials.json'

    with open(credentials_file, 'w') as outfile:  

        json.dump(json.loads(gcp_credentials), outfile)

    # create google.auth.credentials.Credentials to use for queries 

    credentials = service_account.Credentials.from_service_account_file(credentials_file)

    # remove temporary file

    if os.path.exists(credentials_file):

        os.remove(credentials_file)

    return credentials


# this will set the context credentials to use for queries performed in jupyter 

# using bigquery cell magic

magics.context.credentials = get_gcp_credentials_from_ssm('my_gcp_credentials')

请注意,SageMaker 执行角色应该有权访问 SSM,当然还有其他必要的路径来连接到 GCP。我不确定这是否是最好的方法。希望有人有更好的方法。


查看完整回答
反对 回复 2021-12-29
  • 1 回答
  • 0 关注
  • 197 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信