¿Qué son los Secrets de Snowflake?
En Snowflake, un Secret es un objeto a nivel de schema que te permite almacenar información sensible, como API Keys o contraseñas.
¿Por qué existe esta funcionalidad?
En el último tiempo, Snowflake ha lanzado varias funcionalidades que facilitan el desarrollo de aplicaciones y data pipelines directamente dentro de Snowflake:
- Snowpark Container Services te permite ejecutar aplicaciones personalizadas en cualquier lenguaje de programación.
- Snowpark for Python se ha vuelto una opción popular para tareas de data engineering, incluyendo pipelines completos de ELT/ETL.
- Ya se pueden enviar alertas por email, Slack o Microsoft Teams (mediante webhook).
- Snowflake ahora permite hacer llamadas a APIs en internet público; muchos usuarios están entusiasmados con la posibilidad de usar las APIs de OpenAI desde su cuenta de Snowflake.
Todos estos casos de uso requieren almacenar y consultar secrets para autenticarse con distintas aplicaciones y servicios.
Ventajas de gestionar Secrets en Snowflake
- Los secrets creados en Snowflake se rigen por el mismo proceso de RBAC de Snowflake que ya conoces (por ejemplo,
grant usage on secret to role <role>). - El secret convive con el código de tu aplicación o pipeline; no hay que administrar un sistema aparte.
- Sería complicado usar un gestor de secrets externo (como AWS Secrets Manager) sin tener primero una forma ágil de autenticarse contra ese gestor.
Cómo crear un Secret en Snowflake
En Snowflake se pueden crear 4 tipos de secrets, y el DDL varía ligeramente según el tipo.
OAuth:
Sintaxis
CREATE [ OR REPLACE ] SECRET [ IF NOT EXISTS ] <name>
TYPE = OAUTH2
API_AUTHENTICATION = <security_integration_name>
OAUTH_SCOPES = ( '<scope_1>' [ , '<scope_2>' ... ] )
[ COMMENT = '<string_literal>' ]
Ejemplo
-- Assume an integration exists:
CREATE OR REPLACE SECURITY INTEGRATION my_oauth2_integration
TYPE = API_AUTHENTICATION
AUTH_TYPE = OAUTH2
ENABLED = TRUE
OAUTH_CLIENT_ID = 'your_client_id'
OAUTH_CLIENT_SECRET = 'your_client_secret'
OAUTH_TOKEN_ENDPOINT = 'https://oauth2.example.com/token'
OAUTH_ALLOWED_SCOPES = ('scope1', 'scope2');
-- create the secret
CREATE OR REPLACE SECRET my_oauth2_secret
TYPE = OAUTH2
API_AUTHENTICATION = my_oauth2_integration
OAUTH_SCOPES = ('scope1', 'scope2')
Expandir código
Cloud Provider:
Sintaxis:
CREATE [ OR REPLACE ] SECRET [ IF NOT EXISTS ] <name>
TYPE = CLOUD_PROVIDER_TOKEN
API_AUTHENTICATION = '<cloud_provider_security_integration>'
[ COMMENT = '<string_literal>' ]
Ejemplo:
-- assume this integration exists called test_integration:
CREATE OR REPLACE SECRET test_secret
TYPE = CLOUD_PROVIDER_TOKEN
API_AUTHENTICATION = 'TEST_INTEGRATION';
Basic Auth:
Sintaxis:
CREATE [ OR REPLACE ] SECRET [ IF NOT EXISTS ] <name>
TYPE = PASSWORD
USERNAME = '<username>'
PASSWORD = '<password>'
[ COMMENT = '<string_literal>' ]
Ejemplo:
CREATE OR REPLACE SECRET my_password_secret
TYPE = PASSWORD
USERNAME = 'db_user'
PASSWORD = 'MySecurePass123!'
COMMENT = 'Database credentials for application access';
Generic String:
Sintaxis:
CREATE [ OR REPLACE ] SECRET [ IF NOT EXISTS ] <name>
TYPE = GENERIC_STRING
SECRET_STRING = '<string_literal>'
[ COMMENT = '<string_literal>' ]
Ejemplo:
CREATE OR REPLACE SECRET my_string_secret
TYPE = GENERIC_STRING
SECRET_STRING = 'my-secret-api-key-123'
COMMENT = 'API key for service authentication';
¿Cómo usar un Secret de Snowflake en tu código?
Los secrets solo se pueden consultar desde Java o Python. Si alojas una aplicación en Snowpark Container Services con otro lenguaje de programación, vas a necesitar un pequeño módulo personalizado en Java o Python que recupere el secret y devuelva el valor a tu aplicación.
Acá tienes un ejemplo para obtener un secret con Python.
Paso 1: crea una función para obtener secrets por nombre
CREATE OR REPLACE FUNCTION get_secret_by_name(secret_name STRING)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.9
HANDLER = 'get_secret_by_name'
EXTERNAL_ACCESS_INTEGRATIONS = (external_access_integration)
AS
$$
import _snowflake
def get_secret_by_name(secret_name):
username_password_object = _snowflake.get_username_password(secret_name)
username_password_dictionary = {}
username_password_dictionary["Username"] = username_password_object.username
Expandir código
Paso 2: invoca la función:
1SELECT get_secret_by_name('jeffs_credentials');
Uso de Secrets en Notification Integrations / Webhooks:
Snowflake ofrece una manera sencilla de pasar un secret a las Notification Integrations cuando se envían alertas a webhooks (Slack, Microsoft Teams, etc.).
Basta con pasar el nombre totalmente calificado database.schema.<secret_name> al argumento WEBHOOK_SECRET de la sentencia create notification integration. Por ejemplo:
CREATE OR REPLACE NOTIFICATION INTEGRATION my_slack_webhook_int
TYPE=WEBHOOK
ENABLED=TRUE
WEBHOOK_URL='https://hooks.slack.com/services/SNOWFLAKE_WEBHOOK_SECRET'
WEBHOOK_SECRET=my_secrets_db.my_secrets_schema.my_slack_webhook_secret
WEBHOOK_BODY_TEMPLATE='{"text": "SNOWFLAKE_WEBHOOK_MESSAGE"}'
WEBHOOK_HEADERS=('Content-Type'='application/json');
Gestión de Secrets en Snowflake
Mostrar todos los Secrets
Puedes listar todos los secrets con el comando show secrets.
show secrets; -- shows all secrets in account
show secrets in account; -- verbose way of `show secrets`
show secrets in database analytics; -- shows secrets for a database named analytics
Eliminar un Secret
Para eliminar un secret se usa el comando drop:
drop secret my_oauth2_secret; -- this works if your worksheet or connection has a database and schema context set.
drop secret <fully qualified secret name> -- this will always work
Modificar un Secret
alter secret sirve para rotar llaves o contraseñas, o para modificar cualquier otro aspecto del secret.
1alter secret <fully qualitfied secret name> set <parameter> = <value>;
Describir un Secret
Al describir un secret con describe secret <fully qualified secret name> se obtienen los siguientes campos:
- created on
- name
- schema_name
- database_name
- owner
- comment
- secret_type
- username
- oauth_access_token_expiry_time
- oauth_refresh_token_expiry_time
- oauth_scopes
- integration_name
Gestionar los secrets directamente en Snowflake es una forma muy efectiva de simplificar el manejo de información sensible al desarrollar aplicaciones, pipelines o alertas en Snowflake.
En el próximo artículo pondremos en práctica lo aprendido creando una alerta de Slack en Snowflake.
Jeff es Data and Analytics Consultant con más de 15 años de experiencia automatizando insights y usando datos para gobernar procesos de negocio. En lo tecnológico, se especializa en Snowflake + dbt + Tableau. En lo sectorial, cuenta con experiencia en utilities públicas, ensayos clínicos, publishing, CPG y manufactura. Escríbele cuando quieras a [email protected].