IT/AWS, DB

[AWS RDS] AWS Database

집에 가고싶어요 2024. 8. 26. 12:57
728x90

목차

  • 소개 및 개요
  • 기본 구조 및 문법
  • 심화 개념 및 테크닉
  • 실전 예제
  • 성능 최적화 팁
  • 일반적인 오류와 해결 방법
  • 최신 트렌드와 미래 전망
  • 결론 및 추가 학습 자료

소개 및 개요

안녕하세요. 오늘은 클라우드 데이터베이스 서비스인 AWS RDS에 대해 알아보겠습니다. RDS는 Relational Database Service의 약자로, AWS에서 제공하는 관리형 관계형 데이터베이스 서비스입니다. RDS를 사용하면 데이터베이스 관리에 드는 수고를 크게 덜 수 있습니다.

RDS의 가장 큰 장점은 데이터베이스 관리 작업을 AWS에 맡길 수 있다는 점입니다. 백업, 소프트웨어 패치, 모니터링 등을 AWS에서 자동으로 처리해줍니다. 개발자는 데이터베이스 인프라 관리 대신 애플리케이션 개발에 집중할 수 있죠. 예를 들어, RDS 인스턴스를 생성하는 것은 다음과 같이 간단합니다:


import boto3

rds = boto3.client('rds')

response = rds.create_db_instance(
    DBName='myDatabase',
    DBInstanceIdentifier='my-db-instance',
    AllocatedStorage=20,
    DBInstanceClass='db.t2.micro',
    Engine='mysql',
    MasterUsername='admin',
    MasterUserPassword='mypassword'
)

print(response)

위 코드는 boto3 라이브러리를 사용하여 RDS 인스턴스를 생성하는 예제입니다. DBName 파라미터로 데이터베이스 이름을, DBInstanceIdentifier로 인스턴스 식별자를 지정합니다. 간단히 몇 줄의 코드만으로 RDS 인스턴스를 프로비저닝할 수 있습니다.

생성한 RDS 인스턴스에 연결하여 SQL 쿼리를 실행할 수도 있습니다. pymysql 라이브러리를 사용한 예제를 볼까요?


import pymysql

conn = pymysql.connect(
    host='my-db-instance.123456789012.us-east-1.rds.amazonaws.com',
    user='admin', 
    password='mypassword',
    db='myDatabase'
)

cur = conn.cursor()

cur.execute("SELECT * FROM users")

for row in cur:
    print(row)

conn.close()

위 코드는 pymysql로 RDS 인스턴스에 연결하여 users 테이블의 모든 레코드를 조회하는 예제입니다. 실행 결과로 users 테이블의 데이터가 출력될 것입니다.

RDS는 읽기 전용 복제본(read replica)을 손쉽게 생성할 수 있는 기능도 제공합니다. 읽기 전용 복제본은 마스터 DB의 읽기 요청 부하를 분산시키는 데 유용합니다.


response = rds.create_db_instance_read_replica(
    DBInstanceIdentifier='my-replica',
    SourceDBInstanceIdentifier='my-db-instance'
)

create_db_instance_read_replica 함수를 호출하면 지정된 소스 DB(my-db-instance)의 읽기 전용 복제본(my-replica)이 생성됩니다.

이 밖에도 RDS는 손쉬운 백업 및 복구, 유연한 스케일링, 강력한 보안 등 다양한 기능을 제공하여 사용자에게 안정적이고 편리한 데이터베이스 환경을 제공합니다. 이어지는 섹션에서는 RDS 아키텍처와 지원되는 데이터베이스 엔진 등 좀 더 자세한 내용을 다뤄보겠습니다.

기본 구조 및 문법

AWS RDS(Relational Database Service)는 클라우드 환경에서 관계형 데이터베이스를 쉽게 설정, 운영 및 확장할 수 있는 웹 서비스입니다. 다음은 AWS RDS의 기본 구조와 문법에 대한 예제 코드입니다.

1. RDS 인스턴스 생성:


import boto3

rds = boto3.client('rds')

response = rds.create_db_instance(
    DBName='myDatabase',
    DBInstanceIdentifier='my-db-instance',
    AllocatedStorage=20,
    DBInstanceClass='db.t2.micro',
    Engine='mysql',
    MasterUsername='admin',
    MasterUserPassword='password',
    Port=3306,
    EngineVersion='8.0.23',
    PubliclyAccessible=True
)

