RDS 프록시 시작하기 - Amazon Relational Database Service

RDS 프록시 시작하기

다음 섹션에서는 RDS 프록시 설정 및 관리 방법을 찾을 수 있습니다. 관련 보안 옵션을 설정하는 방법도 찾을 수 있습니다. 이 옵션은 각 프록시에 액세스할 수 있는 사용자 및 각 프록시가 DB 인스턴스에 연결하는 방법을 제어합니다.

네트워크 사전 조건 설정

RDS 프록시를 사용하려면 RDS DB 인스턴스와 RDS 프록시 간에 공통의 Virtual Private Cloud(VPC)가 있어야 합니다. 이 VPC에는 서로 다른 가용 영역에 있는 최소 2개의 서브넷이 있어야 합니다. 계정은 이러한 서브넷을 소유하거나 다른 계정과 공유할 수 있습니다. VPC 공유에 대한 자세한 내용은 공유 VPC 작업을 참조하세요.

Amazon EC2, Lambda 또는 Amazon ECS와 같은 클라이언트 애플리케이션 리소스는 프록시와 동일한 VPC에 있을 수 있습니다. 또는 프록시와 별도의 VPC에 있을 수도 있습니다. RDS DB 인스턴스에 성공적으로 연결했다면 필요한 네트워크 리소스가 이미 있는 것입니다.

서브넷에 대한 정보 가져오기

프록시를 만들려면 프록시가 작동하는 서브넷과 VPC를 제공해야 합니다. 다음 Linux 예에서는 AWS 계정에서 소유한 VPC 및 서브넷을 검사하는 AWS CLI 명령을 보여줍니다. 특히 CLI를 사용하여 프록시를 생성할 경우 서브넷 ID를 파라미터로 전달합니다.

aws ec2 describe-vpcs aws ec2 describe-internet-gateways aws ec2 describe-subnets --query '*[].[VpcId,SubnetId]' --output text | sort

다음 Linux 예시에서는 특정 RDS DB 인스턴스에 해당하는 서브넷 ID를 확인하는 AWS CLI 명령을 보여줍니다. DB 인스턴스의 VPC ID를 찾습니다. VPC를 검사하여 서브넷을 찾습니다. 다음 Linux 예제에서는 그 방법을 보여 줍니다.

$ #From the DB instance, trace through the DBSubnetGroup and Subnets to find the subnet IDs. $ aws rds describe-db-instances --db-instance-identifier my_instance_id --query '*[].[DBSubnetGroup]|[0]|[0]|[Subnets]|[0]|[*].SubnetIdentifier' --output text
subnet_id_1 subnet_id_2 subnet_id_3 ...
$ #From the DB instance, find the VPC. $ aws rds describe-db-instances --db-instance-identifier my_instance_id --query '*[].[DBSubnetGroup]|[0]|[0].VpcId' --output text
my_vpc_id
$ aws ec2 describe-subnets --filters Name=vpc-id,Values=my_vpc_id --query '*[].[SubnetId]' --output text
subnet_id_1 subnet_id_2 subnet_id_3 subnet_id_4 subnet_id_5 subnet_id_6

IP 주소 용량 계획

RDS 프록시는 등록된 DB 인스턴스의 크기 및 수를 기준으로 필요에 따라 용량을 자동으로 조정합니다. 등록된 데이터베이스 또는 내부 RDS 프록시 유지 관리 작업의 크기를 늘리는 것과 같은 특정 작업의 경우 프록시 용량을 늘려야 할 수 있습니다. 이러한 작업 중에 프록시에 추가 용량을 프로비저닝하기 위해 더 많은 IP 주소가 필요할 수 있습니다. 이러한 추가 주소를 사용하면 워크로드에 영향을 주지 않고 프록시를 확장할 수 있습니다. 서브넷에 사용 가능한 IP 주소가 부족하면 프록시가 스케일 업되지 않을 수 있습니다. 이로 인해 쿼리 지연 시간이 길어지거나 클라이언트 연결이 실패할 수 있습니다. RDS는 서브넷에 사용 가능한 IP 주소가 충분하지 않을 경우 RDS-EVENT-0243 이벤트를 통해 알려줍니다. 이 이벤트에 대한 자세한 내용은 RDS 프록시 이벤트 작업 섹션을 참조하세요.

다음은 DB 인스턴스 클래스 크기를 기준으로 프록시의 서브넷에 남겨 두도록 권장하는 IP 주소의 최소 개수입니다.

DB 인스턴스 클래스 여유 IP 주소 최소 개수

db.*.xlarge 이하

10

db.*.2xlarge

15

db.*.4xlarge

25

db.*.8xlarge

45

db.*.12xlarge

60

db.*.16xlarge

75

db.*.24xlarge

110

이러한 권장 IP 주소 수는 기본 엔드포인트만 있는 프록시에 대한 예상 개수입니다. 추가 엔드포인트 또는 읽기 전용 복제본이 있는 프록시에는 여유 IP 주소가 더 필요할 수 있습니다. 각 추가 엔드포인트에 대해 IP 주소를 세 개 더 예약하는 것이 좋습니다. 각 읽기 전용 복제본에 대해 해당 읽기 전용 복제본의 크기를 기준으로 테이블에 지정된 대로 추가 IP 주소를 예약하는 것이 좋습니다.

참고

