Como gerenciar dependências do Python em requirements.txt - Amazon Managed Workflows for Apache Airflow

Como gerenciar dependências do Python em requirements.txt

Este tópico descreve como instalar e gerenciar dependências do Python em um arquivo requirements.txt para um ambiente Amazon Managed Workflows for Apache Airflow.

Como testar DAGs usando o utilitário Amazon MWAA CLI

  • O utilitário da interface de linha de comandos (CLI) replica localmente um ambiente do Amazon Managed Workflows for Apache Airflow.

  • A CLI cria localmente uma imagem de contêiner Docker semelhante a uma imagem de produção do Amazon MWAA. Você pode usá-la para executar um ambiente local do Apache Airflow para desenvolver e testar DAGs, plug-ins personalizados e dependências antes da implantação no Amazon MWAA.

  • Para executar a CLI, consulte aws-mwaa-docker-images no GitHub.

Como instalar dependências do Python usando o formato de arquivo de requisitos do Pypi.org

A seção a seguir descreve as diferentes maneiras de instalar dependências do Python de acordo com o formato de arquivo de requisitos do Pypi.org.

Opção 1: dependências do Python do Python Package Index

A seção a seguir descreve como especificar dependências do Python do Python Package Index em um arquivo requirements.txt.

Apache Airflow v3
  1. Testar localmente. Adicione bibliotecas adicionais de forma iterativa para encontrar a combinação certa de pacotes e suas versões, antes de criar um arquivo requirements.txt. Para executar a CLI do Amazon MWAA, consulte aws-mwaa-docker-images no GitHub.

  2. Revise os extras do pacote Apache Airflow. Para acessar uma lista dos pacotes instalados para o Apache Airflow v3 no Amazon MWAA, consulte aws-mwaa-docker-images requirements.txt no site do GitHub.

  3. Adicione uma declaração de restrições. Adicione o arquivo de restrições do seu ambiente Apache Airflow v3 na parte superior do seu arquivo requirements.txt. Os arquivos de restrições do Apache Airflow especificam as versões do provedor disponíveis no momento de um lançamento do Apache Airflow.

    No exemplo a seguir, substitua {environment-version} pelo número da versão do seu ambiente e {Python-version} pela versão do Python compatível com o ambiente.

    Para obter informações sobre a versão do Python compatível com o ambiente do Apache Airflow, consulte Versões do Apache Airflow.

    --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-{Airflow-version}/constraints-{Python-version}.txt"

    Se o arquivo de restrições determinar que o pacote xyz==1.0 não é compatível com outros pacotes em seu ambiente, pip3 install não conseguirá impedir que bibliotecas incompatíveis sejam instaladas em seu ambiente. Se a instalação falhar em qualquer pacote, você pode acessar os logs de erros de cada componente do Apache Airflow (o agendador, o operador e o servidor Web) no fluxo de logs correspondente no CloudWatch Logs. Para obter mais informações sobre tipos de log, consulte Como acessar logs do Airflow no Amazon CloudWatch.

  4. Pacotes do Apache Airflow. Adicione os extras do pacote e a versão (==). Isso ajuda a evitar que pacotes com o mesmo nome, mas com versões diferentes, sejam instalados em seu ambiente.

    apache-airflow[package-extra]==2.5.1
  5. Bibliotecas Python. Adicione o nome do pacote e a versão (==) em seu arquivo requirements.txt. Isso ajuda a evitar que uma atualização futura de última hora do Pypi.org seja aplicada automaticamente.

    library == version
    exemplo Boto3 e psycopg2-binary

    Esse exemplo de código é fornecido para fins de demonstração. As bibliotecas boto e psycopg2-binary estão incluídas na instalação básica do Apache Airflow v3 e não precisam ser especificadas em um arquivo requirements.txt.

    boto3==1.17.54 boto==2.49.0 botocore==1.20.54 psycopg2-binary==2.8.6

    Se um pacote for especificado sem uma versão, o Amazon MWAA instalará a versão mais recente do pacote em PYPI.org. Essa versão pode entrar em conflito com outros pacotes em seu requirements.txt.

