

# API Gateway의 프라이빗 API에 대한 사용자 지정 도메인 이름
<a name="apigateway-private-custom-domains"></a>

프라이빗 API에 대한 사용자 지정 도메인 이름을 생성할 수 있습니다. 프라이빗 사용자 지정 도메인 이름을 사용하여 API 호출자에게 더 간단하고 직관적인 URL을 제공합니다. 프라이빗 사용자 지정 도메인 이름을 사용하면 복잡성을 줄이고, TLS 핸드셰이크 중에 보안 조치를 구성하고, AWS Certificate Manager(ACM)를 사용하여 도메인 이름의 인증서 수명 주기를 제어할 수 있습니다. 자세한 내용은 [사용자 지정 도메인 이름에 대한 인증서의 프라이빗 키 보호](#apigateway-private-custom-domains-secure-certificate-private-key) 섹션을 참조하세요.

프라이빗 API의 사용자 지정 도메인 이름은 여러 계정에서 고유할 필요가 없습니다. ACM 인증서가 도메인 이름을 포함하는 한 계정 111122223333 및 계정 555555555555에서 `example.private.com`을 생성할 수 있습니다. 프라이빗 사용자 지정 도메인 이름을 식별하려면 프라이빗 사용자 지정 도메인 이름 ARN을 사용합니다. 이 식별자는 프라이빗 사용자 지정 도메인 이름에 고유합니다.

API Gateway에서 프라이빗 사용자 지정 도메인 이름을 생성하면 *API 공급자*가 됩니다. API Gateway 또는 AWS Resource Access Manager(AWS RAM)를 사용하여 다른 AWS 계정에 프라이빗 사용자 지정 도메인 이름을 제공할 수 있습니다.

프라이빗 사용자 지정 도메인 이름을 간접적으로 호출하면 *API 소비자*가 됩니다. 자체 AWS 계정 또는 다른 AWS 계정에서 프라이빗 사용자 지정 도메인 이름을 사용할 수 있습니다.

프라이빗 사용자 지정 도메인 이름을 사용하는 경우 VPC 엔드포인트와 프라이빗 사용자 지정 도메인 이름 간에 도메인 이름 액세스 연결을 생성합니다. 도메인 이름 액세스 연결을 사용하면 API 소비자는 퍼블릭 인터넷에서 격리된 상태에서 프라이빗 사용자 지정 도메인 이름을 간접적으로 호출할 수 있습니다. 자세한 내용은 [프라이빗 API의 사용자 지정 도메인 이름에 대한 API 공급자 및 API 소비자 작업](apigateway-private-custom-domains-associations.md) 섹션을 참조하세요.

## 사용자 지정 도메인 이름에 대한 인증서의 프라이빗 키 보호
<a name="apigateway-private-custom-domains-secure-certificate-private-key"></a>

ACM을 사용하여 SSL/TLS 인증서를 요청하여 프라이빗 API에 대한 사용자 지정 도메인 이름을 생성하면 ACM은 퍼블릭/프라이빗 키 페어를 생성합니다. 인증서를 가져오면 키 페어를 생성합니다. 퍼블릭 키는 인증서의 일부가 됩니다. 프라이빗 키를 안전하게 저장하기 위해 ACM은 별칭 **aws/acm**과 함께 KMS 키인 AWS KMS를 사용하여 또 다른 키를 생성합니다. AWS KMS는 이 키를 사용하여 인증서의 프라이빗 키를 암호화합니다. 자세한 내용은 *AWS Certificate Manager 사용 설명서*에서 [AWS Certificate Manager의 데이터 보호](https://docs.aws.amazon.com/acm/latest/userguide/data-protection.html)를 참조하세요.

API Gateway는 AWS 서비스만 액세스할 수 있는 서비스인 AWS TLS Connection Manager를 통해 인증서의 프라이빗 키를 보호하고 사용합니다. ACM 인증서를 사용하여 API Gateway 사용자 지정 도메인 이름을 생성하면 API Gateway가 인증서를 AWS TLS Connection Manager와 연결합니다. 이를 위해 AWS 관리형 키와 비교하여 AWS KMS에 권한 부여를 생성합니다. 이 권한 부여를 통해 TLS 연결 관리자는 AWS KMS를 사용하여 인증서의 프라이빗 키를 해독할 수 있습니다. TLS Connection Manager는 인증서와 해독된(일반 텍스트) 프라이빗 키를 사용하여 API Gateway 서비스의 클라이언트와 보안 연결(SSL/TLS 세션)을 설정합니다. 인증서가 API Gateway 서비스에서 연결 해제되면 권한 부여가 사용 중지됩니다. 자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [권한 부여](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)를 참조하세요.

자세한 내용은 [Amazon API Gateway에서 저장된 데이터 암호화](data-protection-encryption.md#data-protection-at-rest) 섹션을 참조하세요.

## 프라이빗 사용자 지정 도메인 이름에 대한 고려 사항
<a name="apigateway-private-custom-domains-considerations"></a>

다음 고려 사항은 프라이빗 사용자 지정 도메인 이름 사용에 영향을 미칠 수 있습니다.
+ API Gateway가 프라이빗 사용자 지정 도메인 이름을 프로비저닝하는 데 약 15분이 걸립니다.
+ ACM 인증서를 업데이트하는 경우 API Gateway가 업데이트를 완료하는 데 약 15분이 걸립니다. 이 시간 동안 도메인 이름은 `UPDATING` 상태에 있으며 여전히 액세스할 수 있습니다.
+ 프라이빗 사용자 지정 도메인 이름을 간접적으로 호출하려면 도메인 이름 액세스 연결을 생성해야 합니다. 도메인 이름 액세스 연결을 생성한 후 준비하는 데 약 15분이 걸립니다.
+ 프라이빗 사용자 지정 도메인 이름 ARN에는 *account-id* 및 *domain-name-id*가 포함됩니다. 도메인 이름을 생성할 때 API Gateway는 `arn:partition:apigateway:region::/domainnames/domain-name`의 ARN 형식을 사용합니다. 프라이빗 사용자 지정 도메인 이름에 액세스할 때는의 `arn:partition:apigateway:region:account-id:/domainnames/domain-name+domain-name-id`의 ARN 형식을 사용합니다.

  프라이빗 도메인 이름을 만든 후 액세스를 허용하도록 IAM 권한을 수정해야 할 수 있습니다.
+ 동일한 VPC 엔드포인트에서 동일한 이름의 프라이빗 사용자 지정 도메인 이름을 간접적으로 호출할 수 없습니다. 예를 들어 `arn:aws:apigateway:us-west-2:111122223333:/domainnames/private.example.com+abcd1234` 및 `arn:aws:apigateway:us-west-2:111122223333:/domainnames/private.example.com+xyz000`를 간접적으로 호출하려면 각 프라이빗 사용자 지정 도메인 이름을 다른 VPC 엔드포인트와 연결합니다.
+ `*.private.example.com`용 인증서와 같은 와일드카드 인증서가 지원됩니다.
+ 와일드카드 사용자 지정 도메인 이름은 지원되지 않습니다.
+ 2048비트 키 길이의 RSA 인증서와 256비트 및 384비트 키 길이의 ECDSA 인증서만 지원됩니다.
+ IPv4 주소만 프라이빗 API를 간접적으로 호출하도록 프라이빗 API의 IP 주소 유형을 설정할 수 없습니다. 듀얼 스택만 지원됩니다. 자세한 내용은 [API Gateway의 REST API에 대한 IP 주소 유형](api-gateway-ip-address-type.md) 섹션을 참조하세요.
+ 프라이빗 API를 사용하여 트래픽을 전송하기 위해 Amazon VPC에서 지원하는 모든 IP 주소 유형을 사용할 수 있습니다. VPC 엔드포인트에서 설정을 구성하여 듀얼 스택 및 IPv6 트래픽을 전송할 수 있습니다. API Gateway를 사용하여 이를 수정할 수 없습니다. 자세한 내용은 [VPC에 대한 IPv6 지원 추가](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-migrate-ipv6-add.html)를 참조하세요.
+ 프라이빗 API를 `/developers/feature`에 매핑하는 것과 같은 다중 수준 기본 경로 매핑은 지원되지 않지만 라우팅 규칙을 사용하여 다중 수준 경로 조건을 생성할 수 있습니다. 자세한 내용은 [API Gateway에서 사용자 지정 도메인 이름을 통해 API로 트래픽을 전송합니다.](rest-api-routing-mode.md) 섹션을 참조하세요.
+ 프라이빗 사용자 지정 도메인 이름에 대해 최소 TLS 버전을 설정할 수 없습니다. 모든 프라이빗 사용자 지정 도메인 이름의 보안 정책은 `TLS-1-2`입니다.
+ VPC 엔드포인트 정책을 사용하여 프라이빗 사용자 지정 도메인 이름에 대한 액세스를 제어할 수 있습니다. 자세한 내용은 [API Gateway의 프라이빗 API에 대한 VPC 종단점 정책 사용](apigateway-vpc-endpoint-policies.md)의 예제 4 및 5를 참조하세요.
+ 프라이빗 API와 프라이빗 사용자 지정 도메인 이름에 대해 별도의 리소스 정책을 생성해야 합니다. 프라이빗 사용자 지정 도메인 이름을 간접적으로 호출하려면 API 소비자가 프라이빗 사용자 지정 도메인 이름 리소스 정책, 프라이빗 API 리소스 정책 및 프라이빗 API에 대한 VPC 엔드포인트 정책 또는 권한 부여에서 액세스해야 합니다.

## 다른 API Gateway 리소스와 함께 프라이빗 사용자 지정 도메인 이름을 사용하기 위한 고려 사항
<a name="apigateway-private-custom-domains-considerations-for-migration"></a>

다음 고려 사항은 다른 API Gateway 리소스와 함께 프라이빗 사용자 지정 도메인 이름을 사용하는 방법에 영향을 미칠 수 있습니다.
+ 프라이빗 사용자 지정 도메인 이름에서 퍼블릭 API로 트래픽을 전송할 수 없습니다.
+ 프라이빗 API가 프라이빗 사용자 지정 도메인 이름에 매핑되면 API의 엔드포인트 유형을 변경할 수 없습니다.
+ 퍼블릭 사용자 지정 도메인 이름은 프라이빗 사용자 지정 도메인 이름으로 마이그레이션할 수 없습니다.
+ 퍼블릭 사용자 지정 도메인 이름에 액세스하는 데 사용하는 VPC 엔드포인트가 있는 경우 이를 사용하여 프라이빗 사용자 지정 도메인 이름과 도메인 이름 액세스 연결을 생성하지 마십시오.

## 프라이빗 사용자 지정 도메인 이름과 퍼블릭 사용자 지정 도메인 이름의 차이점
<a name="apigateway-private-custom-domains-public-differences"></a>

다음은 프라이빗 및 퍼블릭 사용자 지정 도메인 이름의 차이점을 설명합니다.
+ 프라이빗 사용자 지정 도메인 이름은 여러 계정에서 고유할 필요가 없습니다.
+ 프라이빗 도메인 이름에는 도메인 이름 ID가 있습니다. 이 ID는 프라이빗 사용자 지정 도메인 이름을 고유하게 식별하며 퍼블릭 사용자 지정 도메인 이름에 대해 생성되지 않습니다.
+ AWS CLI를 사용하여 프라이빗 사용자 지정 도메인 이름을 업데이트하거나 삭제할 때는 도메인 이름 ID를 제공해야 합니다. `example.com`이라는 프라이빗 사용자 지정 도메인 이름과 `example.com`이라는 퍼블릭 사용자 지정 도메인 이름이 있고 도메인 이름 ID를 제공하지 않는 경우 API Gateway는 퍼블릭 사용자 지정 도메인 이름을 수정하거나 삭제합니다.

## 프라이빗 API의 사용자 지정 도메인 이름에 대한 다음 단계
<a name="apigateway-private-custom-domains-next-steps"></a>

API 공급자 및 API 소비자의 작업에 대한 자세한 내용은 [프라이빗 API의 사용자 지정 도메인 이름에 대한 API 공급자 및 API 소비자 작업](apigateway-private-custom-domains-associations.md) 섹션을 참조하세요.

자체 AWS 계정에서 간접적으로 호출할 수 있는 프라이빗 사용자 지정 도메인 이름을 생성하는 방법에 대한 지침은 [자습서: 프라이빗 API에 대한 사용자 지정 도메인 이름 생성 및 간접적 호출](apigateway-private-custom-domains-tutorial.md) 섹션을 참조하세요.

프라이빗 사용자 지정 도메인 이름에 대한 다른 AWS 계정 액세스 권한을 제공하는 방법에 대한 지침은 [API 공급자: AWS RAM을 사용하여 프라이빗 사용자 지정 도메인 이름 공유](apigateway-private-custom-domains-provider-share.md) 섹션을 참조하세요. VPC 엔드포인트를 다른 AWS 계정의 프라이빗 사용자 지정 도메인 이름과 연결하는 방법에 대한 지침은 [API 소비자: VPC 엔드포인트를 공유된 프라이빗 사용자 지정 도메인 이름과 연결](apigateway-private-custom-domains-consumer-create.md) 섹션을 참조하세요.

# 프라이빗 API의 사용자 지정 도메인 이름에 대한 API 공급자 및 API 소비자 작업
<a name="apigateway-private-custom-domains-associations"></a>

프라이빗 사용자 지정 도메인 이름을 생성하면 *API 공급자*가 됩니다. 프라이빗 사용자 지정 도메인 이름을 간접적으로 호출하면 *API 소비자*가 됩니다. 자체 AWS 계정 또는 다른 AWS 계정에서 프라이빗 사용자 지정 도메인 이름을 사용할 수 있습니다.

다음 섹션에서는 API 공급자와 API 소비자가 프라이빗 사용자 지정 도메인 이름을 사용하는 데 필요한 작업을 설명합니다. 자체 AWS 계정에서 프라이빗 사용자 지정 도메인 이름을 간접적으로 호출하려는 경우 사용자는 API 공급자이자 API 소비자입니다. 다른 AWS 계정에서 프라이빗 사용자 지정 도메인을 간접적으로 호출하려는 경우 AWS Organizations에서 API 공급자와의 API 소비자 간의 신뢰 관계에 따라 AWS RAM이 일부 작업을 대신 완료할 수 있습니다.

## API 공급자의 작업
<a name="apigateway-private-custom-domains-associations-provider"></a>

API 공급자는 프라이빗 API를 생성하고 이를 사용자 지정 도메인 이름에 매핑합니다.

 API 공급자는 두 개의 리소스 정책을 관리하여 프라이빗 사용자 지정 도메인 이름을 보호합니다. 첫 번째 정책은 `execute-api` 서비스에 대한 것이며 어떤 VPC 엔드포인트가 프라이빗 사용자 지정 도메인 이름을 간접적으로 호출할 수 있는지 제어합니다. 프라이빗 사용자 지정 도메인 이름 구성에서는 이를 `policy`라고 합니다.

두 번째 정책은 Amazon API Gateway Management 서비스에 대한 것이며 다른 AWS 계정의 어떤 VPC 엔드포인트가 프라이빗 사용자 지정 도메인 이름과 도메인 이름 액세스 연결을 구성할 수 있는지 제어합니다. VPC 엔드포인트는 간접적으로 호출하려면 프라이빗 사용자 지정 도메인 이름과 도메인 이름 액세스 연결을 구성해야 합니다. 프라이빗 사용자 지정 도메인 이름 구성에서는 `managementPolicy`입니다. AWS RAM 또는 API Gateway를 사용하여 이 정책을 업데이트할 수 있습니다. 다른 AWS 계정의 VPC 엔드포인트가 사용자 지정 도메인 이름을 간접적으로 호출하도록 허용할 계획이 없는 경우 `managementPolicy`를 편집하지 않습니다.

API 공급자인 경우 다음을 수행해야 합니다.

1. 프라이빗 API를 생성합니다.

1. 프라이빗 API의 `policy`를 업데이트하여 VPC 엔드포인트에 프라이빗 API에 대한 액세스 권한을 부여합니다.

1. 프라이빗 사용자 지정 도메인 이름을 생성하십시오.

1. 프라이빗 사용자 지정 도메인 이름의 `policy`를 업데이트하여 VPC 엔드포인트에 프라이빗 사용자 지정 도메인 이름에 대한 액세스 권한을 부여합니다.

1. 프라이빗 API에서 프라이빗 사용자 지정 도메인 이름으로 트래픽을 전송하는 기본 경로 매핑 또는 라우팅 규칙을 만듭니다. 자세한 내용은 [API Gateway에서 사용자 지정 도메인 이름을 통해 API로 트래픽을 전송합니다.](rest-api-routing-mode.md) 섹션을 참조하세요.

다른 AWS 계정의 API 소비자가 프라이빗 사용자 지정 도메인 이름에 액세스하도록 허용하려면 다음을 수행합니다.

1. 다른 계정의 API 소비자가 VPC 엔드포인트를 프라이빗 사용자 지정 도메인 이름과 연결할 수 있도록 프라이빗 사용자 지정 도메인 이름의 `managementPolicy`를 업데이트합니다. 다음과 같은 메서드를 사용하여 이를 수행할 수 있습니다.  
**AWS RAM**  
AWS RAM을 사용하면 API 공급자와 API 소비자가 AWS Organizations를 사용하는 동일한 조직에 있는 경우 공급자와 소비자 간의 리소스 공유가 자동으로 수락됩니다. 그렇지 않으면 API 소비자가 리소스 공유를 수락할 때까지 기다려야 합니다. **AWS RAM을 사용하여 프라이빗 사용자 지정 도메인 이름을 공유하는 것이 좋습니다.**  
**API Gateway**  
API Gateway에서는 AWS CLI만 지원됩니다. 패치 작업을 사용하여 프라이빗 사용자 지정 도메인 이름을 업데이트하고 `managementPolicy`에 대한 자체 정책 문서를 제공해야 합니다.

1. API 소비자의 VPC 엔드포인트에 대한 액세스 권한을 부여하도록 프라이빗 사용자 지정 도메인 이름의 `policy`와 여기에 매핑된 모든 프라이빗 API를 업데이트합니다.

API를 다른 AWS 계정에 제공하는 방법에 대한 지침은 [API 공급자: AWS RAM을 사용하여 프라이빗 사용자 지정 도메인 이름 공유](apigateway-private-custom-domains-provider-share.md) 섹션을 참조하세요.

## API 소비자의 작업
<a name="apigateway-private-custom-domains-associations-consumer"></a>

API 소비자는 VPC 엔드포인트를 도메인 이름 ARN과 연결하여 프라이빗 사용자 지정 도메인 이름을 간접적으로 호출합니다. API 소비자는 API Gateway API를 생성할 필요가 없습니다.

API 소비자인 경우 다음을 수행합니다.

1. Amazon VPC에서 프라이빗 DNS가 활성화된 VPC 엔드포인트를 생성합니다.

1. (선택 사항 - AWS RAM이 사용되는 경우) 리소스 공유 후 **12시간** 이내에 AWS RAM에서 프라이빗 사용자 지정 도메인 리소스 공유를 수락합니다. 사용자와 API 공급자가 동일한 조직에 있는 경우 리소스 공유가 자동으로 수락됩니다.

1. 프라이빗 사용자 지정 도메인 이름 ARN을 가져옵니다. 프라이빗 사용자 지정 도메인 이름 URL은 고유하지 않으므로 프라이빗 사용자 지정 도메인 이름 ARN을 사용하여 VPC 엔드포인트와 프라이빗 사용자 지정 도메인 이름 간에 도메인 이름 액세스 연결을 구성합니다. AWS RAM을 사용하여 프라이빗 사용자 지정 도메인 이름 ARN을 검색할 수 있습니다.

1. 프라이빗 사용자 지정 도메인 ARN을 API Gateway의 VPC 엔드포인트와 연결합니다. 이렇게 하면 VPC 엔드포인트와 프라이빗 사용자 지정 도메인 이름 간에 보안 연결이 생성됩니다. 트래픽은 Amazon 네트워크를 벗어나지 않습니다.

1. API 공급자가 VPC 엔드포인트에게 프라이빗 사용자 지정 도메인 이름과 프라이빗 사용자 지정 도메인 이름에 매핑된 모든 프라이빗 API에 대한 액세스 권한을 부여할 때까지 기다립니다. API 공급자이자 API 소비자라면 자체 VPC 엔드포인트에게 간접적 호출 액세스 권한을 부여합니다.

1. Route 53 프라이빗 호스팅 영역과 Route 53 레코드를 생성하여 Route 53에서 프라이빗 사용자 지정 도메인 이름을 확인합니다.

다른 AWS 계정에서 API를 사용하는 방법에 대한 지침은 [API 소비자: VPC 엔드포인트를 공유된 프라이빗 사용자 지정 도메인 이름과 연결](apigateway-private-custom-domains-consumer-create.md) 섹션을 참조하세요.

# 자습서: 프라이빗 API에 대한 사용자 지정 도메인 이름 생성 및 간접적 호출
<a name="apigateway-private-custom-domains-tutorial"></a>

이 자습서에서는 사용자 계정의 VPC에서 간접적으로 호출할 수 있는 프라이빗 사용자 지정 도메인 이름을 생성합니다. 이를 위해 사용자는 API 공급자이자 API 소비자입니다. 이 자습서를 완료하려면 기존 프라이빗 API 및 VPC 엔드포인트가 필요합니다. 퍼블릭 사용자 지정 도메인 이름에 액세스하는 데 사용하는 VPC 엔드포인트가 있는 경우 이 자습서나 도메인 이름 액세스 연결을 생성하는 데 사용하지 마세요.

## 1단계: 프라이빗 사용자 지정 도메인 이름 생성
<a name="apigateway-private-custom-domains-provider-create-domain"></a>

도메인 이름, ACM 인증서 및 서비스를 간접적으로 호출할 수 있는 VPC 엔드포인트를 제어하는 `execute-api` 서비스의 정책을 지정하여 프라이빗 사용자 지정 도메인 이름을 생성합니다.

------
#### [ AWS Management Console ]

**프라이빗 사용자 지정 도메인 이름을 생성하려면**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)에서 API Gateway 콘솔에 로그인합니다.

1. 기본 탐색 창에서 **사용자 지정 도메인 이름**을 선택합니다.

1. **도메인 이름 추가**를 선택합니다.

1. **도메인 이름(Domain name)**에 도메인 이름을 입력합니다.

   ACM 인증서는 이 도메인 이름을 포함해야 하지만 도메인 이름은 고유할 필요는 없습니다.

1. **프라이빗**을 선택하세요.

1. **라우팅 모드**에서 **API 매핑만**을 선택합니다.

1. **ACM 인증서**에서 인증서를 선택합니다.

1. **도메인 이름 추가**를 선택합니다.

API Gateway는 모든 리소스 `deny` 정책을 사용하여 도메인 이름을 프로비저닝합니다. `execute-api` 서비스에 대한 리소스 정책입니다. VPC 엔드포인트에게 프라이빗 사용자 지정 도메인 이름을 호출할 수 있는 액세스 권한을 부여하려면 이 리소스 정책을 업데이트해야 합니다.

**API 리소스 정책을 업데이트하려면**

1. **리소스 정책** 탭을 선택한 다음 **리소스 정책 편집**을 선택합니다.

1. 코드 편집기에 다음 리소스 정책을 입력합니다. VPC 엔드포인트 *vpce-abcd1234efg*를 자체 VPC 엔드포인트 ID로 바꿉니다.  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": "*",
               "Action": "execute-api:Invoke",
               "Resource": [
                   "execute-api:/*"
               ]
           },
           {
               "Effect": "Deny",
               "Principal": "*",
               "Action": "execute-api:Invoke",
               "Resource": [
                   "execute-api:/*"
               ],
               "Condition" : {
                   "StringNotEquals": {
                       "aws:SourceVpce": "vpce-abcd1234"
                   }
               }
           }
       ]
   }
   ```

1. **변경 사항 저장**을 선택합니다.

------
#### [ AWS CLI ]

AWS CLI를 사용하여 프라이빗 사용자 지정 도메인 이름을 생성할 때, `execute-api` 서비스에 대한 리소스 정책을 제공하여 VPC 엔드포인트에게 `--policy file://policy.json` 파라미터를 사용하여 프라이빗 사용자 지정 도메인 이름을 간접적으로 호출할 수 있는 액세스 권한을 부여합니다. 나중에 이 정책을 수정할 수 있습니다.