RDS 프록시는 하나의 VPC 내에서 IP 주소를 215개 이상 지원하지 않습니다.

AWS Secrets Manager에서 데이터베이스 자격 증명 설정

생성하는 각 프록시에 대해 먼저 Secrets Manager 서비스를 사용하여 사용자 이름 및 암호 자격 증명 집합을 저장합니다. 프록시가 RDS DB 인스턴스에서 연결하는 각 데이터베이스 사용자 계정에 대해 별도의 Secrets Manager 암호를 만듭니다.

Secrets Manager 콘솔에서는 usernamepassword 필드에 대한 값을 사용하여 이러한 보안 암호를 만듭니다. 이렇게 하면 프록시가 프록시와 연결된 RDS DB 인스턴스에서 해당 데이터베이스 사용자에게 연결할 수 있습니다. 이렇게 하려면 다른 데이터베이스 자격 증명, RDS 데이터베이스 자격 증명 또는 다른 유형의 비밀 설정을 사용할 수 있습니다. 사용자 이름암호 필드에 적절한 값을 입력하고 다른 필수 필드의 값을 입력합니다. 비밀에 호스트포트 같은 다른 필드가 존재하는 경우 프록시는 이를 무시합니다. 이러한 세부 정보는 프록시에서 자동으로 제공합니다.

다른 유형의 비밀을 선택할 수도 있습니다. 이 경우 usernamepassword라는 키를 사용하여 비밀을 만듭니다.

프록시에서 사용하는 암호는 특정 데이터베이스 서버에 연결되지 않으므로 여러 프록시에서 암호를 다시 사용할 수 있습니다. 이렇게 하려면 여러 데이터베이스 서버에서 동일한 보안 인증 정보를 사용합니다. 예를 들어, 개발 및 테스트 서버에서 동일한 보안 인증 정보를 사용할 수 있습니다.

프록시를 통해 특정 데이터베이스 사용자로 연결하려면 보안 암호와 연결된 암호가 해당 사용자의 데이터베이스 암호와 일치하는지 확인합니다. 일치하지 않는 경우 Secrets Manager에서 연결된 비밀을 업데이트할 수 있습니다. 이 경우에도 비밀 자격 증명과 데이터베이스 암호가 일치하는 다른 계정에 연결할 수 있습니다.

참고

RDS for SQL Server의 경우 RDS 프록시에는 Secrets Manager에 암호가 있어야 합니다. 이 암호는 DB 인스턴스 데이터 정렬 설정과 관계없이 애플리케이션 코드의 대소문자를 구분합니다. 예를 들어, 애플리케이션에서 사용자 이름 'Admin' 또는 'admin'을 모두 사용할 수 있는 경우 'Admin'과 'admin' 모두에 대한 암호를 사용하여 프록시를 구성하세요. RDS 프록시는 클라이언트와 프록시 간의 인증 프로세스에서 대소문자를 구분하지 않는 사용자 이름을 수용하지 않습니다.

SQL Server의 콜레이션에 대한 자세한 내용은 Microsoft SQL Server 설명서를 참조하세요.

AWS CLI 또는 RDS API를 통해 프록시를 생성할 때 해당 암호의 Amazon 리소스 이름(ARN)을 지정합니다. 프록시가 액세스할 수 있는 모든 DB 사용자 계정에 지정합니다. AWS Management Console에서는 설명하는 이름으로 비밀을 선택합니다.

Secrets Manager에서 비밀을 생성하는 방법에 대한 자세한 내용은 Secrets Manager 설명서에서 비밀 생성 페이지를 참조하세요. 다음 기법 중 한 가지를 사용할 수 있습니다.

  • 콘솔에서 Secrets Manager를 사용합니다.

  • CLI를 사용하여 RDS Proxy에서 사용할 Secrets Manager 비밀을 만들려면 다음과 같은 명령을 사용합니다.

    aws secretsmanager create-secret --name "secret_name" --description "secret_description" --region region_name --secret-string '{"username":"db_user","password":"db_user_password"}'

예를 들어, 다음 명령은 이름이 adminapp-user인 두 데이터베이스 사용자에 대한 Secrets Manager 보안 암호를 생성합니다.

aws secretsmanager create-secret \ --name admin_secret_name --description "db admin user" \ --secret-string '{"username":"admin","password":"choose_your_own_password"}' aws secretsmanager create-secret \ --name proxy_secret_name --description "application user" \ --secret-string '{"username":"app-user","password":"choose_your_own_password"}'

AWS 계정이 소유한 암호를 확인하려면 다음과 같은 명령을 사용합니다.

aws secretsmanager list-secrets

CLI를 사용하여 프록시를 생성할 경우 하나 이상의 보안 정보에 대한 Amazon 리소스 이름(ARN)을 --auth 파라미터에 전달합니다. 다음 Linux 예제에서는 AWS 계정이 소유한 각 보안 정보의 이름과 ARN만 사용하여 보고서를 준비하는 방법을 보여 줍니다. 이 예에서는 --output table 버전 2에서 제공되는 AWS CLI 파라미터를 사용합니다. AWS CLI 버전 1을 사용하는 경우 --output text를 대신 사용합니다.

aws secretsmanager list-secrets --query '*[].[Name,ARN]' --output table

올바른 자격 증명을 올바른 형식으로 보아 정보에 저장했는지 확인하려면 다음과 같은 명령을 사용합니다. 암호의 약식 이름 또는 ARN을 your_secret_name으로 대체합니다.

