Nesta página, mostramos como usar o Gerenciador de secrets para armazenar com segurança conexões e secrets do Airflow.
Pré-requisitos
Para usar o Secret Manager, o ambiente do Cloud Composer precisa usar o Airflow 1.10.1 ou posterior e o Python 3.6 ou posterior (o Python 2 não é compatível).
Como configurar seu ambiente com o Secret Manager
- Ative a API Secret Manager
Adicionar conexões e variáveis no Gerenciador de secrets (consulte Como criar secrets e versões para ver detalhes)
Os secrets precisam seguir este formato:
Variável:
[variable_prefix][sep][variable_name]
- O valor padrão de
[variable_prefix]
éairflow-variables
. - O separador padrão de
[sep]
é-
- Exemplo: para o nome da variável
my-var
, o nome do secret é:airflow-variables-my-var
- O valor padrão de
Conexão:
[connection_prefix][sep][connection_name]
- O valor padrão de
[connection_prefix]
éairflow-connections
. - O separador padrão de
[sep]
é-
- Exemplo: para a conexão
myConnection
, o nome do secret éairflow-connections-myConnection
. - Os valores de conexão precisam usar
a representação de URI,
por exemplo:
mysql://myhost:9000
. O URI precisa ser codificado por URL (percentual codificado). Por exemplo, o link paraSome Page
precisa ser:[https://myhost:9000/Some%20Page](https://myhost:9000/Some%20Page)
. O Airflow tem um método de conveniência para gerar URIs de conexão. Um exemplo de como codificar um URL complexo com extras em JSON está disponível na documentação do Airflow.
- O valor padrão de
Se você quiser usar valores diferentes para
[variable_prefix]
,[connection_prefix]
ou[sep]
, use as configurações opcionais na seção: Ativar e configurar o back-end do Gerenciador de secrets.Configurar o controle de acesso
O Airflow precisa receber acesso aos secrets armazenados no Secret Manager. Conceda um papel que inclua a permissão
secretmanager.versions.access
(como Acessador de secret do Secret Manager) à conta de serviço em que o ambiente do Cloud Composer acessará o Gerenciador de secrets. Esse papel pode ser concedido nos níveis Secret, Project, Folder ou Organization.Por padrão, essa conta é a conta de serviço padrão do Compute Engine, mas é possível especificar uma conta de serviço personalizada durante a criação do ambiente. Também é possível substituir a conta de serviço em que o Airflow acessa o Gerenciador de secrets definindo o parâmetro
gcp_key_path
da configuraçãosecrets.backend_kwargs
do Airflow para apontar para um arquivo JSON com as credenciais da conta de serviço. Esse método é menos aconselhável, porque requer o armazenamento das credenciais da conta de serviço em um arquivo, o que aumenta o risco de comprometimento.Ativar a serialização do DAG
Em geral, use o secret de back-end apenas nos métodos
execute()
dos operadores ou com os modelos JINJA dos macros do Airflow. Por exemplo, é possível recuperar variáveis usandovar.value.my_var
. O servidor da Web do Airflow é executado em uma conta de serviço diferente com permissões limitadas e não poderá acessar os secrets no Gerenciador de secrets.Se seu código do DAG acessar secrets durante o processamento (e não apenas das tarefas) e não puder ser ajustado conforme recomendado acima, você precisará ativar a serialização do DAG para usar o servidor da Web do Airflow.
Ative e configure o back-end do Gerenciador de secrets
- Selecione o ambiente na página Ambientes para acessar a página Detalhes do ambiente.
- Clique em MODIFICAÇÕES DE CONFIGURAÇÃO DO AIRFLOW.
Adicione a configuração:
- Seção =
secrets
- Chave =
backend
- Valor =
airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend
- Seção =
Adicione configurações opcionais:
- Seção =
secrets
- Chave =
backend_kwargs
Valor: a representação JSON de um objeto com os seguintes campos: (origem)
connections_prefix
: especifica o prefixo do secret a ser lido para conseguir conexões. Padrão:airflow-connections
variables_prefix
: especifica o prefixo do secret a ser lido para conseguir variáveis. Padrão:airflow-variables
gcp_key_path
: caminho para o arquivo JSON de credenciais do Google Cloud (se não for fornecido, a conta de serviço padrão será usada).gcp_keyfile_dict
: o dicionário JSON de credenciais do Google Cloud. Mutuamente exclusivo com gcp_key_pathsep
: separador usado para concatenar connections_prefix e conn_id. Padrão:-
project_id
: o ID do projeto do Google Cloud a partir do qual acessar segredos.
Exemplo:
Value = {"connections_prefix":"my-connections","variables_prefix":"my-variables", "sep":"-"}
- Seção =
Como usar o Gerenciador de secrets
Ao buscar variáveis e conexões, o Cloud Composer verifica primeiro o Secret Manager. Se a variável ou a conexão solicitada não for encontrada, o Cloud Composer verificará o banco de dados do ambiente/metastore.
Ler variáveis
Modelos do JINJA
É possível usar o Gerenciador de secrets para ler variáveis com modelo do JINJA (em inglês) em campos de operadores com modelo (solucionados no momento da execução).
Para a variável airflow-variables-secret_filename
, use:
file_name = 'var.value.secret_filename'
Operadores personalizados e callbacks
Você também pode usá-la para ler variáveis em operadores personalizados ou métodos de retorno de chamada de operadores. Ler variáveis no interior de DAGs pode afetar negativamente o desempenho. Por isso, recomendamos o uso de modelos JINJA se você quiser usar variáveis em DAGs.
Para a variável airflow-variables-myVariable
, use
from airflow.models.variable import Variable
myValue = Variable.get('myVariable')
Como ler conexões
A menos que você esteja gravando um operador personalizado, raramente será necessário acessar conexões diretamente. A maioria dos ganchos recebe o nome da conexão como seu parâmetro de instanciação e deve recuperar as conexões do back-end do secret automaticamente quando as tarefas forem executadas.
Ler conexões diretamente pode ser útil para gravar seu próprio gancho.
Para a conexão airflow-connections-myConnection
, use:
from airflow.hooks.base_hook import BaseHook
myConnection = BaseHook.get_connection('myConnection')