print(response)
위 코드는 AWS RDS 클라이언트를 사용하여 새로운 RDS 인스턴스를 생성하는 예제입니다. create_db_instance() 메서드를 사용하여 필요한 파라미터를 설정하고 인스턴스를 생성합니다.

 

2. RDS 인스턴스 목록 조회:


import boto3

rds = boto3.client('rds')

response = rds.describe_db_instances()

for db_instance in response['DBInstances']:
    print(f"DB Instance Identifier: {db_instance['DBInstanceIdentifier']}")
    print(f"Engine: {db_instance['Engine']}")
    print(f"Status: {db_instance['DBInstanceStatus']}")
    print("---")
describe_db_instances() 메서드를 사용하여 현재 계정의 모든 RDS 인스턴스 목록을 조회할 수 있습니다. 반환된 결과에서 각 인스턴스의 식별자, 엔진 종류, 상태 등의 정보를 확인할 수 있습니다.

 

3. RDS 인스턴스 수정:


import boto3

rds = boto3.client('rds')

response = rds.modify_db_instance(
    DBInstanceIdentifier='my-db-instance',
    AllocatedStorage=30,
    ApplyImmediately=True
)

print(response)
modify_db_instance() 메서드를 사용하여 기존 RDS 인스턴스의 설정을 수정할 수 있습니다. 위 예제에서는 할당된 스토리지 용량을 30GB로 변경하고, 변경 사항을 즉시 적용하도록 설정하였습니다.

 

이상으로 AWS RDS의 기본 구조와 문법에 대해 알아보았습니다. 다음 섹션에서는 RDS 인스턴스에 데이터베이스를 생성하고 데이터를 삽입, 조회하는 방법에 대해 자세히 살펴보겠습니다.

심화 개념 및 테크닉

AWS RDS를 활용할 때 알아두면 유용한 심화 개념과 테크닉들을 코드 예제와 함께 살펴보겠습니다.

먼저, RDS 인스턴스의 파라미터 그룹을 수정하여 데이터베이스 설정을 최적화할 수 있습니다. 다음은 파라미터 그룹의 값을 변경하는 예시 코드입니다.


import boto3

rds = boto3.client('rds')

response = rds.modify_db_parameter_group(
    DBParameterGroupName='my-param-group',
    Parameters=[
        {
            'ParameterName': 'max_connections',
            'ParameterValue': '500',
            'ApplyMethod': 'pending-reboot'
        },
    ]
)

위 코드에서는 modify_db_parameter_group 메서드를 사용하여 my-param-group 파라미터 그룹의 max_connections 값을 500으로 변경합니다. 이렇게 하면 RDS 인스턴스가 더 많은 동시 연결을 처리할 수 있게 됩니다.

다음으로, RDS 인스턴스의 스냅샷을 생성하여 데이터를 백업할 수 있습니다. 아래는 수동 스냅샷을 생성하는 코드 예제입니다.


import boto3

rds = boto3.client('rds')

response = rds.create_db_snapshot(
    DBSnapshotIdentifier='my-snapshot',
    DBInstanceIdentifier='my-db-instance'
)

print(response)

이 코드는 create_db_snapshot 메서드를 사용하여 my-db-instance RDS 인스턴스의 스냅샷을 생성합니다. 스냅샷 식별자로는 my-snapshot이 사용되었습니다. 생성된 스냅샷 정보는 response 변수에 저장되어 출력됩니다.

마지막으로, RDS 이벤트 알림을 설정하여 인스턴스의 중요한 이벤트를 모니터링할 수 있습니다. 다음 코드는 RDS 이벤트 알림을 활성화하는 예시입니다.


import boto3

rds = boto3.client('rds')

response = rds.create_event_subscription(
    SubscriptionName='my-event-subscription',
    SnsTopicArn='arn:aws:sns:us-west-2:123456789012:my-sns-topic',
    SourceType='db-instance',
    EventCategories=[
        'availability',
        'deletion',
        'failover',
    ],
    SourceIds=[
        'my-db-instance',
    ]
)

print(response)

