

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

# Apache Airflow 웹 서버에 대한 사용자 지정 도메인 설정
<a name="configuring-custom-domain"></a>

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을 정의할 수 있습니다. 이 사용자 지정 도메인을 저장하고 애플리케이션에서 환경 변수로 공유할 수 있습니다.

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

**Topics**
+ [사용자 지정 도메인 구성](#create-environment-with-custom-domain)
+ [네트워킹 인프라 설정](#set-up-networking-for-custom-domain)

## 사용자 지정 도메인 구성
<a name="create-environment-with-custom-domain"></a>

사용자 지정 도메인 기능을 구성하려면 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:::amzn-s3-demo-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` 구성 옵션을 제거합니다.

## 네트워킹 인프라 설정
<a name="set-up-networking-for-custom-domain"></a>

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

1. Amazon VPC 엔드포인트 네트워크 인터페이스(ENI)의 IP 주소를 가져옵니다. 이렇게 하려면 먼저 [https://awscli.amazonaws.com/v2/documentation/api/2.9.6/reference/mwaa/get-environment.html](https://awscli.amazonaws.com/v2/documentation/api/2.9.6/reference/mwaa/get-environment.html)를 사용하여 환경의 `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`입니다.

1. 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
   ```

1. 네트워크 인터페이스 세부 정보를 가져옵니다. 이 명령은 이전 단계에서 식별된 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
   ```

1. `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
   ```

1. ACM; 인증서를 요청합니다. 기존 인증서를 사용하는 경우 이 단계를 건너뜁니다.

   ```
   aws acm request-certificate \
   --domain-name my-custom-domain.com \
   --validation-method DNS
   ```

1. 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 호스트](tutorials-private-network-bastion.md) 또는 [Site-to-Site VPN 터널](tutorials-private-network-vpn-client.md)을 설정합니다.

1. 도메인에 대한 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
           }
         }
       }
     ]
   }'
   ```

1. 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를 설정하는 경우 다음 옵션 중 하나를 사용하여 웹 서버에 액세스해야 합니다.
+ [튜토리얼: Linux Bastion Host를 사용한 프라이빗 네트워크 액세스 구성](tutorials-private-network-bastion.md)
+ [튜토리얼: AWS Client VPN을(를) 사용한 프라이빗 네트워크 액세스 구성](tutorials-private-network-vpn-client.md)