

# Amazon Aurora용 사용자 지정 엔드포인트의 AWS CLI 예제
<a name="Aurora.Endpoint.Tutorial"></a>

다음 자습서에서는 Unix 쉘 구문과 함께 AWS CLI 예제를 사용하여 여러 '작은' DB 인스턴스와 몇 개의 '큰' DB 인스턴스가 있는 클러스터를 정의하고, 사용자 지정 엔드포인트를 만들어 각 DB 인스턴스 집합에 연결할 수 있는 방법을 보여줍니다. 자체 시스템에서 비슷한 명령을 실행하려면 리전, 서브넷 그룹, VPC 보안 그룹 등의 파라미터에 자체 값을 제공할 수 있도록 Aurora 클러스터와 AWS CLI 사용법의 기본을 충분히 숙지한 상태여야 합니다.

이 예제에서는 초기 설정 단계인 Aurora 클러스터 만들기와 클러스터에 DB 인스턴스 추가하기를 보여 줍니다. 이는 다른 유형의 클러스터로, 모든 DB 인스턴스의 용량이 같지 않음을 뜻합니다. 대부분의 인스턴스는 AWS 인스턴스 클래스 `db.r4.4xlarge`를 사용하지만, 마지막 두 DB 인스턴스는 `db.r4.16xlarge`를 사용합니다. 이러한 각 샘플 `create-db-instance` 명령은 화면에 출력을 인쇄하고 나중에 검사하기 위해 파일에 JSON 복사본을 저장합니다.

```
aws rds create-db-cluster --db-cluster-identifier custom-endpoint-demo --engine aurora-mysql \
     --engine-version 8.0.mysql_aurora.3.04.0 --master-username $MASTER_USER --manage-master-user-password \
     --db-subnet-group-name $SUBNET_GROUP  --vpc-security-group-ids $VPC_SECURITY_GROUP \
     --region $REGION

for i in 01 02 03 04 05 06 07 08
do
  aws rds create-db-instance --db-instance-identifier custom-endpoint-demo-${i} \
     --engine aurora --db-cluster-identifier custom-endpoint-demo --db-instance-class db.r4.4xlarge \
     --region $REGION \
     | tee custom-endpoint-demo-${i}.json
done

for i in 09 10
do
  aws rds create-db-instance --db-instance-identifier custom-endpoint-demo-${i} \
     --engine aurora --db-cluster-identifier custom-endpoint-demo --db-instance-class db.r4.16xlarge \
     --region $REGION \
     | tee custom-endpoint-demo-${i}.json
done
```

더 큰 인스턴스는 특수한 종류의 쿼리 보고를 위해 예약되어 있습니다. 다음 예제에서는 이러한 인스턴스가 기본 인스턴스로 승격될 가능성이 없도록 해당 인스턴스의 승격 티어를 가장 낮은 우선 순위로 변경합니다. 이 예제에서는 마스터 사용자 암호를 생성하고 이를 Secrets Manager에서 관리하는 `--manage-master-user-password` 옵션을 지정합니다. 자세한 내용은 [Amazon Aurora 및 AWS Secrets Manager를 통한 암호 관리](rds-secrets-manager.md) 섹션을 참조하세요. 또는 `--master-password` 옵션을 사용하여 암호를 직접 지정하고 관리할 수 있습니다.

```
for i in 09 10
do
  aws rds modify-db-instance --db-instance-identifier custom-endpoint-demo-${i} \
    --region $REGION --promotion-tier 15
done
```

리소스를 가장 많이 사용하는 쿼리에만 “더 큰” 인스턴스 두 개를 사용하려고 한다고 가정하겠습니다. 이렇게 하려면 먼저 사용자 지정 읽기 전용 엔드포인트를 만든 후, 엔드포인트가 그러한 DB 인스턴스에만 연결되도록 정적 멤버 목록을 추가할 수 있습니다. 그러한 인스턴스는 이미 가장 낮은 승격 티어에 있으므로, 어느 인스턴스도 기본 인스턴스로 승격될 가능성이 낮습니다. 두 인스턴스 중 하나가 기본 인스턴스로 승격된 경우, `READER` 유형 대신에 `ANY` 유형으로 지정했으므로 이 엔드포인트를 통해 해당 인스턴스에 접근할 수 없게 됩니다.

다음 예제에서는 엔드포인트 생성 및 수정 명령과, 사용자 지정 엔드포인트의 초기 및 수정된 상태가 나와 있는 샘플 JSON 출력을 보여 줍니다.

