Was sind Snowflake Secrets?
Ein Secret in Snowflake ist ein Objekt auf Schema-Ebene, in dem Sie sensible Informationen wie API-Keys oder Passwörter ablegen können.
Wozu gibt es dieses Feature?
Snowflake hat in den letzten Monaten zahlreiche Funktionen ausgerollt, mit denen sich Anwendungen und Datenpipelines direkt in Snowflake entwickeln lassen:
- Mit Snowpark Container Services lassen sich eigene Anwendungen in beliebigen Programmiersprachen betreiben.
- Snowpark for Python etabliert sich als beliebte Wahl für Data-Engineering-Aufgaben – bis hin zu kompletten ELT-/ETL-Pipelines.
- Alerts lassen sich inzwischen per E-Mail, Slack oder Microsoft Teams (via Webhook) verschicken.
- Snowflake erlaubt mittlerweile API-Aufrufe ins öffentliche Internet – viele Nutzer wollen damit etwa die OpenAI-APIs in ihrem Snowflake-Account nutzen.
In all diesen Szenarien müssen Secrets gespeichert und abgerufen werden, um sich gegenüber verschiedenen Anwendungen und Services zu authentifizieren.
Vorteile, Secrets in Snowflake zu verwalten
- In Snowflake angelegte Secrets nutzen dieselbe RBAC-Logik, die Sie bereits aus Snowflake kennen (z. B.
grant usage on secret to role <role>). - Das Secret liegt direkt neben Ihrem Anwendungs- oder Pipeline-Code – kein zusätzliches System, das gepflegt werden muss.
- Ein externer Secrets Manager (etwa AWS Secrets Manager) wäre nur schwer einsetzbar, solange es keinen schlanken Weg gibt, sich überhaupt gegenüber diesem Secrets Manager zu authentifizieren.
So erstellen Sie ein Snowflake Secret
In Snowflake gibt es vier Arten von Secrets; das DDL unterscheidet sich je nach Typ leicht.
OAuth:
Syntax
CREATE [ OR REPLACE ] SECRET [ IF NOT EXISTS ] <name>
TYPE = OAUTH2
API_AUTHENTICATION = <security_integration_name>
OAUTH_SCOPES = ( '<scope_1>' [ , '<scope_2>' ... ] )
[ COMMENT = '<string_literal>' ]
Beispiel
-- 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')
Code ausklappen
Cloud Provider:
Syntax:
CREATE [ OR REPLACE ] SECRET [ IF NOT EXISTS ] <name>
TYPE = CLOUD_PROVIDER_TOKEN
API_AUTHENTICATION = '<cloud_provider_security_integration>'
[ COMMENT = '<string_literal>' ]
Beispiel:
-- assume this integration exists called test_integration:
CREATE OR REPLACE SECRET test_secret
TYPE = CLOUD_PROVIDER_TOKEN
API_AUTHENTICATION = 'TEST_INTEGRATION';
Basic Auth:
Syntax:
CREATE [ OR REPLACE ] SECRET [ IF NOT EXISTS ] <name>
TYPE = PASSWORD
USERNAME = '<username>'
PASSWORD = '<password>'
[ COMMENT = '<string_literal>' ]
Beispiel:
CREATE OR REPLACE SECRET my_password_secret
TYPE = PASSWORD
USERNAME = 'db_user'
PASSWORD = 'MySecurePass123!'
COMMENT = 'Database credentials for application access';
Generic String:
Syntax:
CREATE [ OR REPLACE ] SECRET [ IF NOT EXISTS ] <name>
TYPE = GENERIC_STRING
SECRET_STRING = '<string_literal>'
[ COMMENT = '<string_literal>' ]
Beispiel:
CREATE OR REPLACE SECRET my_string_secret
TYPE = GENERIC_STRING
SECRET_STRING = 'my-secret-api-key-123'
COMMENT = 'API key for service authentication';
So nutzen Sie ein Snowflake Secret in Ihrem Code
Secrets lassen sich ausschließlich aus Java oder Python heraus abrufen. Wenn Sie eine Anwendung in Snowpark Container Services in einer anderen Programmiersprache betreiben, brauchen Sie ein kleines eigenes Modul in Java oder Python, das das Secret abruft und den Wert an Ihre Anwendung zurückgibt.
Hier ein Beispiel, wie Sie ein Secret mit Python abrufen.
Schritt 1: Funktion anlegen, die ein Secret per Name abruft
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
Code ausklappen
Schritt 2: Funktion aufrufen
1SELECT get_secret_by_name('jeffs_credentials');
Secrets in Notification Integrations / Webhooks einsetzen
Snowflake bietet einen komfortablen Weg, ein Secret an Notification Integrations zu übergeben, um Alerts an Webhooks (Slack, Microsoft Teams etc.) zu schicken.
Übergeben Sie dazu einfach den voll qualifizierten Namen database.schema.<secret_name> an das Argument WEBHOOK_SECRET des create notification integration-Statements. Zum Beispiel:
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');
Secrets in Snowflake verwalten
Alle Secrets anzeigen
Mit dem Befehl show secrets listen Sie alle Secrets auf.
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
Secret löschen
Mit drop löschen Sie ein Secret:
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
Secret ändern
Mit alter secret rotieren Sie Keys oder Passwörter oder passen beliebige andere Eigenschaften eines Secrets an.
1alter secret <fully qualitfied secret name> set <parameter> = <value>;
Secret beschreiben
Wenn Sie ein Secret mit describe secret <fully qualified secret name> beschreiben, liefert Snowflake folgende Felder zurück:
- 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
Secrets direkt in Snowflake zu verwalten, ist ein wirkungsvoller Weg, den Umgang mit sensiblen Daten bei der Entwicklung von Anwendungen, Pipelines oder Alerts in Snowflake zu vereinfachen.
Im nächsten Artikel setzen wir dieses Wissen in die Praxis um und bauen einen Slack-Alert in Snowflake.
Jeff ist Data- und Analytics-Consultant mit über 15 Jahren Erfahrung in der Automatisierung von Insights und im Einsatz von Daten zur Steuerung von Geschäftsprozessen. Technologisch ist er auf Snowflake + dbt + Tableau spezialisiert. Branchenseitig bringt er Erfahrung aus Versorgungswirtschaft, klinischen Studien, Verlagswesen, CPG und Fertigung mit. Sie erreichen ihn jederzeit unter [email protected].