위 코드에서는 create_event_subscription 메서드를 사용하여 my-event-subscription이라는 이벤트 구독을 생성합니다. SNS 주제로는 my-sns-topic을 지정하였고, 모니터링할 이벤트 카테고리와 RDS 인스턴스도 함께 설정하였습니다. 생성된 이벤트 구독 정보는 response 변수에 저장되어 출력됩니다.

이러한 심화 개념과 테크닉을 활용하면 AWS RDS를 보다 효과적으로 사용할 수 있습니다. 다음 섹션에서는 AWS RDS를 다른 AWS 서비스와 연동하는 방법에 대해 알아보겠습니다.

실전 예제

다음은 AWS RDS를 활용하여 실제 프로젝트를 구현하는 단계별 예시입니다.

첫째, AWS RDS 인스턴스를 생성합니다. Python의 boto3 라이브러리를 사용하여 다음과 같이 RDS 인스턴스를 생성할 수 있습니다.


import boto3

rds = boto3.client('rds')

response = rds.create_db_instance(
    DBName='mydb',
    DBInstanceIdentifier='my-db-instance',
    AllocatedStorage=20,
    DBInstanceClass='db.t2.micro',
    Engine='mysql',
    MasterUsername='admin',
    MasterUserPassword='password'
)

print(response)

위 코드에서는 boto3 라이브러리를 사용하여 RDS 클라이언트를 생성하고, create_db_instance 메서드를 호출하여 새로운 RDS 인스턴스를 생성합니다. 인스턴스 식별자, 할당된 스토리지, 인스턴스 클래스, 데이터베이스 엔진, 마스터 사용자 이름과 비밀번호 등의 설정을 지정합니다.

둘째, 생성된 RDS 인스턴스에 연결하여 데이터베이스를 사용합니다. Python의 pymysql 라이브러리를 사용하여 RDS에 연결할 수 있습니다.


import pymysql

conn = pymysql.connect(
    host='my-db-instance.amazonaws.com',
    user='admin',
    password='password',
    database='mydb'
)

cursor = conn.cursor()

# 테이블 생성 예시
cursor.execute('''
    CREATE TABLE users (
        id INT PRIMARY KEY AUTO_INCREMENT,
        name VARCHAR(255),
        email VARCHAR(255)
    )
''')

conn.commit()
print("Table created successfully")

# 데이터 삽입 예시
sql = "INSERT INTO users (name, email) VALUES (%s, %s)"
val = ('John Doe', 'john@example.com')
cursor.execute(sql, val)

conn.commit()
print(cursor.rowcount, "record inserted.")

conn.close()

위 코드에서는 pymysql 라이브러리를 사용하여 RDS 인스턴스에 연결합니다. 호스트, 사용자 이름, 비밀번호, 데이터베이스 이름을 지정하여 연결을 설정합니다. 연결이 성공하면 커서를 생성하고, SQL 쿼리를 실행하여 테이블을 생성하고 데이터를 삽입하는 예시를 보여줍니다. 마지막으로 변경사항을 커밋하고 연결을 닫습니다.

셋째, RDS 인스턴스의 스냅샷을 생성하여 데이터를 백업할 수 있습니다.


import boto3

rds = boto3.client('rds')

response = rds.create_db_snapshot(
    DBSnapshotIdentifier='my-snapshot',
    DBInstanceIdentifier='my-db-instance'
)

print(response)

위 코드에서는 boto3 라이브러리를 사용하여 RDS 인스턴스의 스냅샷을 생성합니다. create_db_snapshot 메서드를 호출하여 스냅샷 식별자와 원본 RDS 인스턴스의 식별자를 지정합니다. 이를 통해 현재 시점의 RDS 데이터를 백업할 수 있습니다.

이상으로 AWS RDS를 활용한 실전 예제를 단계별로 살펴보았습니다. 다음 섹션에서는 AWS RDS의 고급 기능과 모범 사례에 대해 알아보겠습니다.

성능 최적화 팁

AWS RDS를 사용할 때 다음과 같은 방법으로 성능을 최적화할 수 있습니다.

    1. 인덱스 활용하기
-- 인덱스 없이 조회
SELECT * FROM users WHERE age > 30; 