Apache Airflow v2
  1. Testar localmente. Adicione bibliotecas adicionais de forma iterativa para encontrar a combinação certa de pacotes e suas versões, antes de criar um arquivo requirements.txt. Para executar a CLI do Amazon MWAA, consulte aws-mwaa-docker-images no GitHub.

  2. Revise os extras do pacote Apache Airflow. Para acessar uma lista dos pacotes instalados para o Apache Airflow v2 no Amazon MWAA, consulte aws-mwaa-docker-images requirements.txt no site do GitHub.

  3. Adicione uma declaração de restrições. Adicione o arquivo de restrições do seu ambiente Apache Airflow v2 na parte superior do seu arquivo requirements.txt. Os arquivos de restrições do Apache Airflow especificam as versões do provedor disponíveis no momento de um lançamento do Apache Airflow.

    A partir do Apache Airflow v2.7.2, seu arquivo de requisitos deve incluir uma declaração --constraint. Se você não fornecer uma restrição, o Amazon MWAA especificará uma para garantir que os pacotes listados em seus requisitos sejam compatíveis com a versão do Apache Airflow que você está usando.

    No exemplo a seguir, substitua {environment-version} pelo número da versão do seu ambiente e {Python-version} pela versão do Python compatível com o ambiente.

    Para obter informações sobre a versão do Python compatível com o ambiente do Apache Airflow, consulte Versões do Apache Airflow.

    --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-{Airflow-version}/constraints-{Python-version}.txt"

    Se o arquivo de restrições determinar que o pacote xyz==1.0 não é compatível com outros pacotes em seu ambiente, pip3 install não conseguirá impedir que bibliotecas incompatíveis sejam instaladas em seu ambiente. Se a instalação falhar em qualquer pacote, você pode acessar os logs de erros de cada componente do Apache Airflow (o agendador, o operador e o servidor Web) no fluxo de logs correspondente no CloudWatch Logs. Para obter mais informações sobre tipos de log, consulte Como acessar logs do Airflow no Amazon CloudWatch.

  4. Pacotes do Apache Airflow. Adicione os extras do pacote e a versão (==). Isso ajuda a evitar que pacotes com o mesmo nome, mas com versões diferentes, sejam instalados em seu ambiente.

    apache-airflow[package-extra]==2.5.1
  5. Bibliotecas Python. Adicione o nome do pacote e a versão (==) em seu arquivo requirements.txt. Isso ajuda a evitar que uma atualização futura de última hora do Pypi.org seja aplicada automaticamente.

    library == version
    exemplo Boto3 e psycopg2-binary

    Esse exemplo de código é fornecido para fins de demonstração. As bibliotecas boto e psycopg2-binary estão incluídas na instalação básica do Apache Airflow v2 e não precisam ser especificadas em um arquivo requirements.txt.

    boto3==1.17.54 boto==2.49.0 botocore==1.20.54 psycopg2-binary==2.8.6

    Se um pacote for especificado sem uma versão, o Amazon MWAA instalará a versão mais recente do pacote em PYPI.org. Essa versão pode entrar em conflito com outros pacotes em seu requirements.txt.

Opção dois: wheel do Python (.whl)

O wheel do Python é um formato de pacote projetado para enviar bibliotecas com artefatos compilados. Há vários benefícios em usar pacotes wheel como um método para instalar dependências no Amazon MWAA:

  • Instalação mais rápida: os arquivos WHL são copiados para o contêiner como um único ZIP e depois instalados localmente, sem precisar baixar um por um.

  • Menos conflitos: você pode determinar a compatibilidade de versões de seus pacotes com antecedência. Como resultado, não há necessidade de pip para elaborar recursivamente versões compatíveis.

  • Mais resiliência: com bibliotecas hospedadas externamente, os requisitos posteriores podem mudar, resultando em incompatibilidade de versões entre contêineres em um ambiente do Amazon MWAA. Por não depender de uma fonte externa para dependências, cada contêiner tem as mesmas bibliotecas, independentemente de quando cada contêiner é instanciado.

Recomendamos os seguintes métodos para instalar dependências do Python a partir de um arquivo wheel do Python (.whl) no seu arquivo requirements.txt.

Como usar o arquivo plugins.zip em um bucket do Amazon S3