aws secretsmanager get-secret-value --secret-id your_secret_name

출력에는 다음과 같이 JSON으로 인코딩된 값을 표시하는 행이 포함되어야 합니다.

"SecretString": "{\"username\":\"your_username\",\"password\":\"your_password\"}",

AWS Identity and Access Management(IAM) 정책 설정

Secrets Manager에서 비밀을 만든 후 해당 비밀에 액세스할 수 있는 IAM 정책을 생성합니다. IAM 사용에 대한 일반적인 정보는 Amazon RDS의 자격 증명 및 액세스 관리 섹션을 참조하세요.

작은 정보

IAM 콘솔을 사용하는 경우 다음 절차가 적용됩니다. AWS Management Console for RDS를 사용하는 경우 RDS에서 자동으로 IAM 정책을 생성할 수 있습니다. 이 경우 다음 절차를 건너뛸 수 있습니다.

프록시와 함께 사용할 Secrets Manager 비밀에 액세스하는 IAM 정책을 생성하려면
  1. IAM 콘솔에 로그인합니다. IAM 역할 생성에 설명된 대로 역할 생성 프로세스를 따르고, AWS 서비스에 대한 권한을 위임할 역할 생성을 선택합니다.

    신뢰할 수 있는 엔터티 유형에서 AWS 서비스를 선택합니다. 사용 사례 아래의 기타 AWS 서비스 사용 사례 드롭다운에서 RDS를 선택합니다. RDS – 데이터베이스에 역할 추가를 선택합니다.

  2. 새 역할의 경우 인라인 정책 추가 단계를 수행합니다. IAM 정책 편집과 동일한 일반 절차를 사용합니다. 다음 JSON을 JSON 텍스트 상자에 붙여 넣습니다. 자신의 계정 ID를 대체합니다. AWS에 대한 us-east-2 리전을 대체합니다. 생성한 보안 암호에 대한 Amazon 리소스 이름(ARN)을 대체합니다. IAM 정책 설명에서 KMS 키 지정을 확인하세요. kms:Decrypt 작업을 수행하려면 기본 AWS KMS key 또는 자체 KMS 키를 대체하세요. 무엇을 사용할지는 Secrets Manager 암호를 암호화하는 데 사용할 때 무엇을 사용했는지에 따라 달라집니다.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": [ "arn:aws:secretsmanager:us-east-2:account_id:secret:secret_name_1", "arn:aws:secretsmanager:us-east-2:account_id:secret:secret_name_2" ] }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": "kms:Decrypt", "Resource": "arn:aws:kms:us-east-2:account_id:key/key_id", "Condition": { "StringEquals": { "kms:ViaService": "secretsmanager.us-east-2.amazonaws.com" } } } ] }
  3. 이 IAM 역할에 대한 신뢰 정책을 편집합니다. 다음 JSON을 JSON 텍스트 상자에 붙여 넣습니다.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "rds.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

다음 명령은 AWS CLI를 통해 동일한 작업을 수행합니다.

PREFIX=my_identifier USER_ARN=$(aws sts get-caller-identity --query "Arn" --output text) aws iam create-role --role-name my_role_name \ --assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":["rds.amazonaws.com"]},"Action":"sts:AssumeRole"}]}' ROLE_ARN=arn:aws:iam::account_id:role/my_role_name aws iam put-role-policy --role-name my_role_name \ --policy-name $PREFIX-secret-reader-policy --policy-document '{"Version":"2012-10-17","Statement":[{"Sid":"getsecretvalue","Effect":"Allow","Action":["secretsmanager:GetSecretValue","kms:Decrypt"],"Resource":"*"}]}' aws kms create-key --description "$PREFIX-test-key" --policy '{ "Id":"$PREFIX-kms-policy", "Version":"2012-10-17", "Statement": [ { "Sid":"Enable IAM User Permissions", "Effect":"Allow", "Principal":{"AWS":"arn:aws::iam:account_id:root"}, "Action":"kms:*","Resource":"*" }, { "Sid":"Allow access for Key Administrators", "Effect":"Allow", "Principal": { "AWS": ["$USER_ARN","arn:aws::iam:account_id:role/Admin"] }, "Action": [ "kms:Create*", "kms:Describe*", "kms:Enable*", "kms:List*", "kms:Put*", "kms:Update*", "kms:Revoke*", "kms:Disable*", "kms:Get*", "kms:Delete*", "kms:TagResource", "kms:UntagResource", "kms:ScheduleKeyDeletion", "kms:CancelKeyDeletion" ], "Resource":"*" }, { "Sid":"Allow use of the key", "Effect":"Allow", "Principal":{"AWS":"$ROLE_ARN"}, "Action":["kms:Decrypt","kms:DescribeKey"], "Resource":"*" } ] }'

RDS 프록시 생성

지정된 DB 인스턴스 집합에 대한 연결을 관리하려면 프록시를 생성할 수 있습니다. 프록시를 RDS for MariaDB, RDS for Microsoft SQL Server, RDS for MySQL 또는 RDS for PostgreSQL DB 인스턴스와 연결할 수 있습니다.

