Cloud Composer 3 | Cloud Composer 2 | Cloud Composer 1
Nesta página, mostramos como usar o Gerenciador de secrets para armazenar com segurança conexões e secrets do Airflow.
Configurar o Secret Manager para seu ambiente
Nesta seção, explicamos como configurar o Secret Manager para poder usar secrets com o ambiente do Cloud Composer.
Ativar a API Secret Manager
Console
Enable the Secret Manager API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM
role (roles/serviceusage.serviceUsageAdmin), which
contains the serviceusage.services.enable permission. Learn how to grant
roles.
gcloud
Enable the Secret Manager API:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM
role (roles/serviceusage.serviceUsageAdmin), which contains the
serviceusage.services.enable permission. Learn how to grant
roles.
gcloud services enable secretmanager.googleapis.com
Configurar o controle de acesso
É preciso configurar o controle de acesso para que o Airflow possa acessar secrets armazenados no Secret Manager.
Para fazer isso, a conta de serviço que acessa os secrets precisa ter um papel com
a permissão secretmanager.versions.access. Por exemplo,
o papel de Acessador de secrets do Gerenciador de secrets inclui essa permissão.
É possível conceder esse papel no nível Segredo, Projeto, Pasta ou Organização.
Use uma das seguintes opções:
(Recomendado) Conceda esse papel à conta de serviço do seu ambiente.
Modifique a conta de serviço na qual o Airflow acessa o Gerenciador de secrets.
- Conceda esse papel a uma conta de serviço.
- Defina o parâmetro
gcp_key_pathda opção de configuração do Airflow dobackend_kwargsde modo que aponte para um arquivo JSON com as credenciais da conta de serviço.
Ativar e configurar o back-end do Gerenciador de secrets
Substitua a seguinte opção de configuração do Airflow:
Seção Chave Valor secretsbackendairflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend(Cloud Composer 2.11.3 com Airflow 2.10.2 e versões mais recentes) Verifique se a opção de configuração do Airflow
[secrets]backends_orderespecifica uma ordem de pesquisa de secrets que tenha um back-end de secretscustomnela. O valor padrão dessa opção já contém esse valor.Seção Chave Valor secretsbackends_order(padrão) custom,environment_variable,metastoreAdicione configurações opcionais substituindo a seguinte opção de configuração do Airflow:
Seção Chave Valor secretsbackend_kwargsVeja a descrição a seguir. O valor
backend_kwargsé a representação JSON do objetobackend_kwargscom os seguintes campos:connections_prefix: prefixo do nome do secret a ser lido para conseguir conexões. O padrão éairflow-connections.variables_prefix: prefixo do nome do secret a ser lido para conseguir variáveis. O 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: Google Cloud dicionário JSON de credenciais. Mutuamente exclusivo comgcp_key_path.sep: separador usado para concatenarconnections_prefixeconn_id. O padrão é-.project_id: Google Cloud ID do projeto em que os secrets são armazenados.
Por exemplo, o valor de
backend_kwargspode ser:{"project_id": "<project id>", "connections_prefix":"example-connections", "variables_prefix":"example-variables", "sep":"-"}.
Adicionar conexões e variáveis no Gerenciador de secrets
Crie secrets seguindo as etapas descritas em Como criar secrets e versões.
Variáveis
- É necessário usar o formato
[variables_prefix][sep][variable_name]. - O valor padrão de
[variables_prefix]éairflow-variables. - O separador padrão de
[sep]é-.
Por exemplo, se o nome da variável for example-var, o nome do
secret será airflow-variables-example-var.
Nomes de conexão
- É necessário usar o formato
[connection_prefix][sep][connection_name]. - O valor padrão de
[connection_prefix]éairflow-connections. - O separador padrão de
[sep]é-.
Por exemplo, se o nome da conexão for exampleConnection,
o nome do secret será airflow-connections-exampleConnection.
Valores de conexão
É necessário usar a representação do URI. Por exemplo,
postgresql://login:secret@examplehost:9000.O URI precisa ser codificado por URL (percentual codificado). Por exemplo, uma senha que tenha um símbolo de espaço precisa ser codificada em URL da seguinte maneira:
postgresql://login:secret%20password@examplehost:9000.
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.
Usar o Secret Manager com o Cloud Composer
Ao buscar variáveis e conexões, o Cloud Composer verifica primeiro o gerenciador de secrets. Se a variável ou conexão solicitada não for encontrada, o Cloud Composer verificará as variáveis de ambiente e o banco de dados do Airflow.
Ler variáveis usando modelos do Jinja
É possível usar o Secret Manager para ler variáveis com modelo do Jinja em campos de operadores com modelo (solucionados no momento da execução).
Para o secret airflow-variables-secret_filename:
file_name = '{{var.value.secret_filename}}'
Ler variáveis usando operadores personalizados e callbacks
Use o Gerenciador de secrets para ler variáveis em operadores personalizados ou métodos de callback dos operadores. A leitura de variáveis de DAGs internos pode afetar negativamente o desempenho. Portanto, use modelos Jinja se quiser usar variáveis nos DAGs.
Por exemplo, para o secret airflow-variables-secret_filename:
from airflow.models.variable import Variable
file_name = Variable.get('secret_filename')
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.
Por exemplo, para a conexão airflow-connections-exampleConnection:
from airflow.hooks.base_hook import BaseHook
exampleConnection = BaseHook.get_connection('exampleConnection')
BaseHook.get_connection retorna um objeto Connection. É possível conseguir a representação da string de URI de uma conexão como esta:
exampleConnectionUri = BaseHook.get_connection('exampleConnection').get_uri()