为 Apache Airflow Web 服务器设置自定义域 - Amazon Managed Workflows for Apache Airflow

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

为 Apache Airflow Web 服务器设置自定义域

Apache Airflow 的亚马逊托管工作流程(亚马逊 MWAA)允许您为托管 Apache Airflow 网络服务器设置自定义域。使用自定义域,您可以使用 Apache Airflow 用户界面、Apache Airflow CLI 或 Apache Airflow Web 服务器访问环境的 Amazon MWAA 托管 Apache Airflow Web 服务器。

注意

您只能在无法访问互联网的私有 Web 服务器上使用自定义域。

亚马逊 MWAA 上自定义域名的使用案例
  1. 在云应用程序中共享 Web 服务器域 AWS — 使用自定义域可以定义用于访问 Web 服务器的用户友好型 URL,而不是生成的服务域名。您可以存储此自定义域,并将其作为环境变量共享到您的应用程序中。

  2. 访问私有 Web 服务器 — 如果您想为无法访问互联网的 VPC 中的 Web 服务器配置访问权限,则使用自定义域可以简化 URL 重定向工作流程。

配置自定义域名

要配置自定义域功能,您需要在创建或更新 Amazon MWAA 环境时通过 webserver.base_url Apache Airflow 配置提供自定义域值。以下限制适用于您的自定义域名:

  • 该值应为没有任何协议或路径的完全限定域名 (FQDN)。例如,your-custom-domain.com

  • 亚马逊 MWAA 不允许在 URL 中添加路径。例如,your-custom-domain.com/dags/不是有效的自定义域名。

  • 网址长度限制为 255 个 ASCII 字符。

  • 如果您提供空字符串,则默认情况下,将使用 Amazon MWAA 生成的网络服务器 URL 创建环境。

以下示例说明 AWS CLI 如何使用创建带有自定义 Web 服务器域名的环境。

$ aws mwaa create-environment \ --name my-mwaa-env \ --source-bucket-arn arn:aws:s3:::my-bucket \ --airflow-configuration-options '{"webserver.base_url":"my-custom-domain.com"}' \ --network-configuration '{"SubnetIds":["subnet-0123456789abcdef","subnet-fedcba9876543210"]}' \ --execution-role-arn arn:aws:iam::123456789012:role/my-execution-role

创建或更新环境后,您需要在 AWS 账户中设置网络基础架构,以便通过自定义域访问私有 Web 服务器。

要恢复到默认的服务生成的网址,请更新您的私有环境并删除webserver.base_url配置选项。

设置网络基础架构

