View a markdown version of this page

Como usar o Amazon MWAA com o Amazon EKS - Amazon Managed Workflows for Apache Airflow

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Como usar o Amazon MWAA com o Amazon EKS

O exemplo a seguir demonstra como usar o Amazon Managed Workflows for Apache Airflow com o Amazon EKS.

Versão

É possível usar o exemplo de código nesta página com o Apache Airflow v2 no Python 3.10 e o Apache Airflow v3 no Python 3.11.

Pré-requisitos

Para usar o exemplo deste tópico, você precisará de:

nota

Ao usar um comando eksctl, é possível incluir um --profile para especificar um perfil diferente do padrão.

Criar uma chave pública para o Amazon EC2

Use o comando a seguir para criar uma chave pública de seu par de chaves privadas.

ssh-keygen -y -f myprivatekey.pem > mypublickey.pub

Para saber mais, consulte Recuperar a chave pública para seu par de chaves.

Criar um cluster.

Use o seguinte comando para criar o cluster. Se quiser um nome personalizado para o cluster ou criá-lo em uma região diferente, substitua o nome e os valores da região. Você deve criar o cluster na mesma região em que criou o ambiente do Amazon MWAA. Substitua os valores das sub-redes para que correspondam às sub-redes na sua rede Amazon VPC que você usa para o Amazon MWAA. Substitua o valor de ssh-public-key para corresponder à chave que você usa. É possível usar uma chave existente do Amazon EC2 que esteja na mesma região ou criar uma nova chave na mesma região em que você criar seu ambiente Amazon MWAA.

eksctl create cluster \ --name mwaa-eks \ --region us-west-2 \ --version 1.30 \ --nodegroup-name linux-nodes \ --nodes 3 \ --nodes-min 1 \ --nodes-max 4 \ --with-oidc \ --ssh-access \ --ssh-public-key MyPublicKey \ --managed \ --vpc-public-subnets "subnet-11111111111111111, subnet-2222222222222222222" \ --vpc-private-subnets "subnet-33333333333333333, subnet-44444444444444444"

Leva algum tempo para concluir a criação do cluster. Depois de concluído, é possível verificar se o cluster foi criado com sucesso e se o provedor IAM OIDC está configurado usando o seguinte comando:

eksctl utils associate-iam-oidc-provider \ --region us-west-2 \ --cluster mwaa-eks \ --approve
Modo de autenticação de cluster EKS

O Amazon EKS oferece suporte a três modos de autenticação de cluster: APIAPI_AND_CONFIG_MAP, CONFIG_MAP e. O modo determina como você concede à função de execução do Amazon MWAA acesso ao cluster:

Para verificar o modo atual do seu cluster:

aws eks describe-cluster --name mwaa-eks --region us-west-2 \ --query "cluster.accessConfig.authenticationMode"

Se você criar o cluster com o eksctl comando mostrado aqui, verifique o modo posteriormente. Se o modo estiverAPI, siga as etapas de entrada de acesso em vez das ConfigMap etapas.

Crie um namespace mwaa

Depois de confirmar que o cluster foi criado com sucesso, use o comando a seguir para criar um namespace para os pods.

kubectl create namespace mwaa

Crie uma função para o namespace mwaa

Depois de criar o namespace, crie um perfil e uma associação de perfil para um usuário do Amazon MWAA no EKS que possa executar pods em um namespace do MWAA. Se você usou um nome diferente para o namespace, substitua mwaa em -n mwaa pelo nome usado.

cat << EOF | kubectl apply -f - -n mwaa kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: mwaa-role rules: - apiGroups: - "" - "apps" - "batch" - "extensions" resources: - "jobs" - "pods" - "pods/attach" - "pods/exec" - "pods/log" - "pods/portforward" - "secrets" - "services" verbs: - "create" - "delete" - "describe" - "get" - "list" - "patch" - "update" --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: mwaa-role-binding subjects: - kind: User name: mwaa-service - kind: Group name: mwaa-service roleRef: kind: Role name: mwaa-role apiGroup: rbac.authorization.k8s.io EOF

Confirme se o novo perfil pode acessar o cluster do Amazon EKS ao executar o comando a seguir. Certifique-se de usar o nome correto se você não usoumwaa:

kubectl get pods -n mwaa --as mwaa-service

Você recebe uma mensagem de retorno dizendo:

No resources found in mwaa namespace.