-- age 컬럼에 인덱스 생성 후 조회
CREATE INDEX idx_users_age ON users (age);
SELECT * FROM users WHERE age > 30;

users 테이블의 age 컬럼에 인덱스를 생성함으로써 age 조건으로 검색할 때 훨씬 빠른 성능을 기대할 수 있습니다. 실행 계획을 확인해보면 인덱스를 타서 빠르게 결과를 가져오는 것을 볼 수 있습니다.

    1. 쿼리 최적화하기
-- 최적화 전 쿼리 
SELECT * 
FROM orders o
JOIN order_items i ON o.id = i.order_id
JOIN products p ON i.product_id = p.id
WHERE o.created_at BETWEEN '2022-01-01' AND '2022-12-31';

-- 최적화 후 쿼리
SELECT o.id, o.created_at, p.name, i.quantity, i.price 
FROM orders o
JOIN order_items i ON o.id = i.order_id
JOIN products p ON i.product_id = p.id
WHERE o.created_at BETWEEN '2022-01-01' AND '2022-12-31';

전체 컬럼(*)을 조회하는 대신 필요한 컬럼만 선택적으로 조회하고, 조건절에 인덱스가 있는 컬럼을 사용하면 쿼리 성능을 개선할 수 있습니다. 실행 계획을 통해 불필요한 full scan이 제거되고 인덱스를 사용하는지 확인합니다.

    1. 파라미터 그룹 설정 조정하기
[mysqld]
max_connections=1000
innodb_buffer_pool_size={DBInstanceClassMemory*3/4}
innodb_buffer_pool_instances=8
innodb_io_capacity=2000
...

RDS 파라미터 그룹 설정을 최적화하여 메모리와 I/O 등 시스템 리소스를 효과적으로 활용할 수 있습니다. 버퍼 풀 크기와 인스턴스 수, I/O 처리량 등을 늘리면 워크로드에 따라 성능이 향상됩니다. 단, 무작정 높이기보다는 모니터링 지표를 보면서 단계적으로 조정하는 것이 좋습니다.

이렇게 RDS에서 인덱스 활용, 쿼리 최적화, 파라미터 설정 등의 방법으로 성능을 개선할 수 있습니다. 이어서 모니터링과 관련된 내용을 알아보겠습니다.

일반적인 오류와 해결 방법

AWS RDS를 사용하다 보면 자주 직면하는 오류들이 있습니다. 이번 섹션에서는 이러한 오류들과 해결 방법을 코드 예시와 함께 살펴보겠습니다.

먼저, RDS 인스턴스에 연결이 되지 않는 경우입니다. 이는 보안 그룹 설정이 잘못되었을 때 발생할 수 있습니다. 다음 코드는 보안 그룹에 인바운드 규칙을 추가하는 방법을 보여줍니다.


import boto3

ec2 = boto3.client('ec2')

response = ec2.authorize_security_group_ingress(
    GroupId='sg-0123456789abcdef0',
    IpPermissions=[
        {
            'IpProtocol': 'tcp',
            'FromPort': 3306,
            'ToPort': 3306,
            'IpRanges': [{'CidrIp': '0.0.0.0/0'}]
        }
    ]
)

위 코드에서는 authorize_security_group_ingress 메서드를 사용하여 3306 포트에 대한 인바운드 규칙을 추가합니다. 이제 지정된 IP 범위에서 RDS 인스턴스에 접근할 수 있게 됩니다.

다음은 RDS 인스턴스의 스토리지 용량 부족 문제입니다. 다음 코드는 RDS 인스턴스의 스토리지 용량을 늘리는 방법을 보여줍니다.


import boto3

rds = boto3.client('rds')

response = rds.modify_db_instance(
    DBInstanceIdentifier='my-db-instance',
    AllocatedStorage=100
)

print(response)

위 코드는 modify_db_instance 메서드를 사용하여 my-db-instance의 할당된 스토리지를 100GB로 늘립니다. 변경 사항이 성공적으로 적용되면 관련 정보가 출력됩니다.


{
    'DBInstance': {
        'DBInstanceIdentifier': 'my-db-instance', 
        'AllocatedStorage': 100,
        ...
    },
    'ResponseMetadata': {
        ...
    }
}