```
$ aws rds create-db-cluster-endpoint --region $REGION \
    --db-cluster-identifier custom-endpoint-demo \
    --db-cluster-endpoint-identifier big-instances --endpoint-type reader
{
    "EndpointType": "CUSTOM",
    "Endpoint": "big-instances.cluster-custom-c7tj4example.ca-central-1.rds.amazonaws.com",
    "DBClusterEndpointIdentifier": "big-instances",
    "DBClusterIdentifier": "custom-endpoint-demo",
    "StaticMembers": [],
    "DBClusterEndpointResourceIdentifier": "cluster-endpoint-W7PE3TLLFNSHXQKFU6J6NV5FHU",
    "ExcludedMembers": [],
    "CustomEndpointType": "READER",
    "Status": "creating",
    "DBClusterEndpointArn": "arn:aws:rds:ca-central-1:111122223333:cluster-endpoint:big-instances"
}

$ aws rds modify-db-cluster-endpoint --db-cluster-endpoint-identifier big-instances \
    --static-members custom-endpoint-demo-09 custom-endpoint-demo-10 --region $REGION
{
    "EndpointType": "CUSTOM",
    "ExcludedMembers": [],
    "DBClusterEndpointIdentifier": "big-instances",
    "DBClusterEndpointResourceIdentifier": "cluster-endpoint-W7PE3TLLFNSHXQKFU6J6NV5FHU",
    "CustomEndpointType": "READER",
    "DBClusterEndpointArn": "arn:aws:rds:ca-central-1:111122223333:cluster-endpoint:big-instances",
    "StaticMembers": [
        "custom-endpoint-demo-10",
        "custom-endpoint-demo-09"
    ],
    "Status": "modifying",
    "Endpoint": "big-instances.cluster-custom-c7tj4example.ca-central-1.rds.amazonaws.com",
    "DBClusterIdentifier": "custom-endpoint-demo"
}
```

클러스터의 기본 `READER` 엔드포인트는 '작거나' '큰' DB 인스턴스에 연결될 수 있으므로, 클러스터가 사용 중일 때 쿼리 성능과 확장성을 예측하는 것은 어렵습니다. DB 인스턴스 집합 간에 워크로드를 깔끔하게 나누려면 기본 `READER` 엔드포인트를 무시하고 다른 모든 DB 인스턴스에 연결되는 두 번째 사용자 지정 엔드포인트를 만들면 됩니다. 다음 예제에서는 사용자 지정 엔드포인트를 만든 후 제외 목록을 추가하여 이를 수행합니다. 클러스터에 나중에 추가하는 다른 모든 DB 인스턴스는 이 엔드포인트에 자동으로 추가됩니다. `ANY` 유형은 이 엔드포인트가 총 여덟 개의 인스턴스(기본 인스턴스 하나와 Aurora 복제본 일곱 개)와 연결되어 있음을 뜻합니다. 이 예제에서 `READER` 유형을 사용한 경우, 사용자 지정 엔드포인트는 Aurora 복제본 일곱 개에만 연결됩니다.

```
$ aws rds create-db-cluster-endpoint --region $REGION --db-cluster-identifier custom-endpoint-demo \
    --db-cluster-endpoint-identifier small-instances --endpoint-type any
{
    "Status": "creating",
    "DBClusterEndpointIdentifier": "small-instances",
    "CustomEndpointType": "ANY",
    "EndpointType": "CUSTOM",
    "Endpoint": "small-instances.cluster-custom-c7tj4example.ca-central-1.rds.amazonaws.com",
    "StaticMembers": [],
    "ExcludedMembers": [],
    "DBClusterIdentifier": "custom-endpoint-demo",
    "DBClusterEndpointArn": "arn:aws:rds:ca-central-1:111122223333:cluster-endpoint:small-instances",
    "DBClusterEndpointResourceIdentifier": "cluster-endpoint-6RDDXQOC3AKKZT2PRD7ST37BMY"
}

$ aws rds modify-db-cluster-endpoint --db-cluster-endpoint-identifier small-instances \
    --excluded-members custom-endpoint-demo-09 custom-endpoint-demo-10 --region $REGION
{
    "DBClusterEndpointIdentifier": "small-instances",
    "DBClusterEndpointArn": "arn:aws:rds:ca-central-1:c7tj4example:cluster-endpoint:small-instances",
    "DBClusterEndpointResourceIdentifier": "cluster-endpoint-6RDDXQOC3AKKZT2PRD7ST37BMY",
    "CustomEndpointType": "ANY",
    "Endpoint": "small-instances.cluster-custom-c7tj4example.ca-central-1.rds.amazonaws.com",
    "EndpointType": "CUSTOM",
    "ExcludedMembers": [
        "custom-endpoint-demo-09",
        "custom-endpoint-demo-10"
    ],
    "StaticMembers": [],
    "DBClusterIdentifier": "custom-endpoint-demo",
    "Status": "modifying"
}
```

