

# 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\"]}}}]}"
```

------