使用以下步骤设置所需的网络基础架构,以便与您的 AWS 账户中的自定义域一起使用。

  1. 获取亚马逊 VPC 终端节点网络接口 (ENI) 的 IP 地址。为此,请先使用get-environment查找WebserverVpcEndpointService适合您环境的。

    $ aws mwaa get-environment --name your-environment-name

    如果成功,您将看到类似于以下内容的输出。

    {
        "Environment": {
            "AirflowConfigurationOptions": {},
            "AirflowVersion": "latest-version",
            "Arn": "environment-arn",
            "CreatedAt": "2024-06-01T01:00:00-00:00",
            "DagS3Path": "dags",
            .
            .
            .
            "WebserverVpcEndpointService": "web-server-vpc-endpoint-service",
            "WeeklyMaintenanceWindowStart": "TUE:21:30"
        }
    }

    记下该WebserverVpcEndpointService值并将其用于以下 Amazon EC2 describe-vpc-endpoints 命令web-server-vpc-endpoint-service中。 --filters Name=service-name,Values=web-server-vpc-endpoint-service-id在以下命令中。

  2. 检索 Amazon VPC 终端节点详细信息。此命令获取与特定服务名称匹配的 Amazon VPC 终端节点的详细信息,并以文本格式返回终端节点 ID 和关联的网络接口 ID。

    $ aws ec2 describe-vpc-endpoints \ --filters Name=service-name,Values=web-server-vpc-endpoint-service \ --query 'VpcEndpoints[*].{EndpointId:VpcEndpointId,NetworkInterfaceIds:NetworkInterfaceIds}' \ --output text
  3. 获取网络接口的详细信息。此命令检索与上一步中确定的 Amazon VPC 终端节点关联的每个网络接口的私有 IP 地址。

    $ for eni_id in $( aws ec2 describe-vpc-endpoints \ --filters Name=service-name,Values=service-id \ --query 'VpcEndpoints[*].NetworkInterfaceIds' \ --output text ); do aws ec2 describe-network-interfaces \ --network-interface-ids $eni_id \ --query 'NetworkInterfaces[*].PrivateIpAddresses[*].PrivateIpAddress' \ --output text done
  4. create-target-group用于创建新的目标组。您将使用此目标组为您的 Web 服务器 Amazon VPC 终端节点注册 IP 地址。

    $ aws elbv2 create-target-group \ --name new-target-group-namne \ --protocol HTTPS \ --port 443 \ --vpc-id web-server-vpc-id \ --target-type ip \ --health-check-protocol HTTPS \ --health-check-port 443 \ --health-check-path / \ --health-check-enabled \ --matcher 'HttpCode="200,302"'

    使用register-targets命令注册 IP 地址。

    $ aws elbv2 register-targets \ --target-group-arn target-group-arn \ --targets Id=ip-address-1 Id=ip-address-2
  5. 申请 ACM 证书。如果您使用的是现有证书,请跳过此步骤。

    $ aws acm request-certificate \ --domain-name my-custom-domain.com \ --validation-method DNS
  6. 配置 Application Load Balancer。首先,创建负载均衡器,然后为该负载均衡器创建侦听器。指定您在上一步中创建的 ACM 证书。

    $ aws elbv2 create-load-balancer \ --name my-mwaa-lb \ --type application \ --subnets subnet-id-1 subnet-id-2
    $ aws elbv2 create-listener \ --load-balancer-arn load-balancer-arn \ --protocol HTTPS \ --port 443 \ --ssl-policy ELBSecurityPolicy-2016-08 \ --certificates CertificateArn=acm-certificate-arn \ --default-actions Type=forward,TargetGroupArn=target-group-arn

    如果您在私有子网中使用 Network Load Balancer,请设置堡垒主机AWS VPN 隧道来访问 Web 服务器。

  7. 使用 Route 53 为该域创建托管区域。

    $ aws route53 create-hosted-zone --name my-custom-domain.com \ --caller-reference 1

    为该域创建 A 记录。要使用执行此操作 AWS CLI,请使用获取托管区域 IDlist-hosted-zones-by-name,然后使用应用记录change-resource-record-sets

    $ HOSTED_ZONE_ID=$(aws route53 list-hosted-zones-by-name \ --dns-name my-custom-domain.com \ --query 'HostedZones[0].Id' --output text)
    $ aws route53 change-resource-record-sets \ --hosted-zone-id $HOSTED_ZONE_ID \ --change-batch '{ "Changes": [ { "Action": "CREATE", "ResourceRecordSet": { "Name": "my-custom-domain.com", "Type": "A", "AliasTarget": { "HostedZoneId": "load-balancer-hosted-zone-id>", "DNSName": "load-balancer-dns-name", "EvaluateTargetHealth": true } } } ] }'
  8. 更新 Web 服务器 Amazon VPC 终端节点的安全组规则,使其遵循最低权限原则,仅允许来自应用程序负载均衡器所在的公有子网的 HTTPS 流量。将以下 JSON 保存在本地。例如,如sg-ingress-ip-permissions.json

    { "IpProtocol": "tcp", "FromPort": 443, "ToPort": 443, "UserIdGroupPairs": [ { "GroupId": "load-balancer-security-group-id" } ], "IpRanges": [ { "CidrIp": "public-subnet-1-cidr" }, { "CidrIp": "public-subnet-2-cidr" } ] }

    运行以下 Amazon EC2 命令来更新您的入口安全组规则。为指定 JSON 文件--ip-permissions

    $ aws ec2 authorize-security-group-ingress \ --group-id <security-group-id> \ --ip-permissions file://sg-ingress-ip-permissions.json

    运行以下 Amazon EC2 命令来更新您的出口规则。

    $ aws ec2 authorize-security-group-egress \ --group-id webserver-vpc-endpoint-security-group-id \ --protocol tcp \ --port 443 \ --source-group load-balancer-security-group-id

打开亚马逊 MWAA 控制台并导航到 Apache Airflow 用户界面。如果您要在私有子网中设置网络负载均衡器,而不是此处使用的应用程序负载均衡器,则必须使用以下选项之一访问 Web 服务器。