Crie e anexe um perfil do IAM para o cluster do Amazon EKS

Você deve criar um perfil do IAM e depois vinculá-lo ao cluster Amazon EKS (k8s) para que ele possa ser usado para autenticação por meio do IAM. O perfil é usado somente para fazer login no cluster e não tem nenhuma permissão para o console ou as chamadas de API.

Autenticação e permissões

Essa função só é autenticada no cluster. No ConfigMap modo, as permissões reais no cluster vêm da Kubernetes função e. RoleBinding No modo API, as permissões vêm do escopo de acesso da entrada de acesso. Certifique-se de usar o mesmo nome de Kubernetes grupo no método de acesso RoleBinding e em qualquer método de acesso que você escolher.

Crie um novo perfil para o ambiente do Amazon MWAA usando as etapas em Perfil de execução do Amazon MWAA. No entanto, em vez de criar e anexar as políticas descritas neste tópico, anexe a seguinte política:

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "airflow:PublishMetrics", "Resource": "arn:aws:airflow:us-east-1:111122223333:environment/${MWAA_ENV_NAME}" }, { "Effect": "Deny", "Action": "s3:ListAllMyBuckets", "Resource": [ "arn:aws:s3:::{MWAA_S3_BUCKET}", "arn:aws:s3:::{MWAA_S3_BUCKET}/*" ] }, { "Effect": "Allow", "Action": [ "s3:GetObject*", "s3:GetBucket*", "s3:List*" ], "Resource": [ "arn:aws:s3:::{MWAA_S3_BUCKET}", "arn:aws:s3:::{MWAA_S3_BUCKET}/*" ] }, { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:CreateLogGroup", "logs:PutLogEvents", "logs:GetLogEvents", "logs:GetLogRecord", "logs:GetLogGroupFields", "logs:GetQueryResults", "logs:DescribeLogGroups" ], "Resource": [ "arn:aws:logs:us-east-1:111122223333:log-group:airflow-${MWAA_ENV_NAME}-*" ] }, { "Effect": "Allow", "Action": "cloudwatch:PutMetricData", "Resource": "*" }, { "Effect": "Allow", "Action": [ "sqs:ChangeMessageVisibility", "sqs:DeleteMessage", "sqs:GetQueueAttributes", "sqs:GetQueueUrl", "sqs:ReceiveMessage", "sqs:SendMessage" ], "Resource": "arn:aws:sqs:us-east-1:*:airflow-celery-*" }, { "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:DescribeKey", "kms:GenerateDataKey*", "kms:Encrypt" ], "NotResource": "arn:aws:kms:*:111122223333:key/*", "Condition": { "StringLike": { "kms:ViaService": [ "sqs.us-east-1.amazonaws.com" ] } } }, { "Effect": "Allow", "Action": [ "eks:DescribeCluster" ], "Resource": "arn:aws:eks:us-east-1:111122223333:cluster/${EKS_CLUSTER_NAME}" } ] }

Depois de criar o perfil, edite seu ambiente do Amazon MWAA para usar o perfil que você criou como o perfil de execução para o ambiente. Para alterar o perfil, edite o ambiente a ser usado. Você seleciona a função de execução em Permissões.

Problemas conhecidos:

  • Há um problema conhecido com ARNs de perfil com subcaminhos que não conseguem se autenticar com o Amazon EKS. A solução alternativa para isso é criar o perfil de serviço manualmente, em vez de usar o criado pelo próprio Amazon MWAA. Para saber mais, consulte Funções com caminhos não funcionam quando o caminho é incluído em seu ARN no aws-auth configmap

  • Se a lista de serviços do Amazon MWAA não estiver disponível no IAM, você precisará escolher uma política de serviço alternativa, como o Amazon EC2, e depois atualizar a política de confiança do perfil de acordo com o seguinte:

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "airflow-env.amazonaws.com", "airflow.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }

    Para saber mais, consulte Como usar políticas de confiança com perfis do IAM.

Crie o arquivo requirements.txt

Para usar o código de amostra nesta seção, certifique-se de ter adicionado uma das seguintes opções de banco de dados ao seu requirements.txt. Consulte para saber mais: Como instalar dependências do Python.

kubernetes apache-airflow-providers-cncf-kubernetes

Conceda à função de execução do Amazon MWAA acesso ao cluster

A forma como você concede à função de execução do Amazon MWAA acesso ao cluster depende do modo de autenticação do cluster (veja a nota emCriar um cluster.). Siga o caminho que corresponde ao seu cluster.

Opção A — Modo API: criar uma entrada de acesso EKS

Se seu cluster usa o modo de API_AND_CONFIG_MAP autenticação API ou, crie uma entrada de acesso para a função de execução do Amazon MWAA. Substitua Região da AWS o nome do cluster e o ARN da função pelos seus valores.

aws eks create-access-entry \ --region us-west-2 \ --cluster-name mwaa-eks \ --principal-arn arn:aws:iam::123456789012:role/mwaa-execution-role \ --kubernetes-groups mwaa-service \ --username mwaa-service

O mwaa-service grupo deve corresponder ao subjects grupo referenciado pelo RoleBinding que você criou emCrie uma função para o namespace mwaa. Isso vincula a função de execução às mwaa-role permissões no mwaa namespace.

Para confirmar que você criou a entrada de acesso:

aws eks list-access-entries --region us-west-2 --cluster-name mwaa-eks

Opção B — ConfigMap modo: criar um mapeamento de identidade

Se seu cluster usa o modo de API_AND_CONFIG_MAP autenticação CONFIG_MAP ou, crie um mapeamento de identidade. Isso grava uma entrada no cluster aws-auth ConfigMap. Essa etapa não tem efeito nos clusters que usam o modo de API autenticação.

eksctl create iamidentitymapping \ --region us-west-2 \ --cluster mwaa-eks \ --arn arn:aws:iam::123456789012:role/mwaa-execution-role \ --username mwaa-service \ --group mwaa-service

O --group mwaa-service valor deve corresponder ao assunto do Grupo no RoleBinding que você criou emCrie uma função para o namespace mwaa. Isso vincula a função de execução às mwaa-role permissões no mwaa namespace, de acordo com a entrada de acesso na Opção A.

Crie o kubeconfig

Use o comando a seguir para criar kubeconfig:

aws eks update-kubeconfig \ --region us-west-2 \ --kubeconfig ./kube_config.yaml \ --name mwaa-eks \ --alias aws

Se você usou um perfil específico ao executar update-kubeconfig, precisará remover a seção env: adicionada ao arquivo kube_config.yaml para que ela funcione corretamente com o Amazon MWAA. Para fazer isso, exclua do arquivo o seguinte e então salve-o:

env: - name: AWS_PROFILE value: profile_name

Criar um DAG

Use o exemplo de código a seguir para criar um arquivo Python, como mwaa_pod_example.py para o DAG.

""" Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ from airflow import DAG from datetime import datetime from airflow.providers.cncf.kubernetes.operators.kubernetes_pod import KubernetesPodOperator default_args = { 'owner': 'aws', 'depends_on_past': False, 'start_date': datetime(2019, 2, 20), 'provide_context': True } dag = DAG( 'kubernetes_pod_example', default_args=default_args, schedule_interval=None) #use a kube_config stored in s3 dags folder for now kube_config_path = '/usr/local/airflow/dags/kube_config.yaml' podRun = KubernetesPodOperator( namespace="mwaa", image="ubuntu:18.04", cmds=["bash"], arguments=["-c", "ls"], labels={"foo": "bar"}, name="mwaa-pod-test", task_id="pod-task", get_logs=True, dag=dag, is_delete_operator_pod=False, config_file=kube_config_path, in_cluster=False, cluster_context='aws' )

Adicione o DAG e o kube_config.yaml ao bucket do Amazon S3

Coloque o DAG criado e o arquivo kube_config.yaml no bucket do Amazon S3 para o ambiente Amazon MWAA. É possível colocar arquivos em seu bucket usando o console do Amazon S3 ou a AWS Command Line Interface.

Habilite e acione o exemplo

No Apache Airflow, habilite o exemplo e, em seguida, acione-o.

Depois de ser executado e concluído com sucesso, use o comando a seguir para verificar o pod:

kubectl get pods -n mwaa

Você terá um resultado semelhante ao seguinte:

NAME READY STATUS RESTARTS AGE mwaa-pod-test-aa11bb22cc3344445555666677778888 0/1 Completed 0 2m23s

Em seguida, é possível verificar a saída do pod com o comando a seguir. Substitua o valor do nome pelo valor retornado do comando anterior:

kubectl logs -n mwaa mwaa-pod-test-aa11bb22cc3344445555666677778888