RDS 인스턴스의 CPU 사용량이 높아 성능 저하가 발생하는 경우도 있습니다. 다음 코드는 RDS 인스턴스의 인스턴스 클래스를 변경하여 성능을 개선하는 방법을 보여줍니다.


import boto3

rds = boto3.client('rds')

response = rds.modify_db_instance(
    DBInstanceIdentifier='my-db-instance',
    DBInstanceClass='db.t3.large',
    ApplyImmediately=True
)

print(response)

위 코드에서는 modify_db_instance 메서드를 사용하여 인스턴스 클래스를 db.t3.large로 변경합니다. ApplyImmediately 파라미터를 True로 설정하여 변경 사항을 즉시 적용합니다. 변경이 완료되면 관련 정보가 출력됩니다.


{
    'DBInstance': {
        'DBInstanceIdentifier': 'my-db-instance', 
        'DBInstanceClass': 'db.t3.large',
        ...
    },
    'ResponseMetadata': {
        ...
    }
}

이상으로 AWS RDS 사용 시 자주 발생하는 오류들과 해결 방법에 대해 알아보았습니다. 이제 이를 바탕으로 RDS를 더욱 효과적으로 활용할 수 있을 것입니다. 다음 섹션에서는 RDS의 고급 기능과 모범 사례에 대해 살펴보겠습니다.

최신 트렌드와 미래 전망

AWS RDS의 최신 트렌드와 미래 전망에 대해 코드 예제와 함께 살펴보겠습니다.

먼저 AWS RDS Proxy를 활용한 연결 풀링 기능입니다. RDS Proxy를 사용하면 데이터베이스 연결을 효율적으로 관리할 수 있습니다.

import boto3

rds_client = boto3.client('rds')

response = rds_client.create_db_proxy(
    DBProxyName='my-db-proxy',
    EngineFamily='MYSQL',
    Auth=[
        {
            'Description': 'Admin user',
            'UserName': 'admin',
            'SecretArn': 'arn:aws:secretsmanager:us-west-2:123456789012:secret:my-db-secret'
        },
    ],
    RoleArn='arn:aws:iam::123456789012:role/my-rds-proxy-role',
    VpcSubnetIds=[
        'subnet-0123456789abcdef0',
        'subnet-0123456789abcdef1',
    ]
)

위 코드는 AWS SDK를 사용하여 RDS Proxy를 생성하는 예제입니다. DBProxyName은 프록시의 이름이고, EngineFamily는 데이터베이스 엔진을 지정합니다. Auth 파라미터에서는 데이터베이스 인증 정보를 설정하고, RoleArn은 프록시에 연결할 IAM 역할을 지정합니다. 마지막으로 VpcSubnetIds는 프록시가 위치할 서브넷을 나타냅니다.

다음은 Aurora Serverless v2를 사용하여 서버리스 데이터베이스를 프로비저닝하는 예제입니다.

import boto3

rds_client = boto3.client('rds')

response = rds_client.create_db_cluster(
    DBClusterIdentifier='my-serverless-cluster',
    Engine='aurora-postgresql',
    EngineVersion='10.14',
    EngineMode='serverless',
    DatabaseName='mydb',
    MasterUsername='admin',
    MasterUserPassword='password123',
    ServerlessV2ScalingConfiguration={
        'MinCapacity': 0.5,
        'MaxCapacity': 16
    }
)

이 코드는 Aurora Serverless v2 클러스터를 생성합니다. EngineMode를 'serverless'로 설정하고, ServerlessV2ScalingConfiguration에서 최소 및 최대 용량 단위를 지정합니다. 이를 통해 필요에 따라 자동으로 확장되는 서버리스 데이터베이스를 구성할 수 있습니다.

마지막으로 RDS Data API를 사용하여 SQL 쿼리를 실행하는 예제를 살펴보겠습니다.

import boto3

rds_data_client = boto3.client('rds-data')

response = rds_data_client.execute_statement(
    secretArn='arn:aws:secretsmanager:us-west-2:123456789012:secret:my-db-secret',
    database='mydb',
    resourceArn='arn:aws:rds:us-west-2:123456789012:cluster:my-serverless-cluster',
    sql='SELECT * FROM users WHERE id = :id',
    parameters=[
        {'name': 'id', 'value': {'longValue': 123}}
    ]
)

