為 Apache 氣流網頁伺服器設定自訂網域 - Amazon Managed Workflows for Apache Airflow

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

為 Apache 氣流網頁伺服器設定自訂網域

適用於 Apache 氣流的 Amazon 受管工作流程 (Amazon MWAA) 可讓您為受管 Apache 氣流網路伺服器設定自訂網域。使用自訂網域,您可以使用 Apache 氣流使用者介面、Apache 氣流 CLI 或 Apache 氣流網頁伺服器,存取環境的 Amazon MWAA 管理 Apache 氣流網頁伺服器。

注意

您只能在沒有網際網路存取權限的私人網頁伺服器上使用自訂網域。

Amazon MWAA 上的自定義域的使用案例
  1. 在雲端應用程式之間共用 Web 伺服器網域 AWS — 使用自訂網域可讓您定義易於使用的 URL 來存取 Web 伺服器,而不是產生的服務網域名稱。您可以儲存此自訂網域,並在應用程式中以環境變數的形式共用它。

  2. 存取私人 Web 伺服器 — 如果您想要在沒有網際網路存取的 VPC 中設定 Web 伺服器的存取權,使用自訂網域可簡化 URL 重新導向工作流程。

設定自訂網域

若要設定自訂網域功能,您必須在建立或更新 Amazon MWAA 環境時,透過 webserver.base_url Apache 氣流組態提供自訂網域值。下列限制適用於您的自訂網域名稱:

  • 此值應為不含任何通訊協定或路徑的完整網域名稱 (FQDN)。例如 your-custom-domain.com

  • Amazon MWAA 不允許在網址中使用路徑。例如,不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 伺服器。

若要還原為預設服務產生的 URL,請更新您的私有環境並移除webserver.base_url組態選項。

設定網路基礎架構

請遵循下列步驟來設定必要的網路基礎結構,以便與 AWS 帳戶中的自訂網域搭配使用。

  1. 取得 Amazon 虛擬私人雲端端點網路界面 (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值,並在下面web-server-vpc-endpoint-service的 Amazon EC2 describe-vpc-endpoints 命令中使用它。 --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於建立新的目標群組。您將使用此目標群組為您的網頁伺服器 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,請使用取得託管區域 ID,list-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. 透過僅允許來自 Application Load Balancer 器所在之公有子網路的 HTTPS 流量,更新 Web 伺服器 Amazon VPC 端點的安全群組規則,以遵循最低權限原則。在本機儲存下列 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

開啟 Amazon MWAA 主控台並導覽至 Apache 氣流使用者介面。如果您要在私有子網路中設定 Network Load Balancer,而非此處使用的應用程式負載平衡器,則必須使用下列其中一個選項來存取 Web 伺服器。