Configure o Secret Manager para o seu ambiente

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.

Enable the 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:

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

  1. Substitua a seguinte opção de configuração do Airflow:

    Secção Chave Valor
    secrets backend airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend
  2. 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 objeto backend_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 com gcp_key_path.
    • sep: separador usado para concatenar connections_prefix e conn_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()

O que se segue?