print(response['records'])

위 코드는 RDS Data API를 사용하여 파라미터화된 SQL 쿼리를 실행하는 예제입니다. secretArn은 데이터베이스 인증 정보가 저장된 Secrets Manager의 ARN이고, resourceArn은 쿼리를 실행할 데이터베이스 클러스터의 ARN입니다. sql 파라미터에는 실행할 SQL 문을 지정하고, parameters에서는 쿼리 파라미터를 설정합니다.

이처럼 AWS RDS는 연결 풀링, 서버리스 데이터베이스, Data API 등 다양한 기능을 제공하며 지속적으로 발전하고 있습니다. 앞으로도 AWS RDS는 고객의 니즈에 맞춰 혁신적인 기능을 선보일 것으로 기대됩니다.

이번 섹션에서는 AWS RDS의 최신 트렌드와 미래 전망에 대해 알아보았습니다. 다음 섹션에서는 AWS RDS를 활용한 실전 프로젝트 사례를 소개하겠습니다.

결론 및 추가 학습 자료

이번 포스트에서는 AWS RDS에 대해 알아보았습니다. RDS는 관계형 데이터베이스를 클라우드 상에서 쉽게 설정, 운영, 확장할 수 있도록 해주는 관리형 서비스입니다. 다음은 RDS를 사용하는 Python 코드 예제입니다.


import pymysql

# RDS 인스턴스 엔드포인트, 포트, 사용자 이름, 암호, DB 이름으로 연결
conn = pymysql.connect(
    host='your-rds-instance-endpoint',
    port=3306,
    user='your-username',
    passwd='your-password',
    db='your-db-name'
)

# 커서 생성
cur = conn.cursor()

# SQL 쿼리 실행
cur.execute("SELECT * FROM your_table")

# 모든 결과 가져오기
results = cur.fetchall()
for row in results:
    print(row)

# 연결 닫기
cur.close()
conn.close()

위 코드는 Python의 PyMySQL 라이브러리를 사용하여 RDS 인스턴스에 연결하고, SQL 쿼리를 실행하여 결과를 가져오는 예제입니다. RDS 인스턴스의 엔드포인트, 포트, 사용자 이름, 암호, DB 이름을 사용하여 연결을 설정합니다.

RDS 인스턴스 생성 및 관리는 AWS 관리 콘솔, AWS CLI, 또는 AWS SDK를 통해 수행할 수 있습니다. 다음은 AWS CLI를 사용하여 RDS 인스턴스를 생성하는 예제입니다.


aws rds create-db-instance \
    --db-instance-identifier myinstance \
    --db-instance-class db.t2.micro \
    --engine mysql \
    --master-username admin \
    --master-user-password secret123 \
    --allocated-storage 20

위 명령은 MySQL 엔진을 사용하는 db.t2.micro 클래스의 RDS 인스턴스를 생성합니다. 인스턴스 식별자, 마스터 사용자 이름, 마스터 사용자 암호, 할당된 스토리지 크기를 지정합니다.

RDS는 자동 백업, 고가용성 및 다중 AZ 배포, 읽기 전용 복제본, 성능 개선을 위한 파라미터 그룹 등 다양한 기능을 제공합니다. 다음은 RDS 인스턴스의 백업을 생성하는 AWS CLI 명령 예제입니다.


aws rds create-db-snapshot \
    --db-snapshot-identifier mysnap \
    --db-instance-identifier myinstance

위 명령은 "myinstance" RDS 인스턴스의 스냅샷을 "mysnap"이라는 식별자로 생성합니다. 이렇게 생성된 수동 스냅샷은 인스턴스 복구나 새로운 인스턴스 생성에 사용할 수 있습니다.

AWS RDS에 대해 더 자세히 학습하고 싶다면 다음 자료를 참고하시기 바랍니다:

  • AWS 공식 문서 - Amazon RDS 시작하기: 링크
  • AWS 기반 RDS 활용 블로그 포스트: 링크
  • Udemy 강좌 - AWS RDS 마스터하기: 링크

다음 섹션에서는 AWS RDS와 함께 사용할 수 있는 다른 AWS 서비스에 대해 알아보겠습니다.



728x90