В настоящее время я пробую блокноты Snowflake (в предварительной версии). Мне не удалось найти никакой информации о том, как обращаться с секретами, например с ключами API.
Я знаю, что могу создавать секреты в Snowflake, но не могу понять, как получить к ним доступ из Блокнота. В документации Ноутбука об этом ничего нет.
В Справочнике по секретному API есть описание того, как «получить учетные данные, содержащиеся в созданном вами секрете», но я не могу заставить это работать в блокноте Snowflake.
Любые подсказки очень ценятся.
У меня была та же проблема с получением объекта секретов имени пользователя и пароля. Мой обходной путь состоял в том, чтобы создать функцию для получения секрета, а затем вызвать ее в моем блокноте. Адаптируйте этот код для использования ключей API.
Сначала создайте интеграцию:
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION my_external_endpoints
ALLOWED_AUTHENTICATION_SECRETS = ('database.schema.your_secret_string_name')
ENABLED = true;
Затем создайте эту функцию, которая будет получать информацию для вас:
CREATE OR REPLACE FUNCTION get_secret_username_password()
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.8
HANDLER = 'get_secret_username_password'
EXTERNAL_ACCESS_INTEGRATIONS = (my_external_endpoints)
SECRETS = ('cred' = your_secret_string_name)
AS
$$
import _snowflake
import json
def get_secret_username_password():
username_password_object = _snowflake.get_username_password('cred')
username_password_dictionary = {
"Username": username_password_object.username,
"Password": username_password_object.password
}
return json.dumps(username_password_dictionary)
$$;
В своем блокноте извлеките информацию:
from snowflake.snowpark import Session
import json
session = get_active_session()
result = session.sql(f"""
SELECT get_secret_username_password()
""").collect()
creds = json.loads(result[0][0])
username = creds["Username"]
password = creds["Password"]
Большое спасибо, это сработало! Однако это кажется излишне сложным, поскольку мне нужно будет написать функцию извлечения секрета для каждого секрета. Будем надеяться, что Snowflake в будущем придумает лучшее решение!
Хотя @Amito дал правильный ответ, вот немного более короткая версия, если вам просто нужно вернуть строку, например ключ API:
CREATE OR REPLACE FUNCTION retrieve_my_api_key()
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.8
HANDLER = 'retrieve_my_api_key'
EXTERNAL_ACCESS_INTEGRATIONS = (my_integration)
SECRETS = ('cred' = my_api_key)
AS
$$
import _snowflake
def retrieve_my_api_key():
my_api_key = _snowflake.get_generic_secret_string('cred')
return my_api_key
$$;
и в тетради:
from snowflake.snowpark.context import get_active_session
session = get_active_session()
results = session.sql('SELECT retrieve_my_api_key()').collect()
# this returns [Row(RETRIEVE_MY_API_KEY()='sUpErSecRetApiKey')] - why??
secret_my_api_key = results[0][0]
Пробовали ли вы создать пользовательскую функцию, как показано в справочнике по секретному API, для получения секрета, а затем вызвать UDF из записной книжки?