rds について
データベース管理者や開発者向けの Amazon RDS 運用スキルです。CLI と boto3 の例に加え、バックアップ、高可用性、セキュリティ、性能、トラブルシューティングを扱います。
主な機能
- 01インスタンスの作成と変更
- 02リードレプリカと Multi-AZ 構成
- 03スナップショットと特定時点への復元
- 04セキュリティと性能の指針
- 05CLI と boto3 の例
活用シーン
- 01PostgreSQL RDS の導入計画
- 02レプリカによる読み取りの拡張
- 03データ損失後のデータベース復元
- 04接続や性能の問題の調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ itsmostafa/ aws-agent-skills --skill rdsインストール後、Claude Code で/rdsを入力して読み込まれたか確認します。
同梱ファイルadministration.md
詳細
AWS RDS
Amazon Relational Database Service(RDS)は、MySQL、PostgreSQL、MariaDB、Oracle、SQL Server、Aurora などのマネージドリレーショナルデータベースを提供します。RDS は、プロビジョニング、パッチ適用、バックアップ、フェイルオーバーを処理します。
目次
主な概念
DB インスタンスクラス
| カテゴリ | 例 | ユースケース |
|---|---|---|
| 標準 | db.m6g.large | 汎用 |
| メモリ最適化 | db.r6g.large | 大容量メモリを必要とするワークロード |
| バースト可能 | db.t3.medium | 変動するワークロード、開発/テスト |
ストレージタイプ
| タイプ | IOPS | ユースケース |
|---|---|---|
| gp3 | 3,000-16,000 | ほとんどのワークロード |
| io1/io2 | 最大 256,000 | 高性能 OLTP |
| magnetic | N/A | レガシー用途。使用は避けてください |
Multi-AZ デプロイ
- Multi-AZ インスタンス:別の AZ に同期スタンバイを配置します
- Multi-AZ クラスター:ライターインスタンス 1 台とリーダーインスタンス 2 台で構成されます(Aurora に類似)
リードレプリカ
読み取りをスケールするための非同期コピーです。リージョンをまたいで作成できます。
一般的なパターン
PostgreSQL インスタンスを作成する
AWS CLI:
# Create DB subnet group
aws rds create-db-subnet-group \
--db-subnet-group-name my-db-subnet-group \
--db-subnet-group-description "Private subnets for RDS" \
--subnet-ids subnet-12345678 subnet-87654321
# Create security group (allow PostgreSQL from app)
aws ec2 create-security-group \
--group-name rds-postgres-sg \
--description "RDS PostgreSQL access" \
--vpc-id vpc-12345678
aws ec2 authorize-security-group-ingress \
--group-id sg-rds12345 \
--protocol tcp \
--port 5432 \
--source-group sg-app12345
# Create RDS instance
aws rds create-db-instance \
--db-instance-identifier my-postgres \
--db-instance-class db.t3.medium \
--engine postgres \
--engine-version 16.1 \
--master-username admin \
--master-user-password 'SecurePassword123!' \
--allocated-storage 100 \
--storage-type gp3 \
--db-subnet-group-name my-db-subnet-group \
--vpc-security-group-ids sg-rds12345 \
--multi-az \
--backup-retention-period 7 \
--storage-encrypted \
--no-publicly-accessible
boto3:
import boto3
rds = boto3.client('rds')
response = rds.create_db_instance(
DBInstanceIdentifier='my-postgres',
DBInstanceClass='db.t3.medium',
Engine='postgres',
EngineVersion='16.1',
MasterUsername='admin',
MasterUserPassword='SecurePassword123!',
AllocatedStorage=100,
StorageType='gp3',
DBSubnetGroupName='my-db-subnet-group',
VpcSecurityGroupIds=['sg-rds12345'],
MultiAZ=True,
BackupRetentionPeriod=7,
StorageEncrypted=True,
PubliclyAccessible=False
)
リードレプリカを作成する
aws rds create-db-instance-read-replica \
--db-instance-identifier my-postgres-replica \
--source-db-instance-identifier my-postgres \
--db-instance-class db.t3.medium \
--availability-zone us-east-1b
スナップショットを取得する
aws rds create-db-snapshot \
--db-snapshot-identifier my-postgres-snapshot-2024-01-15 \
--db-instance-identifier my-postgres
スナップショットから復元する
aws rds restore-db-instance-from-db-snapshot \
--db-instance-identifier my-postgres-restored \
--db-snapshot-identifier my-postgres-snapshot-2024-01-15 \
--db-instance-class db.t3.medium \
--db-subnet-group-name my-db-subnet-group \
--vpc-security-group-ids sg-rds12345
特定時点への復元
aws rds restore-db-instance-to-point-in-time \
--source-db-instance-identifier my-postgres \
--target-db-instance-identifier my-postgres-pitr \
--restore-time 2024-01-15T10:30:00Z \
--db-instance-class db.t3.medium
インスタンスを変更する
# Change instance class (with downtime)
aws rds modify-db-instance \
--db-instance-identifier my-postgres \
--db-instance-class db.m6g.large \
--apply-immediately
# Scale storage (no downtime)
aws rds modify-db-instance \
--db-instance-identifier my-postgres \
--allocated-storage 200 \
--apply-immediately
IAM 認証で接続する
import boto3
import psycopg2
rds = boto3.client('rds')
# Generate auth token
token = rds.generate_db_auth_token(
DBHostname='my-postgres.abc123.us-east-1.rds.amazonaws.com',
Port=5432,
DBUsername='iam_user',
Region='us-east-1'
)
# Connect
conn = psycopg2.connect(
host='my-postgres.abc123.us-east-1.rds.amazonaws.com',
port=5432,
database='mydb',
user='iam_user',
password=token,
sslmode='require'
)
CLI リファレンス
インスタンス管理
| コマンド | 説明 |
|---|---|
aws rds create-db-instance | インスタンスを作成 |
aws rds describe-db-instances | インスタンスを一覧表示 |
aws rds modify-db-instance | 設定を変更 |
aws rds delete-db-instance | インスタンスを削除 |
aws rds reboot-db-instance | インスタンスを再起動 |
aws rds start-db-instance | 停止中のインスタンスを起動 |
aws rds stop-db-instance | インスタンスを停止 |
バックアップ
| コマンド | 説明 |
|---|---|
aws rds create-db-snapshot | 手動でスナップショットを作成 |
aws rds describe-db-snapshots | スナップショットを一覧表示 |
aws rds restore-db-instance-from-db-snapshot | スナップショットから復元 |
aws rds restore-db-instance-to-point-in-time | 特定時点に復元 |
aws rds copy-db-snapshot | スナップショットをコピー |
レプリカ
| コマンド | 説明 |
|---|---|
aws rds create-db-instance-read-replica | リードレプリカを作成 |
aws rds promote-read-replica | スタンドアロンに昇格 |
ベストプラクティス
セキュリティ
- パブリックアクセスを絶対に許可しないでください — VPC とセキュリティグループを使用します
- 保存時(KMS)と転送時(SSL)の暗号化を有効にします
- アプリケーションからのアクセスにはIAM 認証を使用します
- ローテーションを設定したうえで、認証情報を Secrets Manager に保存します
- SSL を強制するにはパラメータグループを使用します
# Enforce SSL in PostgreSQL
aws rds modify-db-parameter-group \
--db-parameter-group-name my-pg-params \
--parameters "ParameterName=rds.force_ssl,ParameterValue=1,ApplyMethod=pending-reboot"
パフォーマンス
- 適切なサイズのインスタンスを選択します — CPU、メモリ、IOPS を監視します
- コスト効率の高いパフォーマンスを得るためにgp3 を使用します
- クエリ分析のためにPerformance Insights を有効にします
- 読み取りをスケールするためにリードレプリカを使用します
- クエリを最適化します — スロークエリログを確認します
高可用性
- 本番環境ではMulti-AZ を有効にします
- ミッションクリティカルなワークロードにはAurora を使用します
- 適切なバックアップ保持期間を設定します
- 定期的にフェイルオーバーをテストします
- レプリカのレプリケーション遅延を監視します
コスト最適化
- 定常的なワークロードにはリザーブドインスタンスを使用します
- 使用していないときは開発/テスト用インスタンスを停止します
- 古いスナップショットを定期的に削除します
- インスタンスクラスのサイズを適切に調整します
トラブルシューティング
接続できない
原因:
- セキュリティグループでアクセスが許可されていない
- インスタンスが VPC サブネット内にない
- SSL が必要だが使用されていない
- エンドポイントまたはポートが間違っている
デバッグ:
# Check security group
aws ec2 describe-security-groups --group-ids sg-rds12345
# Check instance status
aws rds describe-db-instances \
--db-instance-identifier my-postgres \
--query "DBInstances[0].{Status:DBInstanceStatus,Endpoint:Endpoint}"
# Test connectivity from EC2
nc -zv my-postgres.abc123.us-east-1.rds.amazonaws.com 5432
CPU/メモリ使用率が高い
デバッグ:
# Enable Enhanced Monitoring
aws rds modify-db-instance \
--db-instance-identifier my-postgres \
--monitoring-interval 60 \
--monitoring-role-arn arn:aws:iam::123456789012:role/rds-monitoring-role
# Enable Performance Insights
aws rds modify-db-instance \
--db-instance-identifier my-postgres \
--enable-performance-insights \
--performance-insights-retention-period 7
解決策:
- インスタンスクラスをスケールアップする
- 遅いクエリを最適化する
- リードレプリカを追加する
- ロックやブロックが発生していないか確認する
ストレージがいっぱい
症状: インスタンスが利用できなくなる
予防:
# Enable storage autoscaling
aws rds modify-db-instance \
--db-instance-identifier my-postgres \
--max-allocated-storage 500
# Set CloudWatch alarm
aws cloudwatch put-metric-alarm \
--alarm-name "RDS-Storage-Low" \
--metric-name FreeStorageSpace \
--namespace AWS/RDS \
--dimensions Name=DBInstanceIdentifier,Value=my-postgres \
--statistic Average \
--period 300 \
--threshold 10000000000 \
--comparison-operator LessThanThreshold \
--evaluation-periods 2 \
--alarm-actions arn:aws:sns:us-east-1:123456789012:alerts
レプリケーションラグ
モニタリング:
aws cloudwatch get-metric-statistics \
--namespace AWS/RDS \
--metric-name ReplicaLag \
--dimensions Name=DBInstanceIdentifier,Value=my-postgres-replica \
--start-time $(date -d '1 hour ago' -u +%Y-%m-%dT%H:%M:%SZ) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
--period 60 \
--statistics Average
原因:
- レプリカインスタンスのサイズが小さすぎる
- 書き込み負荷が高い
- ネットワークの問題
- レプリカでの長時間実行クエリ
参考資料
コメント
Markdown 対応