프록시를 생성하려면
  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/rds/에서 Amazon RDS 콘솔을 엽니다.

  2. 탐색 창에서 Proxies(프록시)를 선택합니다.

  3. Create proxy(프록시 생성)를 선택합니다.

  4. 프록시에 대한 모든 설정을 선택합니다.

    프록시 구성의 경우 다음에 대한 정보를 제공합니다.

    • 엔진 패밀리. 이 설정은 프록시가 데이터베이스와 주고받는 네트워크 트래픽을 해석할 때 인식하는 데이터베이스 네트워크 프로토콜을 결정합니다. RDS for MariaDB 또는 RDS for MySQL에서 MariaDB and MySQL(MariaDB 및 MySQL)을 선택합니다. RDS for PostgreSQL에서는 PostgreSQL을 선택합니다. RDS for SQL Server의 경우 SQL 서버를 선택합니다.

    • Proxy identifier(프록시 식별자). AWS 계정 ID와 현재 AWS 리전에서 고유한 이름을 지정합니다.

    • Idle client connection timeout(유휴 클라이언트 연결 시간 초과). 프록시가 연결을 종료하기 전에 클라이언트 연결이 유휴 상태를 유지할 수 있는 기간을 선택합니다. 기본값은 1,800초(30분)입니다. 애플리케이션이 이전 요청이 완료된 후 지정된 시간 내에 새 요청을 제출하지 않으면 클라이언트 연결이 유휴 상태로 간주됩니다. 기본 데이터베이스 연결은 열린 상태를 유지하고 연결 풀로 반환됩니다. 따라서 새 클라이언트 연결에 다시 사용할 수 있습니다.

      프록시가 기간 경과 연결을 사전에 제거하도록 하려면 유휴 클라이언트 연결 제한 시간을 줄이면 됩니다. 워크로드가 급증하는 경우 연결 설정 비용을 절약하려면 유휴 클라이언트 연결 제한 시간을 늘려야 합니다."

    대상 그룹 구성의 경우 다음에 대한 정보를 제공합니다.

    • 데이터베이스. 이 프록시를 통해 액세스할 RDS DB 인스턴스를 하나 선택합니다. 이 목록에는 호환되는 데이터베이스 엔진, 엔진 버전 및 기타 설정이 있는 DB 인스턴스 또는 클러스터만 포함됩니다. 목록이 비어 있으면 RDS Proxy와 호환되는 새 DB 인스턴스 또는 클러스터를 생성합니다. 이 작업을 수행하려면 Amazon RDS DB 인스턴스 생성의 프로시저를 따르세요. 그런 다음 프록시를 다시 생성해보십시오.

    • Connection pool maximum connections(연결 풀 최대 연결). 1과 100 사이의 값을 지정합니다. 이 설정은 RDS Proxy가 연결에 사용할 수 있는 max_connections 값의 백분율을 나타냅니다. 이 DB 인스턴스 또는 클러스터에 하나의 프록시만 사용하려는 경우 이 값을 100으로 설정할 수 있습니다. RDS Proxy가 이 설정을 사용하는 방법에 대한 자세한 내용은 MaxConnectionsPercent 단원을 참조하십시오.

    • Session pinning filters(세션 고정 필터). (선택 사항) 이 옵션을 사용하면 RDS 프록시가 특정 유형의 감지된 세션 상태를 고정하지 않도록 할 수 있습니다. 이렇게 하면 클라이언트 연결 간 데이터베이스 연결을 멀티플렉싱하기 위한 기본 안전 조치를 우회할 수 있습니다. 현재 PostgreSQL에서는 설정이 지원되지 않습니다. EXCLUDE_VARIABLE_SETS만 선택할 수 있습니다.

      이 설정을 활성화하면 어떤 연결의 세션 변수가 다른 연결에 영향을 줄 수 있습니다. 쿼리가 현재 트랜잭션 외부에 설정된 세션 변수 값에 의존하는 경우 이로 인해 오류나 정확성 문제가 발생할 수 있습니다. 애플리케이션이 클라이언트 연결 간에 데이터베이스 연결을 공유해도 안전한지 확인한 후 이 옵션을 사용하는 것이 좋습니다.

      다음과 같은 패턴이 나타나면 안전한 상태로 간주될 수 있습니다.

      • 유효 세션 변수 값에 변경 사항이 없는 SET 명령문이 있습니다(즉 세션 변수에 변경 사항이 없는 경우).

      • 세션 변수 값을 변경하고 동일한 트랜잭션에서 명령문을 실행합니다.

      자세한 내용은 고정 방지 단원을 참조하십시오.

    • Connection borrow timeout(연결 대여 시간 초과). 경우에 따라 프록시가 사용 가능한 모든 데이터베이스 연결을 사용하는 경우가 있습니다. 이러한 경우 시간 초과 오류를 반환하기 전에 프록시가 데이터베이스 연결을 사용할 수 있을 때까지 기다리는 시간을 지정할 수 있습니다. 최대 5분까지 기간을 지정할 수 있습니다. 이 설정은 프록시가 이미 최대 연결 수를 사용 중인 경우에만 적용됩니다.

    • 초기화 쿼리. (선택 사항) 각 새 데이터베이스 접속을 열 때 실행할 프록시에 대한 하나 이상의 SQL 문을 지정할 수 있습니다. 이 설정은 일반적으로 각 연결에 표준 시간대 및 문자 집합과 같은 동일한 설정이 있는지 확인하기 위해 SET 문과 함께 사용됩니다. 여러 문의 경우 세미콜론을 구분 기호로 사용합니다. SET x=1, y=2와 같은 단일 SET 문에 여러 변수를 포함할 수도 있습니다.

    인증에서 다음 정보를 제공합니다.

    • IAM 역할. 앞서 선택한 Secrets Manager 비밀에 액세스할 수 있는 권한이 있는 IAM 역할을 선택합니다. 또는 AWS Management Console에서 새 IAM 역할을 생성할 수 있습니다.

    • Secrets Manager 보안 암호 프록시가 RDS DB 인스턴스에 액세스할 수 있는 데이터베이스 사용자 보안 인증 정보를 포함하는 Secrets Manager 보안 암호를 하나 이상 선택합니다.

    • 클라이언트 인증 유형. 프록시가 클라이언트로부터의 연결에 사용하는 인증 유형을 선택합니다. 선택 사항은 이 프록시와 연결된 모든 Secrets Manager 비밀에 적용됩니다. 보안 암호마다 다른 클라이언트 인증 유형을 지정해야 하는 경우 AWS CLI 또는 API를 대신 사용하여 프록시를 생성합니다.

    • IAM 인증. 프록시 연결에 대해 IAM 인증을 요구할지, 허용할지 아니면 허용하지 않을지 선택합니다. 허용 옵션은 RDS for SQL Server 프록시에만 유효합니다. 선택 사항은 이 프록시와 연결된 모든 Secrets Manager 비밀에 적용됩니다. 암호마다 다른 IAM 인증을 지정해야 하는 경우 AWS CLI 또는 API를 대신 사용하여 프록시를 생성합니다.

    연결성에 대해 다음에 대한 정보를 제공합니다.

    • 전송 계층 보안 필요. 프록시가 모든 클라이언트 연결에 TLS/SSL을 적용하도록 하려면 이 설정을 선택합니다. 프록시에 암호화된 연결 또는 암호화되지 않은 연결을 사용하는 경우 프록시는 기본 데이터베이스에 연결할 때 동일한 암호화 설정을 사용합니다.

    • 서브넷. 이 필드는 VPC와 연결된 모든 서브넷으로 미리 채워집니다. 이 프록시에 필요하지 않은 서브넷을 모두 제거합니다. 서브넷은 두 개 이상 남겨 두어야 합니다.

    추가 연결 구성을 제공합니다.

    • VPC 보안 그룹. 기존 VPC 보안 그룹을 선택합니다. 또는 AWS Management Console에서 새 보안 그룹을 생성할 수 있습니다. 애플리케이션이 프록시에 액세스할 수 있도록 인바운드 규칙을 구성해야 합니다. 또한 DB 대상의 트래픽을 허용하도록 아웃바운드 규칙을 구성해야 합니다.

      참고

      이 보안 그룹은 프록시에서 데이터베이스로의 연결을 허용해야 합니다. 동일한 보안 그룹이 애플리케이션에서 프록시로 수신하고 프록시에서 데이터베이스로 발신하는 데 사용됩니다. 예를 들어 데이터베이스와 프록시에 대해 동일한 보안 그룹을 사용한다고 가정합니다. 이 경우 해당 보안 그룹의 리소스가 동일한 보안 그룹의 다른 리소스와 통신할 수 있도록 지정해야 합니다.

      공유 VPC를 사용하는 경우 VPC에 대한 기본 보안 그룹이나 다른 계정에 속한 보안 그룹을 사용할 수 없습니다. 본인 계정에 속한 보안 그룹을 선택합니다. 없으면 새로 생성합니다. 이 제한 사항에 대한 자세한 내용은 공유 VPC 작업을 참조하세요.

      RDS는 고가용성을 보장하기 위해 여러 가용 영역에 프록시를 배포합니다. 이러한 프록시에 대해 AZ 간 통신을 활성화하려면 프록시 서브넷의 네트워크 액세스 제어 목록(ACL)에서 엔진 포트별 송신 및 모든 포트의 수신을 허용해야 합니다. 네트워크 ACL에 대한 자세한 내용은 네트워크 ACL을 사용하여 서브넷에 대한 트래픽 제어를 참조하세요. 프록시와 대상의 네트워크 ACL이 동일한 경우 소스가 VPC CIDR로 설정된 TCP 프로토콜 수신 규칙을 추가해야 합니다. 또한 소스가 VPC CIDR로 설정된 엔진 포트별 TCP 프로토콜 송신 규칙을 추가해야 합니다.

    (선택 사항) 고급 구성을 제공합니다.

    • Enable enhanced logging(고급 로깅 사용). 프록시 호환성 또는 성능 문제를 해결하려면 이 설정을 사용하도록 설정할 수 있습니다.

      이 설정을 사용하도록 설정하면 RDS Proxy는 SQL 문에 대한 자세한 정보를 로그에 포함합니다. 이 정보는 SQL 동작 또는 프록시 연결의 성능 및 확장성과 관련된 문제를 디버깅하는 데 도움이 됩니다. 디버그 정보에는 프록시를 통해 제출하는 SQL 문의 텍스트가 포함됩니다. 따라서 디버깅을 위해 또는 로그에 표시되는 중요한 정보를 보호하는 데 필요한 보안 조치가 있는 경우에만 해당 설정을 활성화합니다.

      프록시와 연결된 오버헤드를 최소화하기 위해 RDS Proxy에서는 이 설정을 사용하도록 설정한 후 24시간 후에 자동으로 끕니다. 특정 문제를 해결하려면 일시적으로 활성화합니다.

  5. Create proxy(프록시 생성)를 선택합니다.

