Доступ к Google BigQuery из AWS SageMaker - PullRequest
3 голосов
/ 05 апреля 2019

При локальном запуске мой блокнот Jupyter может ссылаться на Google BigQuery следующим образом:

%%bigquery some_bq_table

SELECT *
FROM
  `some_bq_dataset.some_bq_table` 

Так что позже в моем блокноте я могу сослаться на some_bq_table в качестве фрейма данных pandas, как показано здесь: https://cloud.google.com/bigquery/docs/visualize-jupyter

Я хочу запустить свой ноутбук на AWS SageMaker, чтобы проверить несколько вещей.Для аутентификации с помощью BigQuery кажется, что единственными двумя способами является использование служебной учетной записи в GCP (или локально) или указание SDK на JSON с учетными данными с помощью env var (как описано здесь: https://cloud.google.com/docs/authentication/getting-started).

Дляпример

export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/[FILE_NAME].json"

Есть ли простой способ подключиться к bigquery из SageMaker? Моя лучшая идея сейчас - это загрузить JSON откуда-то в экземпляр SageMaker, а затем установить env var из кода Python.

Например, я бы сделал это:

os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "/home/user/Downloads/[FILE_NAME].json"

Однако это не очень безопасно - мне не нравится идея загрузки моих учетных данных JSON в экземпляр SageMaker (это означает, чтоЯ должен был бы загрузить учетные данные в какое-то личное хранилище s3 и затем сохранить их в экземпляре SageMaker.) Не конец света, но я скорее избегаю этого.

Есть идеи?

1 Ответ

5 голосов
/ 06 апреля 2019

Как вы упомянули, в настоящее время GCP аутентифицируется с использованием служебной учетной записи, учетных данных JSON и токенов API. Вместо хранения учетных данных в корзине S3 вы можете использовать AWS Secrets Manager или AWS Systems Manager Parameter Store для хранения учетных данных GCP, а затем извлечь их в записной книжке Jupyter. Таким образом, учетные данные могут быть защищены, и файл учетных данных будет создан из диспетчера секретов только при необходимости.

Это пример кода, который я использовал ранее для подключения к BigQuery из экземпляра SageMaker.

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. Я не уверен, что это лучший способ. Надеюсь, у кого-то есть лучший способ.

...