Esta página foi traduzida pela API Cloud Translation.
Switch to English

Como configurar ambientes com o Gerenciador de secrets

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

  1. Ative a API Secret Manager

    API Secret Manager

  2. 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
    • 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 para Some 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.

    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.

  3. 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ção secrets.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.

    Access Control

  4. 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 usando var.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.

  5. Ative e configure o back-end do Gerenciador de secrets

    1. Selecione o ambiente na página Ambientes para acessar a página Detalhes do ambiente.
    2. Clique em MODIFICAÇÕES DE CONFIGURAÇÃO DO AIRFLOW.
    3. Adicione a configuração:

      • Seção = secrets
      • Chave = backend
      • Valor = airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend

      Configuração de back-end do Gerenciador de secrets

    4. 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_path
        • sep: 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":"-"}

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')