AWS CLI를 사용하여 프록시를 생성하려면 다음 필수 파라미터와 함께 create-db-proxy 명령을 호출합니다.

  • --db-proxy-name

  • --engine-family

  • --role-arn

  • --auth

  • --vpc-subnet-ids

--engine-family 값은 대소문자를 구분합니다.

Linux, macOS, Unix:

aws rds create-db-proxy \ --db-proxy-name proxy_name \ --engine-family { MYSQL | POSTGRESQL | SQLSERVER } \ --auth ProxyAuthenticationConfig_JSON_string \ --role-arn iam_role \ --vpc-subnet-ids space_separated_list \ [--vpc-security-group-ids space_separated_list] \ [--require-tls | --no-require-tls] \ [--idle-client-timeout value] \ [--debug-logging | --no-debug-logging] \ [--tags comma_separated_list]

Windows의 경우:

aws rds create-db-proxy ^ --db-proxy-name proxy_name ^ --engine-family { MYSQL | POSTGRESQL | SQLSERVER } ^ --auth ProxyAuthenticationConfig_JSON_string ^ --role-arn iam_role ^ --vpc-subnet-ids space_separated_list ^ [--vpc-security-group-ids space_separated_list] ^ [--require-tls | --no-require-tls] ^ [--idle-client-timeout value] ^ [--debug-logging | --no-debug-logging] ^ [--tags comma_separated_list]