다음 예제에서는 이 클러스터의 엔드포인트 상태를 확인합니다. 클러스터에 여전히 `EndPointType`이 `WRITER`인 원래 클러스터 엔드포인트가 있으며, 관리, ETL 및 기타 쓰기 작업에 여전히 이 엔드포인트를 사용합니다. 여전히 원래 `READER` 엔드포인트가 있는데, 이 엔드포인트로의 각 연결을 '작거나' '큰' DB 인스턴스로 보낼 수 있으므로 이 인스턴스를 사용하지 않습니다. 사용자 지정 엔드포인트는 이 동작을 예측 가능하게 합니다. 지정한 엔드포인트를 기반으로 '작거나' '큰' DB 인스턴스 중 하나를 사용하도록 연결이 보장되어 있기 때문입니다.

```
$ aws rds describe-db-cluster-endpoints --region $REGION
{
    "DBClusterEndpoints": [
        {
            "EndpointType": "WRITER",
            "Endpoint": "custom-endpoint-demo.cluster-c7tj4example.ca-central-1.rds.amazonaws.com",
            "Status": "available",
            "DBClusterIdentifier": "custom-endpoint-demo"
        },
        {
            "EndpointType": "READER",
            "Endpoint": "custom-endpoint-demo.cluster-ro-c7tj4example.ca-central-1.rds.amazonaws.com",
            "Status": "available",
            "DBClusterIdentifier": "custom-endpoint-demo"
        },
        {
            "Endpoint": "small-instances.cluster-custom-c7tj4example.ca-central-1.rds.amazonaws.com",
            "CustomEndpointType": "ANY",
            "DBClusterEndpointArn": "arn:aws:rds:ca-central-1:111122223333:cluster-endpoint:small-instances",
            "ExcludedMembers": [
                "custom-endpoint-demo-09",
                "custom-endpoint-demo-10"
            ],
            "DBClusterEndpointResourceIdentifier": "cluster-endpoint-6RDDXQOC3AKKZT2PRD7ST37BMY",
            "DBClusterIdentifier": "custom-endpoint-demo",
            "StaticMembers": [],
            "EndpointType": "CUSTOM",
            "DBClusterEndpointIdentifier": "small-instances",
            "Status": "modifying"
        },
        {
            "Endpoint": "big-instances.cluster-custom-c7tj4example.ca-central-1.rds.amazonaws.com",
            "CustomEndpointType": "READER",
            "DBClusterEndpointArn": "arn:aws:rds:ca-central-1:111122223333:cluster-endpoint:big-instances",
            "ExcludedMembers": [],
            "DBClusterEndpointResourceIdentifier": "cluster-endpoint-W7PE3TLLFNSHXQKFU6J6NV5FHU",
            "DBClusterIdentifier": "custom-endpoint-demo",
            "StaticMembers": [
                "custom-endpoint-demo-10",
                "custom-endpoint-demo-09"
            ],
            "EndpointType": "CUSTOM",
            "DBClusterEndpointIdentifier": "big-instances",
            "Status": "available"
        }
    ]
}
```

마지막 예제에서는 사용자 지정 엔드포인트로의 연속적인 데이터베이스 연결이 Aurora 클러스터의 다양한 DB 인스턴스에 연결되는 방법을 보여 줍니다. `small-instances` 엔드포인트는 항상 이 클러스터에서 낮은 번호의 호스트인 `db.r4.4xlarge` DB 인스턴스에 연결됩니다.

```
$ mysql -h small-instances.cluster-custom-c7tj4example.ca-central-1.rds.amazonaws.com -u $MYUSER -p
mysql> select @@aurora_server_id;
+-------------------------+
| @@aurora_server_id      |
+-------------------------+
| custom-endpoint-demo-02 |
+-------------------------+

$ mysql -h small-instances.cluster-custom-c7tj4example.ca-central-1.rds.amazonaws.com -u $MYUSER -p
mysql> select @@aurora_server_id;
+-------------------------+
| @@aurora_server_id      |
+-------------------------+
| custom-endpoint-demo-07 |
+-------------------------+

$ mysql -h small-instances.cluster-custom-c7tj4example.ca-central-1.rds.amazonaws.com -u $MYUSER -p
mysql> select @@aurora_server_id;
+-------------------------+
| @@aurora_server_id      |
+-------------------------+
| custom-endpoint-demo-01 |
+-------------------------+
```

`big-instances` 엔드포인트는 항상 이 클러스터에서 가장 높은 번호의 두 호스트인 `db.r4.16xlarge` DB 인스턴스에 연결됩니다.

```
$ mysql -h big-instances.cluster-custom-c7tj4example.ca-central-1.rds.amazonaws.com -u $MYUSER -p
mysql> select @@aurora_server_id;
+-------------------------+
| @@aurora_server_id      |
+-------------------------+
| custom-endpoint-demo-10 |
+-------------------------+

$ mysql -h big-instances.cluster-custom-c7tj4example.ca-central-1.rds.amazonaws.com -u $MYUSER -p
mysql> select @@aurora_server_id;
+-------------------------+
| @@aurora_server_id      |
+-------------------------+
| custom-endpoint-demo-09 |
+-------------------------+
```