Cloud Composer 3 | Cloud Composer 2 | Cloud Composer 1
Esta página mostra como usar o Secret Manager para armazenar com segurança ligações e segredos do Airflow.
Antes de começar
- Para usar o Secret Manager, o seu ambiente do Cloud Composer tem de usar o Airflow 1.10.10 ou posterior e o Python 3.6 ou posterior.
- O Python 2 não é suportado.
Configure o Secret Manager para o seu ambiente
Esta secção explica como configurar o Secret Manager para que possa usar segredos com o seu ambiente do Cloud Composer.
Ative a API Secret Manager
Consola
Enable the Secret Manager API.
gcloud
Enable the Secret Manager API:
gcloud services enable secretmanager.googleapis.com
Configure o controlo de acesso
Tem de configurar o controlo de acesso para que o Airflow possa aceder a segredos armazenados no Gestor Secreto.
Para tal, a conta de serviço que acede aos segredos tem de ter uma função com a autorização secretmanager.versions.access
. Por exemplo, a função Secret Manager Secret Accessor inclui esta autorização.
Pode conceder esta função ao nível do segredo, do projeto, da pasta ou da organização.
Use uma das seguintes opções:
(Recomendado) Conceda esta função à conta de serviço do seu ambiente.
Substituir a conta de serviço através da qual o Airflow acede ao Secret Manager.
- Conceda esta função a uma conta de serviço.
- Defina o parâmetro
gcp_key_path
dabackend_kwargs
opção de configuração do Airflow para apontar para um ficheiro JSON com as credenciais da conta de serviço.
Ative a serialização de DAGs
Em geral, só deve usar o back-end do Secret Manager a partir dos métodos execute()
dos seus operadores ou com os modelos Jinja.
Por exemplo, pode obter variáveis através de var.value.example_var
.
O servidor Web do Airflow é executado numa conta de serviço diferente com autorizações limitadas, pelo que não pode aceder a segredos no Secret Manager. Se o seu código DAG aceder a segredos durante o processamento de DAG (não apenas a partir de tarefas) e não for possível ajustá-lo para aceder a segredos a partir dos métodos execute()
, ative a serialização de DAG. Depois de o fazer, o servidor Web do Airflow recebe os DAGs processados e não precisa de acesso a segredos.
Ative e configure o back-end do Secret Manager
Substitua a seguinte opção de configuração do Airflow:
Secção Chave Valor secrets
backend
airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend
Adicione definições opcionais substituindo a seguinte opção de configuração do Airflow:
Secção Chave Valor secrets
backend_kwargs
Veja a descrição seguinte. O valor
backend_kwargs
é a representação JSON do objetobackend_kwargs
com os seguintes campos:connections_prefix
: prefixo do nome do segredo a ler para obter ligações. A predefinição éairflow-connections
.variables_prefix
: prefixo do nome secreto a ler para obter as variáveis. A predefinição é:airflow-variables
.gcp_key_path
: caminho para o Google Cloud ficheiro JSON de credenciais (se não for fornecido, é usada a conta de serviço predefinida).gcp_keyfile_dict
: Google Cloud dicionário JSON de credenciais. Exclusivo comgcp_key_path
.sep
: separador usado para concatenarconnections_prefix
econn_id
. A predefinição é-
.project_id
: Google Cloud ID do projeto onde os segredos estão armazenados.
Por exemplo, o valor de
backend_kwargs
pode ser:{"project_id": "<project id>", "connections_prefix":"example-connections", "variables_prefix":"example-variables", "sep":"-"}
.
Adicione ligações e variáveis no Secret Manager
Crie segredos seguindo os passos descritos no artigo Criar segredos e versões.
Variáveis
- Tem de usar o formato
[variables_prefix][sep][variable_name]
. - O valor predefinido de
[variables_prefix]
éairflow-variables
. - O separador predefinido
[sep]
é-
.
Por exemplo, se o nome da variável for example-var
, o nome do segredo é airflow-variables-example-var
.
Nomes das associações
- Tem de usar o formato
[connection_prefix][sep][connection_name]
. - O valor predefinido de
[connection_prefix]
éairflow-connections
. - O separador predefinido
[sep]
é-
.
Por exemplo, se o nome da ligação for exampleConnection
, o nome do segredo é airflow-connections-exampleConnection
.
Valores de associação
Tem de usar a representação de URI. Por exemplo,
postgresql://login:secret@examplehost:9000
.O URI tem de estar codificado por URL (codificado em percentagem). Por exemplo, uma palavra-passe que tenha um símbolo de espaço tem de ser codificada por URL da seguinte forma:
postgresql://login:secret%20password@examplehost:9000
.
O Airflow tem um método prático para gerar URIs de ligação. Pode encontrar um exemplo de como codificar um URL complexo com extras JSON na documentação do Airflow.
Use o Secret Manager com o Cloud Composer
Ao obter variáveis e ligações, o Cloud Composer verifica primeiro o Secret Manager. Se a variável ou a ligação pedida não for encontrada, o Cloud Composer verifica as variáveis de ambiente e a base de dados do Airflow.
Leia variáveis através de modelos Jinja
Pode usar o Secret Manager para ler variáveis com a modelagem Jinja para campos de operador baseados em modelos (resolvidos no momento da execução).
Para o segredo airflow-variables-secret_filename
:
file_name = '{{var.value.secret_filename}}'
Leia variáveis através de operadores personalizados e callbacks
Também pode usar o Secret Manager para ler variáveis em operadores personalizados ou métodos de callback de operadores. A leitura de variáveis a partir do interior dos DAGs pode afetar negativamente o desempenho. Por isso, use modelos Jinja se quiser usar variáveis nos seus DAGs.
Por exemplo, para o segredo airflow-variables-secret_filename
:
from airflow.models.variable import Variable
file_name = Variable.get('secret_filename')
Ler associações
A menos que esteja a escrever um operador personalizado, raramente precisa de aceder diretamente às ligações. A maioria dos hooks recebe o nome da ligação como parâmetro de instanciação e deve obter as ligações do back-end secreto automaticamente quando as tarefas são executadas.
Ler as associações diretamente pode ser útil quando escreve o seu próprio gancho.
Por exemplo, para a ligação airflow-connections-exampleConnection
:
from airflow.hooks.base_hook import BaseHook
exampleConnection = BaseHook.get_connection('exampleConnection')
BaseHook.get_connection
devolve um objeto Connection
. É possível obter a representação de string do URI de uma ligação da seguinte forma:
exampleConnectionUri = BaseHook.get_connection('exampleConnection').get_uri()