다음은 --auth 옵션의 JSON 값 예시입니다. 이 예시는 각 보안 암호에 서로 다른 클라이언트 인증 유형을 적용합니다.

[ { "Description": "proxy description 1", "AuthScheme": "SECRETS", "SecretArn": "arn:aws:secretsmanager:us-west-2:123456789123:secret/1234abcd-12ab-34cd-56ef-1234567890ab", "IAMAuth": "DISABLED", "ClientPasswordAuthType": "POSTGRES_SCRAM_SHA_256" }, { "Description": "proxy description 2", "AuthScheme": "SECRETS", "SecretArn": "arn:aws:secretsmanager:us-west-2:111122223333:seret/1234abcd-12ab-34cd-56ef-1234567890cd", "IAMAuth": "DISABLED", "ClientPasswordAuthType": "POSTGRES_MD5" }, { "Description": "proxy description 3", "AuthScheme": "SECRETS", "SecretArn": "arn:aws:secretsmanager:us-west-2:111122221111:secret/1234abcd-12ab-34cd-56ef-1234567890ef", "IAMAuth": "REQUIRED" } ]
작은 정보

--vpc-subnet-ids 파라미터에 사용할 서브넷 ID를 아직 모르는 경우, 네트워크 사전 조건 설정에서 서브넷 ID를 찾는 방법의 예를 참조하세요.

참고

보안 그룹은 프록시가 연결하는 데이터베이스에 대한 액세스를 허용해야 합니다. 동일한 보안 그룹이 애플리케이션에서 프록시로 수신하고 프록시에서 데이터베이스로 발신하는 데 사용됩니다. 예를 들어 데이터베이스와 프록시에 대해 동일한 보안 그룹을 사용한다고 가정합니다. 이 경우 해당 보안 그룹의 리소스가 동일한 보안 그룹의 다른 리소스와 통신할 수 있도록 지정해야 합니다.

공유 VPC를 사용하는 경우 VPC에 대한 기본 보안 그룹이나 다른 계정에 속한 보안 그룹을 사용할 수 없습니다. 본인 계정에 속한 보안 그룹을 선택합니다. 없으면 새로 생성합니다. 이 제한 사항에 대한 자세한 내용은 공유 VPC 작업을 참조하세요.

프록시에 적합한 연결을 생성하려면 register-db-proxy-targets 명령을 사용합니다. 대상 그룹 이름 default을 지정합니다. RDS Proxy는 각 프록시를 생성할 때 이 이름으로 대상 그룹을 자동으로 생성합니다.

aws rds register-db-proxy-targets --db-proxy-name value [--target-group-name target_group_name] [--db-instance-identifiers space_separated_list] # rds db instances, or [--db-cluster-identifiers cluster_id] # rds db cluster (all instances)

RDS 프록시를 생성하려면 Amazon RDS API 작업 CreateDBProxy를 호출합니다. AuthConfig 데이터 구조와 함께 파라미터를 전달합니다.

RDS Proxy는 각 프록시를 생성할 때 default라는 대상 그룹을 자동으로 생성합니다. RegisterDBProxyTargets 함수를 호출하여 RDS DB 인스턴스를 대상 그룹에 연결합니다.

RDS 프록시 보기

하나 이상의 RDS 프록시를 생성한 후 모든 프록시를 볼 수 있습니다. 이렇게 하면 구성 세부 정보를 검사하여 수정, 삭제 등의 작업을 수행할 항목을 선택할 수 있습니다.

데이터베이스 애플리케이션이 프록시를 사용하려면 연결 문자열에서 프록시 엔드포인트를 제공해야 합니다.