이 예제에서는 파일에서 파라미터를 로드하여 다음 리소스 정책을 `policy`로 연결합니다. 이 파일을 복사하여 `policy.json`으로 저장합니다. 이 정책은 VPC 엔드포인트 *`vpce-abcd1234efg`*에서 프라이빗 사용자 지정 도메인 이름으로 들어오는 트래픽만 허용합니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/*"
            ]
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/*"
            ],
            "Condition" : {
                "StringNotEquals": {
                    "aws:SourceVpce": "vpce-abcd1234"
                }
            }
        }
    ]
}
```

다음 [create-domain-name](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-domain-name.html) 명령은 프라이빗 사용자 지정 도메인 이름을 생성합니다.

```
aws apigateway create-domain-name \
    --domain-name 'private.example.com' \
    --certificate-arn 'arn:aws:acm:us-west-2:111122223333:certificate/a1b2c3d4-5678-90ab-cdef' \
    --security-policy 'TLS_1_2' \
    --endpoint-configuration '{"types":["PRIVATE"]}' \
    --policy file://policy.json
```

출력은 다음과 같습니다.

```
{
    "domainName": "private.example.com",
    "domainNameId": "abcd1234",
    "domainNameArn": "arn:aws:apigateway:us-west-2:111122223333:/domainnames/private.example.com+abcd1234",
    "certificateArn": "arn:aws:acm:us-west-2:111122223333:certificate/a1b2c3d4-5678-90ab-cdef",
    "certificateUploadDate": "2024-09-10T10:31:20-07:00",
    "endpointConfiguration": {
        "types": [
            "PRIVATE"
        ]
    },
    "domainNameStatus": "AVAILABLE",
    "securityPolicy": "TLS_1_2",
    "routingMode" : "API_MAPPING_ONLY",
    "policy": "..."
}
```

------

## 2단계: 프라이빗 API를 프라이빗 사용자 지정 도메인 이름에 매핑하기 위한 기본 경로 매핑 생성
<a name="apigateway-private-custom-domains-base-path-mapping"></a>

프라이빗 사용자 지정 도메인 이름을 생성한 후 프라이빗 API를 매핑합니다. 기본 경로 매핑은 프라이빗 사용자 지정 도메인 이름 및 연결된 기본 경로를 결합하여 API에 액세스할 수 있게 합니다. 단일 프라이빗 사용자 지정 도메인 이름을 여러 프라이빗 API의 호스트 이름으로 사용하는 것이 좋습니다.

자체 API를 간접적으로 호출할 계획이 없더라도 모든 API 공급자는 기본 경로 매핑을 생성해야 합니다. 또한 VPC 엔드포인트에게 프라이빗 사용자 지정 도메인 이름에 매핑하는 프라이빗 API를 간접적으로 호출할 수 있는 액세스 권한을 부여해야 합니다.

------
#### [ AWS Management Console ]

**기본 경로 매핑을 생성하려면**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)에서 API Gateway 콘솔에 로그인합니다.

1. 기본 탐색 창에서 **사용자 지정 도메인 이름**을 선택합니다.

1. 프라이빗 사용자 지정 도메인 이름을 선택합니다.

1. **API 매핑** 탭에서 **매핑 구성**을 선택합니다.

1. **새 매핑 추가**를 선택합니다.

1. **API**, **스테이지** 및 **경로**(선택 사항)를 입력합니다.

1. **저장**을 선택합니다.

------
#### [ AWS CLI ]

다음 [create-base-path-mapping](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-base-path-mapping.html) 명령은 프라이빗 API와 프라이빗 사용자 지정 도메인 이름 간에 매핑을 생성합니다.

```
aws apigateway create-base-path-mapping \
    --domain-name-id abcd1234 \
    --domain-name 'private.example.com' \
    --rest-api-id a1b2c3 \
    --stage prod \
    --base-path v1
```

출력은 다음과 같습니다.

```
{
    "basePath": "v1",
    "restApiId": "a1b2c3",
    "stage": "prod"
}
```

------

API로 트래픽을 라우팅하는 방법에 대한 유연성을 높이기 위해 라우팅 모드를 `ROUTING_RULE_ONLY` 또는 `ROUTING_RULE_THEN_API_MAPPING`으로 변경하고 라우팅 규칙을 만들 수 있습니다. 자세한 내용은 [API Gateway에서 사용자 지정 도메인 이름을 통해 API로 트래픽을 전송합니다.](rest-api-routing-mode.md) 섹션을 참조하세요.

**참고**  
다른 AWS 계정가 프라이빗 사용자 지정 도메인 이름을 간접적으로 호출하도록 하려면이 자습서를 완료한 후 [API 공급자: AWS RAM을 사용하여 프라이빗 사용자 지정 도메인 이름 공유](apigateway-private-custom-domains-provider-share.md)의 단계를 따릅니다.

## 3단계: 사용자 지정 도메인 이름과 VPC 엔드포인트 간에 도메인 이름 액세스 연결 생성
<a name="apigateway-private-custom-domains-provider-associate-with-vpce"></a>

그런 다음 프라이빗 사용자 지정 도메인 이름과 VPC 엔드포인트 간에 도메인 이름 액세스 연결을 생성합니다. VPC 엔드포인트는 도메인 이름 액세스 연결을 사용하여 퍼블릭 인터넷에서 격리된 상태에서 프라이빗 사용자 지정 도메인 이름을 간접적으로 호출합니다.

------
#### [ AWS Management Console ]

**도메인 이름 액세스 연결을 생성하려면**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)에서 API Gateway 콘솔에 로그인합니다.

1. 기본 탐색 창에서 **사용자 지정 도메인 이름**을 선택합니다.

1. 프라이빗 사용자 지정 도메인 이름을 선택합니다.

1. **리소스 공유** 탭의 **도메인 이름 액세스 연결**에서 **도메인 이름 액세스 연결 생성**을 선택합니다.

1. **도메인 이름 ARN**에서 도메인 이름을 선택합니다.

1. **VPC 엔드포인트 ID**에서 1단계에서 액세스 권한을 제공한 VPC 엔드포인트 ID를 선택합니다.

1. **도메인 이름 액세스 연결**을 선택합니다.

콘솔의 **도메인 이름 액세스 연결** 페이지를 사용하여 도메인 이름 액세스 연결을 생성할 수도 있습니다.

------
#### [ AWS CLI ]

다음 `create-domain-name-access-association` 명령은 프라이빗 사용자 지정 도메인 이름과 VPC 엔드포인트 간에 도메인 이름 액세스 연결을 생성합니다.

```
aws apigateway create-domain-name-access-association \
    --domain-name-arn arn:aws:apigateway:us-west-2:111122223333:/domainnames/private.example.com+abcd1234 \
    --access-association-source vpce-abcd1234efg \
    --access-association-source-type VPCE \
    --region us-west-2
```

출력은 다음과 같습니다.

```
{
    "domainNameAccessAssociationARN": "arn:aws:apigateway:us-west-2:111122223333:/domainnameaccessassociations/domainname/private.example.com+abcd1234/vpcesource/vpce-abcd1234efg",
    "accessAssociationSource": "vpce-abcd1234efg",
    "accessAssociationSourceType": "VPCE",
    "domainNameARN" : "arn:aws:apigateway:us-west-2:111122223333:/domainnames/private.example.com+abcd1234"
}
```

------

도메인 이름 액세스 연결을 생성한 후 준비하는 데 약 15분이 걸립니다. 기다리는 동안 다음 단계를 진행할 수 있습니다.

## 4단계: Route 53 호스팅 영역 생성
<a name="apigateway-private-custom-domains-provider-create-route-53-private-hosted-zone"></a>

리소스 정책을 업데이트하고 프라이빗 사용자 지정 도메인 이름을 VPC 엔드포인트와 연결한 후 Route 53에 프라이빗 호스팅 영역을 생성하여 사용자 지정 도메인 이름을 확인합니다. 호스팅 영역이란 인터넷에 자신의 리소스를 노출하지 않고 하나 이상의 VPC 내에 있는 도메인의 트래픽을 라우팅하려는 방식에 대한 정보를 담고 있는 컨테이너입니다. 자세한 내용은 [프라이빗 호스팅 영역 작업](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zones-private.html)을 참조하세요.

------
#### [ AWS Management Console ]

AWS Management Console을 사용하려면 *Amazon Route 53 개발자 안내서*의 [프라이빗 호스팅 영역 생성](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zone-private-creating.html)을 참조하세요.

**이름**에는 프라이빗 사용자 지정 도메인 이름의 이름을 사용합니다. **VPC ID**의 경우 이전 단계에서 사용한 VPC 엔드포인트가 포함된 VPC를 사용합니다.

------
#### [ AWS CLI ]

다음 [create-hosted-zone](https://docs.aws.amazon.com/cli/latest/reference/route53/create-hosted-zone.html) 명령은 프라이빗 호스팅 영역을 생성합니다.

```
aws route53 create-hosted-zone --name private.example.com \
    --caller-reference 2014-04-01-18:47 \
    --hosted-zone-config Comment="command-line version",PrivateZone=true \
    --vpc VPCRegion=us-west-2,VPCId=vpc-abcd1234
```

출력에는 호스팅 영역 ID가 포함됩니다. 다음 단계에서 호스팅 영역 ID를 사용합니다.

------

## 5단계: Route 53 DNS 레코드 생성
<a name="apigateway-private-custom-domains-provider-create-route-53-record"></a>

호스팅 영역을 생성한 후 프라이빗 사용자 지정 도메인 이름을 확인하는 레코드를 생성합니다. 이전 단계에서 생성한 호스팅 영역 ID를 사용합니다. 이 예제에서는 A 레코드 유형을 생성합니다. VPC 엔드포인트에 IPv6를 사용하는 경우 AAAA 레코드 유형을 생성합니다. VPC 엔드포인트에 듀얼 스택을 사용하는 경우 AAAA 및 A 레코드 유형을 모두 생성합니다.

------
#### [ AWS Management Console ]

AWS Management Console을 사용하려면 [도메인 이름을 사용하여 Amazon API Gateway API로 트래픽 라우팅](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-api-gateway.html)을 참조하세요.

**빠른 생성**을 사용하고 **별칭**을 켭니다. 엔드포인트의 경우 VPC 엔드포인트 DNS 이름을 사용합니다.

------
#### [ AWS CLI ]

프라이빗 사용자 지정 도메인 이름을 지정된 호스팅 영역 ID의 호스트 이름으로 매핑하도록 DNS 레코드를 구성하려면 먼저 프라이빗 도메인 이름에 대해 DNS 레코드를 설정하기 위한 구성을 포함하는 JSON 파일을 생성합니다.

다음 `setup-dns-record.json`에서는 프라이빗 사용자 지정 도메인 이름을 프라이빗 호스트 이름에 매핑하기 위해 DNS `A` 레코드를 생성하는 방법을 보여줍니다. VPC DNS ID의 `DNSName`과 이전 단계에서 생성한 호스팅 영역 ID를 제공합니다.

```
{
  "Changes": [
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "private.example.com",
        "Type": "A",
        "AliasTarget": {
          "DNSName": "vpce-abcd1234.execute-api.us-west-2.vpce.amazonaws.com",
          "HostedZoneId": "Z2OJLYMUO9EFXC",
          "EvaluateTargetHealth": false
        }
      }
    }
  ]
}
```

다음 [change-resource-record-sets](https://docs.aws.amazon.com/cli/latest/reference/route53/change-resource-record-sets.html) 명령은 프라이빗 사용자 지정 도메인 이름에 대한 DNS 레코드를 생성합니다.

```
aws route53 change-resource-record-sets \
    --hosted-zone-id ZABCDEFG1234 \
    --change-batch file://path/to/your/setup-dns-record.json
```

`hosted-zone-id`를 계정에 설정된 DNS 레코드의 Route 53 호스팅 영역 ID로 교체합니다. `change-batch` 파라미터 값은 JSON 파일을 가리킵니다.

------

자체 프라이빗 사용자 지정 도메인 이름을 간접적으로 호출할 계획이 없는 경우 프라이빗 사용자 지정 도메인 이름이 작동하는지 확인한 후 이러한 리소스를 삭제할 수 있습니다.

## 6단계: 프라이빗 사용자 지정 도메인 이름을 간접적으로 호출
<a name="apigateway-private-custom-domains-tutorial-invoke"></a>

이제 자체 AWS 계정에서 프라이빗 사용자 지정 도메인 이름을 간접적으로 호출할 수 있습니다. VPC에서 다음 curl 명령을 사용하여 프라이빗 사용자 지정 도메인 이름에 액세스합니다.

```
curl https://private.example.com/v1
```

프라이빗 API를 간접적으로 호출하는 다른 방법에 대한 자세한 내용은 [사용자 지정 도메인 이름을 사용하여 프라이빗 API를 간접적으로 호출](apigateway-private-api-test-invoke-url.md#apigateway-private-custom-domains-provider-invoke) 섹션을 참조하세요.

## 7단계: 정리
<a name="apigateway-private-custom-domains-cleanup"></a>

불필요한 비용을 방지하려면 VPC 엔드포인트와 프라이빗 사용자 지정 도메인 이름 간의 연결을 삭제한 다음 프라이빗 사용자 지정 도메인 이름을 삭제합니다.

------
#### [ AWS Management Console ]

**도메인 이름 액세스 연결을 삭제하려면**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)에서 API Gateway 콘솔에 로그인합니다.

1. 기본 탐색 창에서 **도메인 이름 액세스 연결**을 선택합니다.

1. 도메인 이름 액세스 연결을 선택한 다음 **삭제**를 선택합니다.

1. 해당 선택을 확인한 다음, **삭제**를 선택합니다.

도메인 이름 액세스 연결을 삭제한 후 프라이빗 사용자 지정 도메인 이름을 삭제할 수 있습니다.

**프라이빗 사용자 지정 도메인 이름을 삭제하려면**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)에서 API Gateway 콘솔에 로그인합니다.

1. 기본 탐색 창에서 **사용자 지정 도메인 이름**을 선택합니다.

1. 프라이빗 사용자 지정 도메인 이름을 선택합니다.

1. **삭제**를 선택합니다.

1. 해당 선택을 확인한 다음, **삭제**를 선택합니다.

필요한 경우 VPC 엔드포인트를 삭제할 수도 있습니다. 자세한 내용은 [인터페이스 엔드포인트 삭제](https://docs.aws.amazon.com/vpc/latest/privatelink/delete-interface-endpoint.html)를 참조하세요.

------
#### [ AWS CLI ]

**정리하려면**

1. 다음 `delete-access-association` 명령은 도메인 이름 액세스 연결을 삭제합니다.

   ```
   aws apigateway delete-domain-name-access-association \
       --domain-name-access-association-arn 'arn:aws:apigateway:us-west-2:111122223333:/domainnameaccessassociations/domainname/private.example.com+abcd1234/vpcesource/vpce-abcd1234efg' \
       --region us-west-2
   ```

1. 다음 `delete-domain-name` 명령은 프라이빗 사용자 지정 도메인 이름을 삭제합니다. 이 명령은 모든 기본 경로 매핑도 제거합니다.

   ```
   aws apigateway delete-domain-name \
       --domain-name test.private.com \
       --domain-name-id abcd1234
   ```

필요한 경우 VPC 엔드포인트를 삭제할 수도 있습니다. 자세한 내용은 [인터페이스 엔드포인트 삭제](https://docs.aws.amazon.com/vpc/latest/privatelink/delete-interface-endpoint.html)를 참조하세요.

------

## 모범 사례
<a name="apigateway-private-custom-domains-best-practices"></a>

프라이빗 사용자 지정 도메인 이름을 만들 때 다음 모범 사례를 따르는 것이 좋습니다.
+ 기본 경로 매핑 또는 라우팅 규칙을 사용하여 하나의 프라이빗 사용자 지정 도메인 이름에서 여러 프라이빗 API로 트래픽을 전송합니다.
+ VPC 엔드포인트가 더 이상 프라이빗 사용자 지정 도메인 이름에 액세스할 필요가 없는 경우 연결을 삭제합니다. 또한 프라이빗 사용자 지정 도메인의 `execute-api` 서비스에 대한 `policy`에서 VPC 엔드포인트를 제거합니다.
+ VPC 엔드포인트당 최소 2개의 가용 영역을 구성합니다.
+ 기본 엔드포인트를 비활성화합니다. API 소비자가 사용자 지정 도메인 이름에서만 API를 직접적으로 호출하도록 허용하려면 기본 엔드포인트를 비활성화하는 것이 좋습니다. 자세한 내용은 [REST API의 기본 엔드포인트 비활성화](rest-api-disable-default-endpoint.md) 섹션을 참조하세요.
+ 프라이빗 사용자 지정 도메인 이름을 설정할 때 Route 53 프라이빗 호스팅 영역과 A 유형 레코드를 프로비저닝하는 것이 좋습니다. 자체 프라이빗 사용자 지정 도메인 이름을 호출할 계획이 없는 경우 나중에 이러한 리소스를 삭제할 수 있습니다.

# 교차 계정 프라이빗 사용자 지정 도메인 이름 작업
<a name="apigateway-private-custom-domains-other-accounts"></a>

이 섹션에서는 교차 계정 프라이빗 사용자 지정 도메인 이름을 사용하는 방법을 설명합니다. 다른 AWS 계정에 프라이빗 사용자 지정 도메인 이름을 제공하고 다른 AWS 계정을 사용하여 프라이빗 사용자 지정 도메인 이름을 간접적으로 호출할 수 있습니다.

AWS Resource Access Manager 또는 API Gateway를 사용하여 프라이빗 사용자 지정 도메인 이름을 다른 AWS 계정과 공유할 수 있습니다. AWS Resource Access Manager(AWS RAM)를 사용하면 조직 또는 조직 단위(OU) 간에 AWS 계정에서 리소스를 안전하게 공유할 수 있습니다. 자세한 내용은 [AWS Resource Access Manager란 무엇인가요?](https://docs.aws.amazon.com/ram/latest/userguide/what-is.html)를 참조하세요.

AWS RAM을 사용하여 프라이빗 사용자 지정 도메인 이름을 다른 AWS 계정과 공유하는 방법에 대한 지침은 [API 공급자: AWS RAM을 사용하여 프라이빗 사용자 지정 도메인 이름 공유](apigateway-private-custom-domains-provider-share.md) 섹션을 참조하세요.

API Gateway를 사용하여 프라이빗 사용자 지정 도메인 이름을 다른 AWS 계정과 공유하는 방법에 대한 지침은 [API 공급자: API Gateway AWS CLI를 사용하여 프라이빗 사용자 지정 도메인 이름 공유](apigateway-private-custom-domains-provider-share-cli.md) 섹션을 참조하세요.

다른 AWS 계정에서 프라이빗 사용자 지정 도메인 이름을 사용하는 방법에 대한 지침은 [API 소비자: VPC 엔드포인트를 공유된 프라이빗 사용자 지정 도메인 이름과 연결](apigateway-private-custom-domains-consumer-create.md) 섹션을 참조하세요.

## 교차 계정 프라이빗 사용자 지정 도메인 이름 작업 모범 사례
<a name="apigateway-private-custom-domains-other-accounts-best-practices"></a>

교차 계정 프라이빗 사용자 지정 도메인 이름 작업에 대한 다음 모범 사례를 따르는 것이 좋습니다.
+ AWS RAM을 사용하여 프라이빗 사용자 지정 도메인 이름을 공유합니다. AWS RAM을 사용하면 운영 오버헤드를 줄일 수 있으며 Amazon API Gateway Management 서비스에 대한 `managementPolicy`를 생성할 필요가 없습니다.
+ 프라이빗 사용자 지정 도메인 이름 또는 도메인 이름 액세스 연결을 나열할 때 `resource-owner` 파라미터를 사용합니다. `resource-owner` 파라미터를 사용하여 사용자 또는 다른 AWS 계정이 소유한 리소스만 나열합니다.

  다음 예제에서는 소유한 모든 도메인 이름 액세스 연결을 가져오는 방법을 보여줍니다.

  ```
  aws apigateway get-domain-name-access-associations --resource-owner SELF
  ```

  `--resource-owner OTHER_ACCOUNTS`를 사용하여 다른 계정이 프라이빗 사용자 지정 도메인 이름으로 구성한 모든 도메인 이름 액세스 연결을 나열합니다.

# API 공급자: AWS RAM을 사용하여 프라이빗 사용자 지정 도메인 이름 공유
<a name="apigateway-private-custom-domains-provider-share"></a>

다른 AWS 계정의 API 소비자에게 프라이빗 사용자 지정 도메인 이름에 대한 액세스 권한을 제공할 수 있습니다. 이 섹션에서는 AWS RAM을 사용하여 프라이빗 사용자 지정 도메인 이름을 공유하는 방법과 프라이빗 사용자 지정 도메인 이름에 대한 액세스를 제어하는 방법을 알아봅니다.

## 프라이빗 사용자 지정 도메인 이름 공유 시 고려 사항
<a name="apigateway-private-custom-domains-provider-share-considerations"></a>

다음 고려 사항은 AWS RAM을 사용하여 프라이빗 사용자 지정 도메인 이름에 대한 액세스를 제공하는 방법에 영향을 미칠 수 있습니다. AWS RAM을 사용하지 않고 프라이빗 사용자 지정 도메인 이름을 공유하는 방법을 알아보려면 [API 공급자: API Gateway AWS CLI를 사용하여 프라이빗 사용자 지정 도메인 이름 공유](apigateway-private-custom-domains-provider-share-cli.md) 섹션을 참조하세요.
+ 프라이빗 사용자 지정 도메인 이름은 AWS 리전 수준에서 공유됩니다. 프라이빗 사용자 지정 도메인 이름과 VPC 엔드포인트는 모두 동일한 AWS 리전에 있어야 합니다.
+ 여러 보안 주체와 하나의 리소스 공유를 사용할 수 있으며, 리소스 공유를 생성한 후 보안 주체를 더 추가할 수 있습니다. 가능하면 리소스 공유를 재사용하는 것이 좋습니다.
+ 프라이빗 사용자 지정 도메인 이름과 여기에 매핑된 프라이빗 API를 간접적으로 호출하려면 항상 API 소비자의 VPC 엔드포인트 액세스 권한을 부여해야 합니다.
+ API 소비자와 API 공급자가 AWS Organizations를 사용하여 동일한 조직에 있는 경우 리소스 공유가 자동으로 수락됩니다. AWS RAM을 사용하여 리소스 공유를 생성해야 합니다.
+ API 소비자와 API 공급자가 AWS Organizations를 사용하여 동일한 조직에 있고 조직 내 리소스 공유가 활성화된 경우, 공유한 조직의 모든 보안 주체에게 리소스 공유에 대한 액세스 권한이 자동으로 부여됩니다. 초대할 필요가 없으며 리소스 공유를 건너뛸 수 있습니다.
+ API 소비자가 **12시간** 이내에 리소스 공유를 수락하지 않는 경우 API 공급자는 리소스를 다시 공유해야 합니다.
+ 리소스 공유를 생성한 후 AWS RAM은 프라이빗 사용자 지정 도메인 이름에 대한 Amazon API Gateway Management 서비스의 `managementPolicy`를 업데이트하여 명시적 `allow` 액세스 없이 보안 주체에 대한 액세스를 방지합니다. 자세한 내용은 IAM 사용 설명서에서 [계정 내에서 요청 허용 여부 결정](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-denyallow)을 참조하세요.

  업데이트된 `managementPolicy`는 다음과 같습니다.

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Id": "abcd1234-1234-abcd-abcd-1234abcdefg",
      "Statement": [
          {
              "Sid": "APIGatewayPrivateDomainNameManagementPolicyDefaultPermission-org",
              "Effect": "Allow",
              "Principal": "*",
              "Action": "apigateway:CreateAccessAssociation",
              "Resource": "arn:aws:apigateway:us-west-2:111122223333:/domainnames/private.example.com+abcd1234",
              "Condition": {
                  "StringEquals": {
                      "aws:PrincipalOrgID": "o-1234abcd"
                  },
                  "StringNotEquals": {
                      "aws:PrincipalAccount": "111122223333"
                  }
              }
          }
      ]
  }
  ```

------

  AWS RAM은 다음을 추가하여 명시적 `allow` 액세스 권한이 없는 보안 주체가 프라이빗 사용자 지정 도메인 이름과의 액세스 연결을 생성하는 것을 방지했습니다.

  ```
  "StringNotEquals": {
      "aws:PrincipalAccount": "111122223333"
  }
  ```

  프라이빗 사용자 지정 도메인 이름을 생성한 AWS 계정의 보안 주체를 사용하여 도메인 이름 액세스 연결을 생성할 수 있습니다.

## 다른 계정이 프라이빗 사용자 지정 도메인 이름과 도메인 이름 액세스 연결을 생성하도록 허용
<a name="apigateway-private-custom-domains-provider-management-policy-update"></a>

먼저 프라이빗 사용자 지정 도메인 이름과 도메인 이름 액세스 연결을 생성할 수 있도록 다른 AWS 계정에게 액세스 권한을 부여합니다.

------
#### [ AWS Management Console ]

AWS Management Console을 사용하려면 *AWS RAM 사용 설명서*의 [AWS RAM에서 리소스 공유 생성](https://docs.aws.amazon.com/ram/latest/userguide/working-with-sharing-create.html)을 참조하세요.

**리소스 유형 선택**에서 **API Gateway 프라이빗 사용자 지정 도메인**을 선택합니다.

------
#### [ AWS CLI ]

다음 [create-resource-share](https://docs.aws.amazon.com/cli/latest/reference/ram/create-resource-share.html)는 프라이빗 사용자 지정 도메인 이름에 대한 리소스 공유를 생성합니다. 리소스 및 보안 주체 연결이 완료되는 데 몇 분 정도 걸릴 수 있습니다. 보안 주체의 경우 계정 ID 또는 `arn:aws:organizations::123456789012:organization/o-1234abcd`와 같은 조직 ID를 입력합니다. 리소스 공유에 여러 보안 주체를 제공할 수 있습니다.

```
aws ram create-resource-share \
    --region us-west-2 \
    --name privateCustomDomain-resource-share \
    --permission-arns arn:aws:ram::aws:permission/APIGatewayPrivateDomainNameManagementPolicyDefaultPermission \
    --resource-arns arn:aws:apigateway:us-west-2:111122223333:/domainnames/private.example.com+abcd1234 \
    --principals 222222222222
```

------

다른 AWS 계정에게 액세스 권한을 제공한 후 해당 계정의 API 소비자는 VPC 엔드포인트와 프라이빗 사용자 지정 도메인 이름 간에 도메인 이름 액세스 연결을 생성해야 합니다. 도메인 이름 액세스 연결을 생성할 수 없습니다. 자세한 내용은 [VPC 엔드포인트를 공유 프라이빗 사용자 지정 도메인 이름과 연결](apigateway-private-custom-domains-consumer-create.md#apigateway-private-custom-domains-consumer-associate) 섹션을 참조하세요.

## 다른 계정이 프라이빗 사용자 지정 도메인 이름을 간접적으로 호출하도록 허용
<a name="apigateway-private-custom-domains-provider-policy-update"></a>

다음으로 프라이빗 사용자 지정 도메인 이름과 여기에 매핑된 프라이빗 API를 간접적으로 호출할 수 있도록 API 소비자의 VPC 엔드포인트에게 액세스 권한을 부여합니다.

------
#### [ AWS Management Console ]

**다른 계정의 VPC 엔드포인트가 프라이빗 사용자 지정 도메인 이름을 호출하도록 허용하려면**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)에서 API Gateway 콘솔에 로그인합니다.

1. 기본 탐색 창에서 **사용자 지정 도메인 이름**을 선택합니다.

1. 다른 AWS 계정과 공유한 프라이빗 사용자 지정 도메인 이름을 선택합니다.

1. **리소스 정책** 탭에서 **리소스 정책 편집**을 선택합니다.

1. API 소비자의 VPC 엔드포인트 ID를 리소스 정책에 추가합니다.

   API 소비자의 VPC 엔드포인트 ID는 프라이빗 사용자 지정 도메인 이름의 **도메인 세부 정보** 페이지에 있는 **리소스 공유** 탭의 **도메인 이름 액세스 연결** 섹션에서 찾을 수 있습니다.

1. **변경 사항 저장**을 선택합니다.

------
#### [ AWS CLI ]

`execute-api` 서비스에 대한 다음 `policy`는 VPC 엔드포인트 `vpce-abcd1234efg` 및 `vpce-xyz000abc` 모두에서 프라이빗 사용자 지정 도메인 이름으로 들어오는 트래픽을 허용합니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/*"
            ]
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/*"
            ],
            "Condition" : {
                "StringNotEquals": {
                    "aws:SourceVpce": [
                    "vpce-abcd1234",
                    "vpce-xyzz0000"
                    ]
                }
            }
        }
    ]
}
```

다음 [update-domain-name](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-domain-name.html) 명령은 패치 작업을 사용하여 프라이빗 사용자 지정 도메인 이름에 대한 `policy`를 업데이트합니다.

```
aws apigateway update-domain-name
    --domain-name private.example.com \
    --domain-name-id abcd1234 \
    --patch-operations op=replace,path=/policy,value='"{\"Version\": \"2012-10-17\",		 	 	 \"Statement\": [{\"Effect\": \"Allow\",\"Principal\": \"*\",\"Action\": \"execute-api:Invoke\",\"Resource\":[\"execute-api:/*\"]},{\"Effect\": \"Deny\",\"Principal\": \"*\",\"Action\": \"execute-api:Invoke\",\"Resource\":[\"execute-api:/*\"],\"Condition\":{\"StringNotEquals\":[\"vpce-abcd1234efg\", \"vpce-xyz000abc\"]}}}]}"
```

------

# API 공급자: AWS RAM을 사용하여 프라이빗 사용자 지정 도메인 이름 공유 중지
<a name="apigateway-private-custom-domains-provider-stop-sharing"></a>

프라이빗 사용자 지정 도메인 이름 공유를 중지하려면 먼저 API 소비자가 리소스 공유를 연결 해제하여 더 많은 도메인 이름 액세스 연결을 생성하지 못하도록 합니다. 그런 다음 도메인 이름 액세스 연결을 거부하고 `execute-api` 서비스에 대한 `policy`에서 API 소비자의 VPC 엔드포인트를 제거합니다. 그러면 API 소비자가 도메인 이름 액세스 연결을 삭제할 수 있습니다.

## 프라이빗 사용자 지정 도메인 이름 공유 중지
<a name="apigateway-private-custom-domains-provider-dissociate-ram"></a>

먼저 AWS RAM을 사용하여 리소스 공유를 중지합니다.

------
#### [ AWS Management Console ]

AWS Management Console을 사용하려면 [AWS RAM의 리소스 공유 업데이트](https://docs.aws.amazon.com/ram/latest/userguide/working-with-sharing-update.html)를 참조하세요.

------
#### [ AWS CLI ]

다음 [disassociate-resource-share](https://docs.aws.amazon.com/cli/latest/reference/ram/disassociate-resource-share.html)는 프라이빗 사용자 지정 도메인 이름에 대한 리소스 공유의 연결을 해제합니다.

```
aws ram disassociate-resource-share \
    --region us-west-2 \
    --resource-arns arn:aws:apigateway:us-west-2:111122223333:/domainnames/private.example.com+abcd1234 \
    --principals 222222222222
```

------

## 도메인 이름 액세스 연결 거부
<a name="apigateway-private-custom-domains-provider-reject"></a>

AWS RAM을 사용하여 리소스 공유를 중지한 후에는 다른 계정의 VPC 엔드포인트와 프라이빗 사용자 지정 도메인 이름 간의 도메인 이름 액세스 연결을 거부합니다.

**참고**  
자신의 계정에서 도메인 이름 액세스 연결을 거부할 수 없습니다. 리소스 공유를 중지하려면 도메인 이름 액세스 연결을 삭제합니다. 자세한 내용은 [도메인 이름 액세스 연결 삭제](apigateway-private-custom-domains-tutorial.md#apigateway-private-custom-domains-cleanup)를 참조하세요.

VPC 엔드포인트와의 도메인 이름 액세스 연결을 거부하는 경우 API 소비자가 프라이빗 사용자 지정 도메인 이름을 직접적으로 호출하려고 하면 API Gateway는 직접적 호출을 거부하고 `403` 상태 코드를 반환합니다.

------
#### [ AWS Management Console ]

**도메인 이름 액세스 연결을 거부하려면**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)에서 API Gateway 콘솔에 로그인합니다.

1. 기본 탐색 창에서 **사용자 지정 도메인 이름**을 선택합니다.

1. 다른 AWS 계정과 공유한 프라이빗 사용자 지정 도메인 이름을 선택합니다.

1. **리소스 공유**에서 거부할 도메인 이름 액세스 연결을 선택합니다.

1. **연결 거부**를 선택합니다.

1. 선택 사항을 검토한 다음 **거부**를 선택합니다.

------
#### [ AWS CLI ]

다음 `reject-domain-name-access-association` 명령은 VPC 엔드포인트와 프라이빗 사용자 지정 도메인 이름 간의 도메인 이름 액세스 연결을 거부합니다.

```
aws apigateway reject-domain-name-access-association \
    --domain-name-access-association-arn arn:aws:apigateway:us-west-2:444455556666:/domainnameaccessassociations/domainname/private.example.com+abcd1234/vpcesource/vpce-abcd1234efg \
    --domain-name-arn arn:aws:apigateway:us-west-2:111122223333:/domainnames/private.example.com+abcd1234
```

------

## 프라이빗 사용자 지정 도메인 이름을 간접적으로 호출하기 위한 API 공급자 액세스 거부
<a name="apigateway-private-custom-domains-provider-deny-access"></a>

도메인 이름 액세스 연결을 거부한 후에는 `execute-api` 서비스에 대한 `policy`에서 API 소비자의 VPC 엔드포인트를 제거합니다.

------
#### [ AWS Management Console ]

**리소스 정책에서 API 소비자의 VPC 엔드포인트를 제거하려면**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)에서 API Gateway 콘솔에 로그인합니다.

1. 기본 탐색 창에서 **사용자 지정 도메인 이름**을 선택합니다.

1. 다른 AWS 계정과 공유한 프라이빗 사용자 지정 도메인 이름을 선택합니다.

1. **리소스 정책** 탭에서 **편집**을 선택합니다.

1. 정책에서 VPC 엔드포인트를 제거합니다.

1. **변경 사항 저장**을 선택합니다.

------
#### [ AWS CLI ]

다음 [update-domain-name](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-domain-name.html) 명령은 패치 작업을 사용하여 프라이빗 사용자 지정 도메인 이름의 `execute-api` 서비스에 대한 `policy`를 업데이트합니다. 이 새 `policy`는 [다른 계정이 프라이빗 사용자 지정 도메인 이름을 간접적으로 호출하도록 허용](apigateway-private-custom-domains-provider-share.md#apigateway-private-custom-domains-provider-policy-update)에 추가된 추가 VPC 엔드포인트 ID를 제거합니다.

```
aws apigateway update-domain-name
    --domain-name private.example.com \
    --domain-name-id abcd1234 \
    --patch-operations op=replace,path=/policy,value='"{\"Version\": \"2012-10-17\",		 	 	 \"Statement\": [{\"Effect\": \"Allow\",\"Principal\": \"*\",\"Action\": \"execute-api:Invoke\",\"Resource\":[\"execute-api:/*\"]},{\"Effect\": \"Deny\",\"Principal\": \"*\",\"Action\": \"execute-api:Invoke\",\"Resource\":[\"execute-api:/*\"],\"Condition\":{\"StringNotEquals\":{\"aws:SourceVpce\": \"vpce-abcd1234efg\"}}}]}"
```

------

그런 다음 API 소비자는 도메인 이름 액세스 연결을 삭제해야 합니다. 해당 사용자에 대해서는 삭제할 수 없습니다. 자세한 내용은 [API 소비자: 프라이빗 사용자 지정 도메인 이름과의 도메인 이름 액세스 연결 삭제](apigateway-private-custom-domains-consumer-delete-domain-name-access-association.md) 섹션을 참조하세요.

# API 공급자: API Gateway AWS CLI를 사용하여 프라이빗 사용자 지정 도메인 이름 공유
<a name="apigateway-private-custom-domains-provider-share-cli"></a>

API Gateway AWS CLI를 사용하여 프라이빗 사용자 지정 도메인 이름을 공유할 수 있지만 AWS RAM을 사용하여 운영 오버헤드를 줄이는 것이 좋습니다. AWS RAM을 사용하여 프라이빗 사용자 지정 도메인 이름을 공유하는 방법에 대한 지침은 [API 공급자: AWS RAM을 사용하여 프라이빗 사용자 지정 도메인 이름 공유](apigateway-private-custom-domains-provider-share.md) 섹션을 참조하세요.

API Gateway AWS CLI를 사용하여 프라이빗 사용자 지정 도메인 이름을 공유하려면 다른 AWS 계정 액세스 권한을 부여하여 도메인 이름 액세스 연결을 생성하고 프라이빗 사용자 지정 도메인 이름을 간접적으로 호출합니다. 이렇게 하려면 API Gateway Management 서비스의 `managementPolicy`와 프라이빗 사용자 지정 도메인 이름의 `execute-api` 서비스에 대한 `policy`를 업데이트합니다. 또한 프라이빗 사용자 지정 도메인 이름에 매핑된 프라이빗 API에 대한 리소스 정책에서 API 소비자의 VPC 엔드포인트에 대한 액세스 권한을 부여해야 합니다.

API 소비자는 VPC 엔드포인트와 프라이빗 사용자 지정 도메인 이름 간에 자체 계정에서 도메인 이름 액세스 연결을 생성해야 합니다. 이 작업을 수행할 수 없습니다.

## 프라이빗 사용자 지정 도메인 이름에 대한 액세스 권한 부여
<a name="apigateway-private-custom-domains-provider-share-cli-allow"></a>

**프라이빗 사용자 지정 도메인 이름에 대한 액세스 권한을 부여하려면**

1. API Gateway Management 서비스의 `managementPolicy`를 업데이트하려면 정책을 업데이트하는 패치 작업이 포함된 JSON 파일을 생성합니다. 다음 `patch-managementPolicy.json`에서는 현재 `managementPolicy`를 프라이빗 사용자 지정 도메인 이름 `private.example.com`과 도메인 이름 액세스 연결을 생성할 수 있는 액세스 권한을 AWS 계정 111122223333 및 444455556666에 부여하는 예제 정책으로 바꿉니다.

   ```
   [{
       "op": "replace",
       "path": "/managementPolicy",
       "value": "{\"Version\":\"2012-10-17\",		 	 	 \"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"arn:aws:iam::111122223333:root\", \"arn:aws:iam::444455556666:root\"]},\"Action\":\"apigateway:CreateAccessAssociation\",\"Resource\":\"arn:aws:apigateway:us-west-2:111122223333:/domainnames/private.example.com+abcd1234\"}]}"
   }]
   ```

    다음 [update-domain-name](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-domain-name.html) 명령은 `patch-managementPolicy.json`을 사용하여 `managementPolicy`를 업데이트합니다.

   ```
   aws apigateway update-domain-name \
       --domain-name private.example.com \
       --domain-name-id abcd1234 \
       --patch-operations file://patch-managementPolicy.json
   ```

   액세스 권한을 부여한 후에는 API 소비자에게 도메인 이름 액세스 연결을 구성할 수 있음을 알려야 합니다. AWS RAM을 사용하는 경우 AWS RAM이 이 단계를 대신 수행합니다.

1. `execute-api` 서비스의 `policy`를 업데이트하려면 정책을 업데이트하는 패치 작업이 포함된 JSON 파일을 생성합니다. 다음 `patch-policy.json`에서는 현재 `policy`를 프라이빗 사용자 지정 도메인 이름 `private.example.com`을 간접적으로 호출하기 위해 두 개의 VPC 엔드포인트를 부여하는 예제 정책으로 바꿉니다.

   ```
   [{
       "op": "replace",
       "path": "/policy",
       "value": "{\"Version\": \"2012-10-17\",		 	 	 \"Statement\": [{\"Effect\": \"Allow\",\"Principal\": \"*\",\"Action\": \"execute-api:Invoke\",\"Resource\": \"arn:aws:execute-api:us-west-2:111122223333:/domainnames/private.example.com+abcd1234\"},{\"Effect\": \"Deny\",\"Principal\": \"*\",\"Action\": \"execute-api:Invoke\",\"Resource\": \"arn:aws:execute-api:us-west-2:111122223333:/domainnames/private.example.com+abcd1234\",\"Condition\": {\"StringNotEquals\": {\"aws:SourceVpce\": [\"vpce-abcd1234\",\"vpce-xyzz0000\"]}}}]}"
   }]
   ```

    다음 [update-domain-name](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-domain-name.html) 명령을 사용하면 `patch-policy.json`을 사용하여 `policy`를 업데이트할 수 있습니다.

   ```
   aws apigateway update-domain-name \
       --domain-name private.example.com \
       --domain-name-id abcd1234 \
       --patch-operations file://patch-policy.json
   ```

## 프라이빗 사용자 지정 도메인 이름에 대한 액세스 거부
<a name="apigateway-private-custom-domains-provider-share-cli-deny"></a>

프라이빗 사용자 지정 도메인 이름 공유를 중지하려면 프라이빗 사용자 지정 도메인 이름과 API 소비자의 VPC 엔드포인트 간의 도메인 이름 액세스 연결을 거부해야 합니다.

**프라이빗 사용자 지정 도메인 이름에 대한 액세스를 거부하려면**

1. 다음 `reject-domain-name-access-association` 명령은 도메인 이름 액세스 연결을 거부합니다.

   ```
   aws apigateway reject-domain-name-access-association \
       --domain-name-access-association-arn arn:aws:apigateway:us-west-2:444455556666:/domainnameaccessassociations/domainname/private.example.com+abcd1234/vpcesource/vpce-abcd1234 \
       --domain-name-arn arn:aws:apigateway:us-west-2:111122223333:/domainnames/private.example.com+abcd1234
   ```

1. `patch-managementPolicy.json`을 수정하여 API 공급자의 계정에 대한 액세스를 제거하여 프라이빗 사용자 지정 도메인 이름과 도메인 이름 액세스 연결을 생성합니다. 다음 `patch-managementPolicy.json`은 `managementPolicy`에서 계정 하나를 제거합니다. 

   ```
   [{
        "op": "replace",
        "path": "/managementPolicy",
        "value": "{\"Version\":\"2012-10-17\",		 	 	 \"Statement\":[{\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"apigateway:CreateAccessAssociation\",\"Resource\":\"arn:aws:apigateway:us-west-2:111122223333:/domainnames/private.example.com+abcd1234\"}]}"
   }]
   ```

   다음 [update-domain-name](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-domain-name.html) 명령은 `patch-managementPolicy.json`을 사용하여 `managementPolicy`를 업데이트합니다.

   ```
   aws apigateway update-domain-name \
       --domain-name private.example.com \
       --domain-name-id abcd1234 \
       --patch-operations file://patch-managementPolicy.json
   ```

1. `patch-policy.json`을 수정하여 API 공급자의 VPC 엔드포인트에 대한 액세스를 제거하여 프라이빗 사용자 지정 도메인 이름을 간접적으로 호출합니다. 다음 `patch-policy.json`은 `policy`에서 VPC 엔드포인트 ID를 제거합니다.

   ```
   [{
       "op": "replace",
       "path": "/policy",
       "value": "{\"Version\":\"2012-10-17\",		 	 	 \"Statement\":[{\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"execute-api:Invoke\",\"Resource\":\"arn:aws:execute-api:us-west-2:111122223333:/domainnames/private.example.com+abcd1234\"},{\"Effect\":\"Deny\",\"Principal\":\"*\",\"Action\":\"execute-api:Invoke\",\"Resource\":\"arn:aws:execute-api:us-west-2:111122223333:/domainnames/private.example.com+abcd1234\",\"Condition\":{\"StringNotEquals\":{\"aws:SourceVpce\":\"vpce-abcd1234\"}}}]}"
   }]
   ```

   다음 [update-domain-name](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-domain-name.html) 명령은 `patch-policy.json`을 사용하여 `policy`를 업데이트합니다.

   ```
   aws apigateway update-domain-name \
       --domain-name private.example.com \
       --domain-name-id abcd1234 \
       --patch-operations file://patch-policy.json
   ```

## 이 절차에 사용되는 정책 예제
<a name="apigateway-private-custom-domains-provider-share-cli-policies"></a>

다음 섹션에서는 이전 절차에서 사용한 정책 예제를 보여줍니다.

다음 예제 정책은 Amazon API Gateway Management 서비스용 `managementPolicy`에 대한 정책입니다. 이 정책은 AWS 계정 111122223333 및 444455556666에 프라이빗 사용자 지정 도메인 이름 `private.example.com`과 도메인 이름 액세스 연결을 생성할 수 있는 액세스 권한을 부여합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "111122223333",
                    "444455556666"
                ]
            },
            "Action": "apigateway:CreateAccessAssociation",
            "Resource": "arn:aws:apigateway:us-west-2:111122223333:/domainnames/private.example.com+a1b2c3"
        }
    ]
}
```

------

다음 예제 정책은 `execute-api` 서비스에 대한 `policy`의 정책입니다. 이 정책은 VPC 엔드포인트 `vpce-abcd1234`와 프라이빗 사용자 지정 도메인 이름을 간접적으로 호출할 수 있는 `vpce-xyzz0000` 액세스 권한을 부여합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-west-2:111122223333:/domainnames/private.example.com+abcd1234"
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-west-2:111122223333:/domainnames/private.example.com+abcd1234",
            "Condition": {
                "StringNotEquals": {
                    "aws:SourceVpce": [
                        "vpce-abcd1234",
                        "vpce-xyzz0000"
                    ]
                }
            }
        }
    ]
}
```

------

# API 소비자: VPC 엔드포인트를 공유된 프라이빗 사용자 지정 도메인 이름과 연결
<a name="apigateway-private-custom-domains-consumer-create"></a>

다음 절차에서는 다른 AWS 계정에서 프라이빗 도메인 이름을 사용하는 방법을 보여줍니다. API 공급자와의 신뢰 관계에 따라 AWS RAM는 일부 작업을 완료할 수 있습니다.

프라이빗 사용자 지정 도메인 이름과 다른 AWS 계정에 있는 경우 VPC 엔드포인트를 프라이빗 사용자 지정 도메인 이름과 연결하고 간접적으로 호출할 수 있습니다. 프라이빗 사용자 지정 도메인 이름의 `policy` 또는 다른 파라미터를 볼 수 없습니다.

## 사전 조건
<a name="apigateway-private-custom-domains-consumer-prerequisites"></a>

다른 AWS 계정에서 프라이빗 사용자 지정 도메인 이름을 사용하려면 다음 사전 조건이 필요합니다.
+ VPC 및 `execute-api` 서비스에 대한 VPC 엔드포인트. VPC에는 `enableDnsHostnames`가 있고 `enableDnsSupport`가 `true`로 설정되어 있어야 합니다.
+ VPC 엔드포인트당 최소 2개의 가용 영역을 구성하는 것이 좋습니다.

## (선택 사항) 프라이빗 사용자 지정 도메인 리소스 공유 수락
<a name="apigateway-private-custom-domains-consumer-accept-resource-share"></a>

API 공급자가 리소스 공유를 생성하는 데 AWS RAM을 사용한 경우 **12시간** 내에 수락해야 합니다. AWS Organizations를 API 공급자로 사용하는 동일한 조직에 있는 경우 공유가 자동으로 수락됩니다. 자동 공유 리소스가 활성화된 조직에 있는 경우 리소스가 자동으로 공유됩니다.

------
#### [ AWS Management Console ]

AWS Management Console을 사용하려면 *AWS RAM 사용 설명서*의 [리소스 공유 초대 수락 및 거부](https://docs.aws.amazon.com/ram/latest/userguide/working-with-shared-invitations.html)를 참조하세요.

------
#### [ AWS CLI ]

공유된 모든 리소스를 찾으려면 다음 [get-resource-share-invitations](https://docs.aws.amazon.com/cli/latest/reference/ram/get-resource-share-invitations.html) 명령을 사용합니다.

```
aws ram get-resource-share-invitations \
    --region us-west-2
```

결과 리소스 공유 ARN을 사용하여 리소스 공유 초대를 수락합니다. 다음 [accept-resource-share-invitation](https://docs.aws.amazon.com/cli/latest/reference/ram/accept-resource-share-invitation.html) 명령은 리소스 공유를 수락합니다.

```
aws ram accept-resource-share-invitation \
    --resource-share-invitation-arn arn:aws:ram:us-west-2:123456789012:resource-share-invitation/1e3477be-4a95-46b4-bbe0-c4001EXAMPLE \
    --region us-west-2
```

------

## VPC 엔드포인트를 공유 프라이빗 사용자 지정 도메인 이름과 연결
<a name="apigateway-private-custom-domains-consumer-associate"></a>

프라이빗 사용자 지정 도메인 이름은 고유하지 않으므로 VPC 엔드포인트를 고유한 사용자 지정 도메인 이름 ARN과 연결합니다. 도메인 이름 액세스 연결을 생성한 후 VPC 엔드포인트가 프라이빗 사용자 지정 도메인 이름을 간접적으로 호출하는 데 최대 15분이 걸릴 수 있습니다. 퍼블릭 사용자 지정 도메인 이름에 액세스하는 데 사용하는 VPC 엔드포인트가 있는 경우 이를 사용하여 도메인 이름 액세스 연결을 생성하지 마십시오.

------
#### [ AWS Management Console ]

**VPC 엔드포인트를 공유 프라이빗 사용자 지정 도메인 이름과 연결하려면**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)에서 API Gateway 콘솔에 로그인합니다.

1. 기본 탐색 창에서 **도메인 이름 액세스 연결**을 선택합니다.

1. **도메인 이름 액세스 연결 생성**을 선택합니다.

1. **도메인 이름 ARN**에서 API 공급자가 공유한 도메인 이름 ARN을 선택합니다.

   도메인 이름 ARN이 드롭다운 목록에 표시되지 않을 수 있습니다. AWS RAM 콘솔을 사용하여 공유된 도메인 이름을 확인한 다음 도메인 이름 ARN을 복사하여 이 필드에 입력할 수 있습니다.

1. **VPC 엔드포인트 ID**에서 도메인 이름 액세스 연결을 구성할 VPC 엔드포인트 ID를 선택합니다.

1. **도메인 이름 액세스 연결 생성**을 선택합니다.

------
#### [ AWS CLI ]

프라이빗 사용자 지정 도메인 이름은 고유하지 않으므로 VPC 엔드포인트를 고유한 사용자 지정 도메인 이름 ARN과 연결합니다. 도메인 이름 ARN을 찾으려면 다음 명령 중 하나를 사용합니다.

1.   
**AWS RAM**  
다음 [list-resources](https://docs.aws.amazon.com/cli/latest/reference/ram/list-resources.html) 명령은 공유되는 리소스를 나열합니다. 이 명령을 사용하려면 API 공급자가 AWS RAM을 사용하여 프라이빗 사용자 지정 도메인을 공유해야 합니다.  

   ```
   aws ram list-resources \
       --resource-owner OTHER-ACCOUNTS \
       --region us-west-2
       --resource-type apigateway:Domainnames
   ```  
**API Gateway**  
다음 `get-domain-names` 명령은 도메인 이름 액세스 연결을 구성할 수 있는 다른 AWS 계정이 소유한 모든 프라이빗 사용자 지정 도메인 이름을 나열합니다.  

   ```
   aws apigateway get-domain-names \
       --resource-owner OTHER_ACCOUNTS \
       --region us-west-2
   ```

1.  ARN을 검색한 후 API Gateway를 사용하여 VPC 엔드포인트와 공유 프라이빗 사용자 지정 도메인 이름 간에 도메인 이름 액세스 연결을 생성합니다. 다음 `create-domain-name-access-association` 명령을 사용합니다.

   ```
   aws apigateway create-domain-name-access-association \
       --access-association-source-type VPCE \
       --access-association-source 'vpce-1a2b3c4d5e6f1a2b3' \
       --domain-name-arn arn:aws:apigateway:us-west-2:111122223333:/domainnames/private.example.com+abcd1234"
   ```

   출력은 다음과 같습니다.

   ```
   {
       "domainNameAccessAssociationARN": "arn:aws:apigateway:us-west-2:444455556666:/domainnameaccessassociations/domainname/private.example.com+abcd1234/vpcesource/vpce-abcd1234efg", 
       "accessAssociationSource": "vpce-1a2b3c4d5e6f1a2b3",
       "accessAssociationSourceType": "VPCE",
       "domainNameARN" : "arn:aws:apigateway:us-west-1:111122223333:/domainnames/private.example.com+a1b2c3"
   }
   ```

------

VPC 엔드포인트를 프라이빗 사용자 지정 도메인 이름과 연결한 후 API 공급자가 VPC 엔드포인트가 도메인 이름을 호출할 수 있도록 프라이빗 사용자 지정 도메인 이름의 정책을 업데이트했는지 확인합니다. 자세한 내용은 [다른 계정이 프라이빗 사용자 지정 도메인 이름을 간접적으로 호출하도록 허용](apigateway-private-custom-domains-provider-share.md#apigateway-private-custom-domains-provider-policy-update) 섹션을 참조하세요.

## Route 53 호스팅 영역 생성
<a name="apigateway-private-custom-domains-consumer-create-route-53-private-hosted-zone"></a>

프라이빗 사용자 지정 도메인 이름을 확인하려면 Route 53 프라이빗 호스팅 영역을 생성해야 합니다. 호스팅 영역이란 인터넷에 자신의 리소스를 노출하지 않고 하나 이상의 VPC 내에 있는 도메인의 트래픽을 라우팅하려는 방식에 대한 정보를 담고 있는 컨테이너입니다. 자세한 내용은 [프라이빗 호스팅 영역 작업](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zones-private.html)을 참조하세요.

------
#### [ AWS Management Console ]

AWS Management Console을 사용하려면 *Amazon Route 53 개발자 안내서*의 [프라이빗 호스팅 영역 생성](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zone-private-creating.html)을 참조하세요.

**이름**에는 프라이빗 사용자 지정 도메인 이름의 이름을 사용합니다. **VPC ID**의 경우 도메인 이름 액세스 연결에 사용한 VPC 엔드포인트가 포함된 VPC를 사용합니다.

------
#### [ AWS CLI ]

다음 [create-hosted-zone](https://docs.aws.amazon.com/cli/latest/reference/route53/create-hosted-zone.html) 명령은 프라이빗 호스팅 영역을 생성합니다.

```
aws route53 create-hosted-zone --name private.example.com \
    --caller-reference 2014-04-01-18:47 \
    --hosted-zone-config Comment="command-line version",PrivateZone=true \
    --vpc VPCRegion=us-west-2,VPCId=vpc-abcd1234
```

출력에는 호스팅 영역 ID가 포함됩니다. 다음 단계에서 호스팅 영역 ID를 사용합니다.

------

## Route 53 DNS 레코드 생성
<a name="apigateway-private-custom-domains-consumer-create-route-53-record"></a>

호스팅 영역을 생성한 후 프라이빗 사용자 지정 도메인을 확인하는 레코드를 생성합니다. 이 예제에서는 A 레코드 유형을 생성합니다. VPC 엔드포인트에 IPv6를 사용하는 경우 AAAA 레코드 유형을 생성합니다. VPC 엔드포인트에 듀얼 스택을 사용하는 경우 AAAA 및 A 레코드 유형을 모두 생성합니다.

------
#### [ AWS Management Console ]

AWS Management Console을 사용하려면 [도메인 이름을 사용하여 Amazon API Gateway API로 트래픽 라우팅](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-api-gateway.html)을 참조하세요.

**빠른 생성**을 사용하고 **별칭**을 켭니다. 엔드포인트의 경우 VPC 엔드포인트 DNS 이름을 사용합니다.

------
#### [ AWS CLI ]

프라이빗 사용자 지정 도메인 이름을 지정된 호스팅 영역 ID의 호스트 이름으로 매핑하도록 DNS 레코드를 구성하려면 먼저 프라이빗 도메인 이름에 대해 DNS 레코드를 설정하기 위한 구성을 포함하는 JSON 파일을 생성합니다.

다음 `setup-dns-record.json`에서는 프라이빗 사용자 지정 도메인 이름을 프라이빗 호스트 이름에 매핑하기 위해 DNS `A` 레코드를 생성하는 방법을 보여줍니다. VPC DNS ID의 `DNSName`과 이전 단계에서 생성한 호스팅 영역 ID를 제공합니다.

```
{
  "Changes": [
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "private.example.com",
        "Type": "A",
        "AliasTarget": {
          "DNSName": "vpce-abcd1234.execute-api.us-west-2.vpce.amazonaws.com",
          "HostedZoneId": "Z2OJLYMUO9EFXC",
          "EvaluateTargetHealth": false
        }
      }
    }
  ]
}
```

다음 [change-resource-record-sets](https://docs.aws.amazon.com/cli/latest/reference/route53/change-resource-record-sets.html) 명령은 프라이빗 사용자 지정 도메인 이름에 대한 DNS 레코드를 생성합니다.

```
aws route53 change-resource-record-sets \
    --hosted-zone-id ZABCDEFG1234 \
    --change-batch file://path/to/your/setup-dns-record.json
```

`hosted-zone-id`를 계정에 설정된 DNS 레코드의 Route 53 호스팅 영역 ID로 교체합니다. `change-batch` 파라미터 값은 JSON 파일을 가리킵니다.

------

## API 소비자를 위한 다음 단계
<a name="apigateway-private-custom-domains-consumer-next-steps"></a>

이제 자체 AWS 계정에서 프라이빗 API를 간접적으로 호출할 수 있습니다. VPC에서 다음 curl 명령을 사용하여 프라이빗 사용자 지정 도메인 이름에 액세스할 수 있습니다.

```
curl https://private.example.com/v1
```

프라이빗 API를 간접적으로 호출하는 다른 방법에 대한 자세한 내용은 [사용자 지정 도메인 이름을 사용하여 프라이빗 API를 간접적으로 호출](apigateway-private-api-test-invoke-url.md#apigateway-private-custom-domains-provider-invoke) 섹션을 참조하세요.

# API 소비자: 프라이빗 사용자 지정 도메인 이름과의 도메인 이름 액세스 연결 삭제
<a name="apigateway-private-custom-domains-consumer-delete-domain-name-access-association"></a>

API 소비자인 경우 언제든지 액세스 연결 리소스를 삭제할 수 있습니다. API 공급자는 도메인 이름 액세스 연결을 삭제할 수 없습니다.

도메인 이름 액세스 연결을 더 이상 사용하지 않을 때는 항상 삭제하는 것이 좋습니다.

------
#### [ AWS Management Console ]

**도메인 이름 액세스 연결을 삭제하려면**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)에서 API Gateway 콘솔에 로그인합니다.

1. 기본 탐색 창에서 **도메인 이름 액세스 연결**을 선택합니다.

1. 도메인 이름 액세스 연결을 선택한 다음 **삭제**를 선택합니다.

1. 해당 선택을 확인한 다음, **삭제**를 선택합니다.

------
#### [ AWS CLI ]

다음 `delete-access-association` 명령은 액세스 연결을 삭제합니다.

```
aws apigateway delete-domain-name-access-association \
    --domain-name-access-association-arn 'arn:aws:apigateway:us-west-2:444455556666:/domainnameaccessassociations/domainname/private.example.com+abcd1234/vpcesource/vpce-abcd1234efg'
```

------

# CloudFormation을 사용하여 프라이빗 API에 대한 사용자 지정 도메인 이름 생성
<a name="apigateway-private-custom-domains-cfn"></a>

다음 예제 CloudFormation 템플릿은 프라이빗 API와 프라이빗 사용자 지정 도메인 이름을 생성하고 프라이빗 API를 사용자 지정 도메인 이름에 매핑한 다음 도메인 이름 액세스 연결을 생성합니다. 자체 VPC 엔드포인트, 도메인 이름 및 인증서 ARN을 제공해야 합니다.

다음 고려 사항은 프라이빗 사용자 지정 도메인 이름을 생성하기 위한 CloudFormation 사용에 영향을 미칠 수 있습니다.
+ CloudFormation을 사용하여 도메인 이름 액세스 연결을 거부할 수 없습니다. 도메인 이름 액세스 연결을 거부하려면 AWS CLI를 사용합니다.
+ `AWS::ApiGateway::DomainNameV2` CloudFormation 속성을 사용하여 프라이빗 사용자 지정 도메인 이름을 생성합니다.
+ `AWS::ApiGateway:BasePathMappingV2` CloudFormation 속성을 사용하여 기본 경로 매핑을 생성합니다.

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  EndpointID:
    Type: String
    Default: vpce-abcd1234567efg
    Description: A VPC endpoint with enableDnsHostnames and enableDnsSupport set to true.
  DomainName:
    Type: String
    Default: private.example.com
    Description: A domain name that you own.
  CertificateArn:
    Type: String
    Default: arn:aws:acm:us-west-2:123456789:certificate/abcd-000-1234-0000-000000abcd
    Description: An ACM certificate that covers the domain name.
Resources:
  PrivateApi:
    Type: 'AWS::ApiGateway::RestApi'
    Properties:
      EndpointConfiguration:
        Types:
          - PRIVATE
        VpcEndpointIds:
          - !Ref EndpointID
      Name: private-api
      Policy:
        Statement:
          - Action: 'execute-api:Invoke'
            Effect: Allow
            Principal: '*'
            Resource: 'execute-api:/*'
          - Action: 'execute-api:Invoke'
            Condition:
              StringNotEquals:
                'aws:SourceVpce': !Ref EndpointID
            Effect: Deny
            Principal: '*'
            Resource: 'execute-api:/*'
        Version: 2012-10-17		 	 	 
  PrivateApiDeployment:
    Type: 'AWS::ApiGateway::Deployment'
    Properties:
      RestApiId: !Ref PrivateApi
      Description: Private API deployment
    DependsOn:
      - PrivateApiMethod
  PrivateApiStage:
    Type: 'AWS::ApiGateway::Stage'
    Properties:
      RestApiId: !Ref PrivateApi
      DeploymentId: !Ref PrivateApiDeployment
      StageName: prod
  PrivateApiMethod: 
    Type: 'AWS::ApiGateway::Method'
    Properties:
      HttpMethod: ANY
      ResourceId: !GetAtt PrivateApi.RootResourceId
      RestApiId: !Ref PrivateApi
      AuthorizationType: NONE
      Integration:
        Type: MOCK
        RequestTemplates:
          application/json: "{\"statusCode\": 200}"
        IntegrationResponses:
          - StatusCode: '200'
      MethodResponses:
        - StatusCode: '200'
  PrivateDomainName:
    Type: AWS::ApiGateway::DomainNameV2
    Properties:
      DomainName: !Ref DomainName
      CertificateArn: !Ref CertificateArn
      EndpointConfiguration:
        Types:
          - PRIVATE
      SecurityPolicy: TLS_1_2
      Policy:
        Statement:
            - Action: 'execute-api:Invoke'
              Effect: Allow
              Principal: '*'
              Resource: 'execute-api:/*'
            - Action: 'execute-api:Invoke'
              Condition:
                StringNotEquals:
                  'aws:SourceVpce': !Ref EndpointID
              Effect: Deny
              Principal: '*'
              Resource: 'execute-api:/*'
        Version: 2012-10-17		 	 	 
  PrivateBasePathMapping:
    Type: AWS::ApiGateway::BasePathMappingV2
    DependsOn:
      - PrivateApiStage
    Properties:
      BasePath: prod
      DomainNameArn: !GetAtt PrivateDomainName.DomainNameArn
      RestApiId: !Ref PrivateApi
      Stage: prod
  DomainNameAccessAssociation: 
    Type: AWS::ApiGateway::DomainNameAccessAssociation
    Properties:
      DomainNameArn: !GetAtt PrivateDomainName.DomainNameArn
      AccessAssociationSource: !Ref EndpointID
      AccessAssociationSourceType: VPCE
```