O agendador, os operadores e o servidor Web do Apache Airflow (para o Apache Airflow v2.2.2 e versões posteriores) procuram plug-ins personalizados durante o startup no contêiner Fargate gerenciado pela AWS para seu ambiente em /usr/local/airflow/plugins/*. Esse processo começa antes de pip3 install -r requirements.txt do Amazon MWAA para as dependências do Python e da inicialização do serviço no Apache Airflow. Um arquivo plugins.zip pode ser usado para qualquer arquivo que você não queira que seja alterado continuamente durante a execução do ambiente ou que você não queira conceder acesso aos usuários que gravem DAGs. Por exemplo, arquivos de wheel de biblioteca Python, arquivos PEM de certificado e arquivos YAML de configuração.

A seção a seguir descreve como instalar um wheel que está no arquivo plugins.zip em seu bucket do Amazon S3.

  1. Baixe os arquivos WHL necessários Você pode usar pip download com seu requirements.txt existente no aws-mwaa-docker-images do Amazon MWAA ou em outro contêiner do Amazon Linux 2 para solucionar e baixar os arquivos necessários do wheel do Python.

    pip3 download -r "$AIRFLOW_HOME/dags/requirements.txt" -d "$AIRFLOW_HOME/plugins" cd "$AIRFLOW_HOME/plugins" zip "$AIRFLOW_HOME/plugins.zip" *
  2. Especifique o caminho em seu requirements.txt. Especifique o diretório de plug-ins na parte superior do seu requirements.txt usando --find-links e instrua pip a não instalar de outras fontes usando --no-index, conforme mostrado no seguinte código:

    --find-links /usr/local/airflow/plugins --no-index
    exemplo wheel em requirements.txt

    O exemplo a seguir pressupõe que você tenha carregado o wheel em um arquivo plugins.zip na raiz do seu bucket do Amazon S3. Por exemplo:

    --find-links /usr/local/airflow/plugins --no-index numpy

    O Amazon MWAA busca o wheel numpy-1.20.1-cp37-cp37m-manylinux1_x86_64.whl da pasta plugins e o instala em seu ambiente.

Como usar um arquivo WHL hospedado em uma URL

A seção a seguir descreve como instalar um wheel hospedado em uma URL. A URL deve ser acessível publicamente ou de dentro do Amazon VPC personalizado que você especificou para seu ambiente do Amazon MWAA.

  • Forneça um URL. Forneça o URL de um wheel em seu arquivo requirements.txt.

    exemplo arquivo wheel em um URL público

    O exemplo a seguir baixa um wheel de um site público.

    --find-links https://files.pythonhosted.org/packages/ --no-index

    O Amazon MWAA busca o wheel a partir da URL que você especificou e a instala em seu ambiente.

    nota

    Os URLs não são acessíveis a partir de servidores Web privados que instalam requisitos no Amazon MWAA v2.2.2 e versões posteriores.

Como criar arquivos WHL a partir de um DAG

Caso você tenha um servidor Web privado que use o Apache Airflow v2.2.2 ou versões posteriores e não consiga instalar os requisitos porque seu ambiente não tem acesso a repositórios externos, é possível usar o seguinte DAG para obter seus requisitos existentes do Amazon MWAA e empacotá-los no Amazon S3:

from airflow import DAG from airflow.operators.bash_operator import BashOperator from airflow.utils.dates import days_ago S3_BUCKET = 'my-s3-bucket' S3_KEY = 'backup/plugins_whl.zip' with DAG(dag_id="create_whl_file", schedule_interval=None, catchup=False, start_date=days_ago(1)) as dag: cli_command = BashOperator( task_id="bash_command", bash_command=f"mkdir /tmp/whls;pip3 download -r /usr/local/airflow/requirements/requirements.txt -d /tmp/whls;zip -j /tmp/plugins.zip /tmp/whls/*;aws s3 cp /tmp/plugins.zip s3://amzn-s3-demo-bucket/{S3_KEY}" )

Depois de executar o DAG, use esse novo arquivo como seu plugins.zip do Amazon MWAA, opcionalmente, empacotado com outros plug-ins. Em seguida, atualize seus requirements.txt precedidos por --find-links /usr/local/airflow/plugins e --no-index sem adicionar --constraint.

Esse método permite que você use as mesmas bibliotecas off-line.

Opção três: dependências do Python hospedadas em um repositório privado compatível com PyPi/PEP-503

A seção a seguir descreve como instalar um extra do Apache Airflow hospedado em uma URL privada com autenticação.

  1. Adicione seu nome de usuário e senha como opções de configuração do Apache Airflow. Por exemplo:

    • foo.user : YOUR_USER_NAME

    • foo.pass : YOUR_PASSWORD

  2. crie seu arquivo requirements.txt. Substitua os espaços reservados no exemplo a seguir pelo seu URL privado e pelo nome de usuário e senha que você adicionou como opções de configuração do Apache Airflow. Por exemplo:

    --index-url https://${AIRFLOW__FOO__USER}:${AIRFLOW__FOO__PASS}@my.privatepypi.com
  3. adicione outras bibliotecas ao seu arquivo requirements.txt. Por exemplo:

    --index-url https://${AIRFLOW__FOO__USER}:${AIRFLOW__FOO__PASS}@my.privatepypi.com my-private-package==1.2.3

Como habilitar logs no console do Amazon MWAA

O perfil de execução de seu ambiente do Amazon MWAA precisa de permissão para enviar logs ao CloudWatch Logs. Para atualizar as permissões de um perfil de execução, consulte Perfil de execução do Amazon MWAA.

Você pode ativar os logs do Apache Airflow no nível INFO, WARNING, ERROR e CRITICAL. Quando você escolhe um nível de log, o Amazon MWAA envia logs desse nível e de todos os níveis mais altos de severidade. Por exemplo, se você habilitar logs no nível INFO, o Amazon MWAA enviará logs INFO e níveis de log WARNING, ERROR e CRITICAL para o CloudWatch Logs. Recomendamos habilitar os logs do Apache Airflow no nível INFO do agendador para acessar os logs recebidos para requirements.txt.

Esta imagem mostra como habilitar logs no nível INFO.

Como acessar logs no console do CloudWatch Logs

Você pode acessar os logs do Apache Airflow para o agendador que agendar seus fluxos de trabalho e analisar sua pasta dags. As etapas a seguir descrevem como abrir o grupo de logs do agendador no console do Amazon MWAA e acessar os logs do Apache Airflow no console do CloudWatch Logs.

Para acessar os logs para um requirements.txt
  1. Abra a página Ambientes no console do Amazon MWAA.

  2. Escolha um ambiente.

  3. Escolha grupo de logs de agendador do Airflow no painel Monitoramento.

  4. Escolha o log requirements_install_ip em Fluxos de logs.

  5. Consulte a lista de pacotes que foram instalados no ambiente em /usr/local/airflow/.local/bin. Por exemplo:

    Collecting appdirs==1.4.4 (from -r /usr/local/airflow/.local/bin (line 1)) Downloading https://files.pythonhosted.org/packages/3b/00/2344469e2084fb28kjdsfiuyweb47389789vxbmnbjhsdgf5463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl Collecting astroid==2.4.2 (from -r /usr/local/airflow/.local/bin (line 2))
  6. Analise a lista de pacotes e verifique se algum deles encontrou algum erro durante a instalação. Se algo der errado, pode ocorrer um erro semelhante ao seguinte:

    2021-03-05T14:34:42.731-07:00 No matching distribution found for LibraryName==1.0.0 (from -r /usr/local/airflow/.local/bin (line 4)) No matching distribution found for LibraryName==1.0.0 (from -r /usr/local/airflow/.local/bin (line 4))

Como acessar erros na IU do Apache Airflow

Você também pode verificar sua IU do Apache Airflow para identificar se um erro pode estar relacionado a outro problema. O erro mais comum que você pode encontrar com o Apache Airflow no Amazon MWAA é:

Broken DAG: No module named x

Se ocorrer esse erro na IU do Apache Airflow, provavelmente está faltando uma dependência necessária em seu arquivo requirements.txt.

Login no Apache Airflow

Você precisa de permissões Política de acesso à IU do Apache Airflow: AmazonMWAAWebServerAccess para sua Conta da AWS no AWS Identity and Access Management (IAM) para acessar sua IU do Apache Airflow.

Para acessar sua IU do Apache Airflow
  1. Abra a página Ambientes no console do Amazon MWAA.

  2. Escolha um ambiente.

  3. Escolha Abrir a IU do Airflow.

Cenários de exemplo de requirements.txt

Você pode misturar e combinar diferentes formatos no seu requirements.txt. O exemplo a seguir usa uma combinação das diferentes formas de instalar extras.

exemplo Extras em Pypi.org e em um URL público

Você precisa usar a opção --index-url ao especificar pacotes do PyPI.org, além dos pacotes em uma URL pública, como URLs de repositório personalizados compatíveis com PEP 503.

aws-batch == 0.6 phoenix-letter >= 0.3 --index-url http://dist.repoze.org/zope2/2.10/simple zopelib