프록시를 보려면
  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/rds/에서 Amazon RDS 콘솔을 엽니다.

  2. AWS Management Console의 오른쪽 상단에서 RDS Proxy를 생성한 AWS 리전을 선택합니다.

  3. 탐색 창에서 Proxies(프록시)를 선택합니다.

  4. 세부 정보를 표시할 RDS 프록시의 이름을 선택합니다.

  5. 세부 정보 페이지의 대상 그룹 섹션에 프록시가 특정 RDS DB 인스턴스와 어떻게 연결되는지 표시됩니다. 기본 대상 그룹 페이지에 대한 링크를 따라 프록시와 데이터베이스 간 연결의 세부 정보를 볼 수 있습니다. 이 페이지에서는 프록시를 생성할 때 지정한 설정을 볼 수 있습니다. 여기에는 최대 연결 비율, 연결 대여 시간 초과, 엔진 패밀리, 세션 고정 필터 등이 포함됩니다.

CLI를 사용하여 프록시를 보려면 describe-db-proxy 명령을 사용합니다. 기본적으로 AWS 계정이 소유한 모든 프록시가 표시됩니다. 단일 프록시에 대한 세부 정보를 보려면 --db-proxy-name 파라미터와 함께 해당 이름을 지정합니다.

aws rds describe-db-proxies [--db-proxy-name proxy_name]

프록시와 연결된 다른 정보를 보려면 다음 명령을 사용합니다.

aws rds describe-db-proxy-target-groups --db-proxy-name proxy_name aws rds describe-db-proxy-targets --db-proxy-name proxy_name

프록시와 연결된 항목에 대한 자세한 내용을 보려면 다음 명령 시퀀스를 사용합니다.

  1. 프록시 목록을 얻으려면 describe-db-proxies를 실행합니다.

  2. 프록시에서 사용할 수 있는 최대 연결 비율과 같은 연결 파라미터를 표시하려면 describe-db-proxy-target-groups --db-proxy-name을 실행합니다. 프록시의 이름을 파라미터 값으로 사용합니다.

  3. 반환된 대상 그룹과 연결된 RDS DB 인스턴스의 세부 정보를 보려면 describe-db-proxy-targets를 실행합니다.

RDS API를 사용하여 프록시를 보려면 DescribeDBProxies 작업을 사용합니다. 이 작업은 DBProxy 데이터 형식의 값을 반환합니다.

프록시 연결 설정의 세부 정보를 보려면 DescribeDBProxyTargetGroups 작업을 사용하여 이 반환 값의 프록시 식별자를 사용합니다. 이 작업은 DBProxyTargetGroup 데이터 형식의 값을 반환합니다.

프록시와 연결된 RDS 인스턴스 또는 Aurora DB 클러스터를 보려면 DescribeDBProxyTargets 작업을 사용합니다. 이 작업은 DBProxyTarget 데이터 형식의 값을 반환합니다.

RDS Proxy를 통해 데이터베이스에 연결

프록시를 통해 또는 데이터베이스에 연결하여 RDS DB 인스턴스에 연결하는 방법은 일반적으로 동일합니다. 자세한 내용은 프록시 엔드포인트 개요 단원을 참조하십시오.

기본 인증을 사용하여 프록시에 연결

기본 인증을 사용하여 프록시에 연결하려면 다음 단계를 사용합니다.

  1. 프록시 엔드포인트를 찾습니다. AWS Management Console에서는 해당 프록시의 세부 정보 페이지에서 엔드포인트를 찾을 수 있습니다. AWS CLI에서는 describe-db-proxies 명령을 사용할 수 있습니다. 다음 예에서는 이 작업을 수행하는 방법을 보여줍니다.

    # Add --output text to get output as a simple tab-separated list. $ aws rds describe-db-proxies --query '*[*].{DBProxyName:DBProxyName,Endpoint:Endpoint}' [ [ { "Endpoint": "the-proxy.proxy-demo.us-east-1.rds.amazonaws.com", "DBProxyName": "the-proxy" }, { "Endpoint": "the-proxy-other-secret.proxy-demo.us-east-1.rds.amazonaws.com", "DBProxyName": "the-proxy-other-secret" }, { "Endpoint": "the-proxy-rds-secret.proxy-demo.us-east-1.rds.amazonaws.com", "DBProxyName": "the-proxy-rds-secret" }, { "Endpoint": "the-proxy-t3.proxy-demo.us-east-1.rds.amazonaws.com", "DBProxyName": "the-proxy-t3" } ] ]
  2. 클라이언트 애플리케이션의 연결 문자열에서 해당 엔드포인트를 호스트 파라미터로 지정합니다. 예를 들어 프록시 엔드포인트를 mysql -h 옵션 또는 psql -h 옵션의 값으로 지정합니다.

  3. 평소와 동일한 데이터베이스 사용자 이름과 암호를 제공합니다.

IAM 인증을 사용하여 프록시에 연결

RDS Proxy에서 IAM 인증을 사용하는 경우 일반 사용자 이름 및 암호로 인증하도록 데이터베이스 사용자를 설정합니다. IAM 인증은 Secrets Manager에서 사용자 이름 및 암호 자격 증명을 검색하는 RDS Proxy에 적용됩니다. RDS 프록시에서 기본 데이터베이스로의 연결은 IAM을 거치지 않습니다.

IAM 인증을 사용하여 RDS 프록시에 연결하려면 IAM 인증을 통해 RDS DB 인스턴스에 연결하는 것과 동일한 일반 연결 프로시저를 따르면 됩니다. IAM 사용에 대한 일반적인 정보는 Amazon RDS의 보안 섹션을 참조하세요.

