Apache Airflow 웹 서버에 대한 사용자 지정 도메인 설정 - Amazon Managed Workflows for Apache Airflow

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Apache Airflow 웹 서버에 대한 사용자 지정 도메인 설정

Amazon Managed Workflows for Apache Airflow(Amazon MWAA)를 사용하면 관리형 Apache Airflow 웹 서버에 대한 사용자 지정 도메인을 설정할 수 있습니다. 사용자 지정 도메인을 사용하면 Apache Airflow UI, Apache Airflow CLI 또는 Apache Airflow 웹 서버를 사용하여 환경의 Amazon MWAA 관리형 Apache Airflow 웹 서버에 액세스할 수 있습니다.

참고

인터넷 액세스 없이 프라이빗 웹 서버에서만 사용자 지정 도메인을 사용할 수 있습니다.

Amazon MWAA의 사용자 지정 도메인 사용 사례
  1. AWS에서 클라우드 애플리케이션 간에 웹 서버 도메인 공유 - 사용자 지정 도메인을 사용하면 생성된 서비스 도메인 이름 대신 웹 서버에 액세스할 수 있는 사용자 친화적 URL을 정의할 수 있습니다. 이 사용자 지정 도메인을 저장하고 애플리케이션에서 환경 변수로 공유할 수 있습니다.

  2. 프라이빗 웹 서버 액세스 - 인터넷 액세스 없이 VPC의 웹 서버에 대한 액세스를 구성하려는 경우 사용자 지정 도메인을 사용하면 URL 리디렉션 워크플로가 간소화됩니다.

사용자 지정 도메인 구성

사용자 지정 도메인 기능을 구성하려면 Amazon MWAA 환경을 생성하거나 업데이트할 때 webserver.base_url Apache Airflow 구성을 통해 사용자 지정 도메인 값을 제공해야 합니다. 사용자 지정 도메인 이름에는 다음 제약 조건이 적용됩니다.

  • 값은 프로토콜 또는 경로가 없는 정규화된 도메인 이름(FQDN)이어야 합니다. 예: your-custom-domain.com.

  • Amazon MWAA는 URL의 경로를 허용하지 않습니다. 예를 들어 your-custom-domain.com/dags/는 유효한 사용자 지정 도메인 이름이 아닙니다.

  • URL 길이는 ASCII 문자 255자로 제한됩니다.

  • 빈 문자열을 제공하는 경우 기본적으로 환경은 Amazon MWAA에서 생성된 웹 서버 URL로 생성됩니다.

다음 예제에서는 AWS CLI를 사용하여 사용자 지정 웹 서버 도메인 이름으로 환경을 생성하는 방법을 보여줍니다.

$ 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 계정에 네트워킹 인프라를 설정해야 합니다.

기본 서비스 생성 URL로 되돌리려면 프라이빗 환경을 업데이트하고 webserver.base_url 구성 옵션을 제거합니다.

네트워킹 인프라 설정

다음 단계에 따라 AWS 계정의 사용자 지정 도메인과 함께 사용하는 데 필요한 네트워킹 인프라를 설정합니다.

  1. Amazon 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을 사용하여 새로운 대상 그룹을 생성합니다. 이 대상 그룹을 사용하여 웹 서버 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를 사용하는 경우 웹 서버에 액세스하도록 Bastion 호스트 또는 AWS VPN 터널을 설정합니다.

  7. 도메인에 대한 Route 53를 사용하여 호스팅 영역을 생성합니다.

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

    도메인에 대한 A 레코드를 생성합니다. AWS CLI를 사용하여 이렇게 하려면 list-hosted-zones-by-name을 사용하여 호스팅 영역 ID를 가져온 다음, 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 트래픽만 허용함으로써 웹 서버 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 명령을 실행하여 수신 보안 그룹 규칙을 업데이트합니다. --ip-permissions에 대한 JSON 파일을 지정합니다.

    $ 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 Airflow UI로 이동합니다. 여기에 사용되는 Application Load Balancer 대신 프라이빗 서브넷에서 Network Load Balancer를 설정하는 경우 다음 옵션 중 하나를 사용하여 웹 서버에 액세스해야 합니다.