RDS Proxy에 대한 IAM 사용의 주요 차이점은 다음과 같습니다.

  • 권한 부여 플러그인으로 각 개별 데이터베이스 사용자를 구성하지 않습니다. 데이터베이스 사용자는 여전히 데이터베이스 내에서 일반 사용자 이름과 암호를 가지고 있습니다. 이러한 사용자 이름과 암호를 포함하는 Secrets Manager 비밀을 설정하고 RDS Proxy가 Secrets Manager에서 자격 증명을 검색할 수 있는 권한을 부여합니다.

    IAM 인증은 클라이언트 프로그램과 프록시 간의 연결에 적용됩니다. 그런 다음 프록시는 Secrets Manager에서 검색된 사용자 이름 및 암호 자격 증명을 사용하여 데이터베이스에 대해 인증합니다.

  • 인스턴스, 클러스터 또는 리더 엔드포인트 대신 프록시 엔드포인트를 지정합니다. 프록시 엔드포인트에 대한 자세한 내용은 IAM 인증을 사용하여 DB 인스턴스에 연결 단원을 참조하십시오.

  • 직접 데이이터베이스 IAM 인증의 경우 데이터베이스 사용자를 선택적으로 선택하고 특수 인증 플러그인으로 식별되도록 구성합니다. 그런 다음 IAM 인증을 사용하여 해당 사용자에게 연결할 수 있습니다.

    프록시 사용 사례에서는 일부 사용자의 사용자 이름과 암호(기본 인증)가 포함된 암호를 프록시에 제공해야 합니다. 그런 다음 IAM 인증을 사용하여 프록시에 연결합니다. 여기서는 데이터베이스 엔드포인트가 아닌 프록시 엔드포인트로 인증 토큰을 생성하여 이를 수행합니다. 또한 제공한 암호의 사용자 이름 중 하나와 일치하는 사용자 이름을 사용합니다.

  • IAM 인증을 사용하여 프록시에 연결할 때는 전송 계층 보안(TLS)/보안 소켓 계층(SSL)을 사용해야 합니다.

IAM 정책을 수정하여 특정 사용자에게 프록시에 대한 액세스 권한을 부여할 수 있습니다. 예를 들면 다음과 같습니다.

"Resource": "arn:aws:rds-db:us-east-2:1234567890:dbuser:prx-ABCDEFGHIJKL01234/db_user"

Microsoft SQL Server를 사용하여 프록시에 연결할 때 고려할 사항

IAM 인증을 사용하여 프록시에 연결하는 경우에는 암호 필드를 사용하지 않습니다. 대신 토큰 필드에 각 데이터베이스 드라이버 유형에 적합한 토큰 속성을 제공합니다. 예를 들어, JDBC의 경우 accessToken 속성을 사용하고 ODBC의 경우 sql_copt_ss_access_token 속성을 사용합니다. 또는 .NET.SqlClient 드라이버의 AccessToken 속성을 사용합니다. 토큰 속성을 지원하지 않는 클라이언트에는 IAM 인증을 사용할 수 없습니다.

일부 조건에서는 프록시가 데이터베이스 연결을 공유할 수 없고 대신 클라이언트 애플리케이션의 프록시 연결을 전용 데이터베이스 연결에 고정할 수 있습니다. 이러한 조건에 대한 자세한 내용은 고정 방지를 참조하세요.

PostgreSQL을 사용하여 프록시에 연결할 때 고려할 사항

PostgreSQL의 경우 클라이언트가 PostgreSQL 데이터베이스에 대한 연결을 시작하면 시작 메시지를 전송합니다. 이 메시지에는 파라미터 이름과 값 문자열의 쌍이 포함됩니다. 자세한 내용은 PostgreSQL 설명서에서 PostgreSQL 메시지 형식StartupMessage를 참조하십시오.

RDS 프록시를 통해 연결할 때 시작 메시지에는 현재 인식되는 다음과 같은 파라미터가 포함될 수 있습니다.

  • user

  • database

  • replication

시작 메시지에는 다음과 같은 추가 런타임 파라미터가 포함될 수도 있습니다.

PostgreSQL 메시징에 대한 자세한 내용은 PostgreSQL 설명서의 프런트 엔드/백엔드 프로토콜을 참조하십시오.

PostgreSQL의 경우 JDBC를 사용한다면 고정을 피하기 위해 다음을 사용하는 것이 좋습니다.

  • 고정을 방지하려면 JDBC 연결 파라미터 assumeMinServerVersion9.0 이상으로 설정합니다. 이렇게 하면 SET extra_float_digits = 3을 실행할 때 JDBC 드라이버가 연결 시작 중에 추가 왕복을 수행하지 못합니다.

  • 고정을 방지하려면 JDBC 연결 파라미터 ApplicationNameany/your-application-name으로 설정합니다. 이렇게 하면 SET application_name = "PostgreSQL JDBC Driver"을 실행할 때 JDBC 드라이버가 연결 시작 중에 추가 왕복을 수행하지 못합니다. JDBC 파라미터는 ApplicationName이지만 PostgreSQL StartupMessage 파라미터는 application_name입니다.

자세한 내용은 고정 방지 단원을 참조하십시오. JDBC를 사용한 연결에 대한 자세한 내용은 PostgreSQL 설명서의 데이터베이스에 연결을 참조하십시오.