Silbo의 AWS CDK RDS 백업
35일 연속 스냅샷은 단기 백업을 신속하게 복구하는 데 유용합니다.그러나 이 시스템은 많은 한계가 있다.감사 차원에서 35일이 주요 요인이 될 것이다.자동 백업은 직접 액세스할 수 있는 SQL 내보내기가 아니므로 AWS RDS에서만 사용할 수 있습니다.재해 복구를 처리할 때 장애가 발생한 지역에 대한 계획을 세워야 합니다.우리는 다른 지역에서 회복될 수 있기를 바란다.
이를 실현하기 위해서, 나는 이러한 백업 정책을 어떻게 안배하는지 몇 가지 AWS RDS 코드를 통해 보여 줄 것이다.
코드는 AWS CDK 에 있습니다.
github 개요
: 15분의 시간 초과 제한, 메모리 제한 등이 있기 때문에, 우리는 AWS Lambda 실례에서 백업을 실행하기를 원한다는 것을 알고 있습니다.비용을 낮추기 위해서, 우리는 백업 기간에 이 실례를 시작하고 닫기를 원할 뿐이다.따라서 Lambda가 EC2 인스턴스를 생성하고 명령predefined quotas을 통해 구성하도록 합니다.
Amazon EC2
인스턴스 사용자 데이터 EC2 사용자 데이터
이 워크플로우의 가장 중요한 부분은 EC2 인스턴스 사용자 데이터에 포함되어 있습니다.여기서, 우리는 모든 의존항을 설치하고, 명령을 실행하고, 실례를 닫아야 한다.
이 예제에서 나는 AWS RDS 실례를 만들었는데, 작성할 때의 기본 버전은
PostgreSQL 11.6-R1
이다.PostgreSQL에서는 데이터베이스 내보내기
를 사용할 수 있습니다.우리의 이전 명령은 PostgreSQL에 설치하는 것이다.yum install -y wget tar gcc make
wget https://ftp.postgresql.org/pub/source/v11.6/postgresql-11.6.tar.gz
tar -zxvf postgresql-11.6.tar.gz
cd postgresql-11.6/
./configure --without-readline --without-zlib
make
make install
우리는 pg_dump
에 대한 사용자 이름과 비밀번호를 설정하고 싶습니다. PostgreSQL 지원pg_dump:echo "hostname:port:database:username:password" > ~/.pgpass
chmod 600 ~/.pgpass
마지막으로 pg_dump
를 실행하고 S3에 출력을 업로드합니다./usr/local/pgsql/bin/pg_dump -h hostname \
-U username \
-w \
-c \
-f output.pgsql \
databaseName
S3_KEY=S3BucketName/hostname/$(date "+%Y-%m-%d")-databaseName-backup.tar.gz
tar -cvzf output.tar.gz output.pgsql
aws s3 cp output.tar.gz s3://$S3_KEY --sse AES256
이것은 우리가 여기에 필요로 하는 모든 기본 논리입니다. 더 많은 명령을 추가하거나 사용으로 변경할 수 있습니다 Amazon Linux 2 - 필요한 것!암호 파일 AWS CDK
주 논리가 완성되면 CDK를 이용하여 이 모든 것을 지원합시다!
우리의 첫 번째 단계는 우리가 수출하여 생존할 수 있는 통을 만드는 것이다.
const rdsBackupsBucket = new s3.Bucket(this, 'rdsBackupsBucket', {
blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
encryption: s3.BucketEncryption.S3_MANAGED
});
이것은 단지 독립된 저장 통일 뿐이지만, 영역을 뛰어넘는 복제 논리를 만들어서 논리를 Glacier 등에 압축할 수 있습니다.현재 우리는 pg_dumpallbucket을 가지고 있으며, EC2 실례가 그것을 어떻게 방문할지 고려해야 한다.EC2에 적절한 권한이 있는지 확인합니다 .이것은 세 부분으로 나뉜다.
const backupInstanceRole = new iam.Role(this, 'backupInstanceRole', {
assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com')
});
backupInstanceRole.addToPolicy(
new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
resources: [rdsBackupsBucket.bucketArn + '/*'],
actions: [
's3:PutObject',
's3:PutObjectAcl'
]
})
);
new iam.CfnInstanceProfile(
this,
'backupInstanceProfile',
{
roles: [
backupInstanceRole.roleName,
],
}
);
현재, 우리가 위에서 되돌아본 사용자 데이터는 상당히 정적, 하드코딩 값 등등이다. 우리는 이 창고가 데이터베이스 설정에 있어서 더욱 설정성이 있기를 바란다.이 간단한 설정을 위해 AWS CDK에서 매개변수로 구성하고 환경 변수로 AWS Lambda에 전달합니다.<중요 단락>
실제 환경을 처리할 때 이 값은 IAM Policy 에 저장되어야 한다.그리고 우리는 AWS CDK와 AWS Lambda를 통해 비밀 이름을 매개 변수로 EC2 실례의 사용자 데이터에 전달할 것이다.EC2 인스턴스 프로파일에 대한 기밀 액세스 권한이 부여되며 직접 읽어들이며 사용자 이름/암호를 이동하지 않습니다.
CDK로 돌아가!Instance Profile를 통해 변수를 전송한 후, 우리는 그것들을 검색하여lambda의 환경 변수로 설정하기를 희망합니다.마찬가지로 중요한 것은 Lambda가 EC2 실례를 시작하는 데 필요한 권한을 부여해야 한다는 것입니다!
const ec2_region = this.node.tryGetContext('ec2_region');
const ec2_type = this.node.tryGetContext('ec2_type');
const db_host = this.node.tryGetContext('db_host');
const db_user = this.node.tryGetContext('db_user');
const db_pass = this.node.tryGetContext('db_pass');
const db_database = this.node.tryGetContext('db_database');
const launchingLambda = new lambda.Function(this, 'Lambda', {
runtime: lambda.Runtime.PYTHON_3_7,
handler: 'function.lambda_to_ec2',
code: lambda.Code.asset('./resources'),
description: 'Backup Database to S3',
timeout: core.Duration.seconds(30),
environment: {
INSTANCE_REGION: ec2_region,
INSTANCE_TYPE: ec2_type,
INSTANCE_ROLE: backupInstanceRole.roleName,
DB_HOST: db_host,
DB_USER: db_user,
DB_PASS: db_pass,
DB_DATABASE: db_database,
S3_BUCKET: rdsBackupsBucket.bucketName
}
});
launchingLambda.addToRolePolicy(
new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
resources: ['*'],
actions: ['ec2:*']
})
);
launchingLambda.addToRolePolicy(
new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
resources: [backupInstanceRole.roleArn],
actions: ['iam:PassRole']
})
);
마지막으로, 우리는 우리의 lambda를 안배해야 한다.실제 환경에서 업데이트의 빈도를 대량으로 고려해야 한다.어떤 수준의 신뢰성이 필요합니까?RTO(복구 시점 목표)를 설정하고 정의했습니까?마찬가지로 설정할 수 있도록 CDK 상하문에서 cron 설정을 설정하고 필요한 값을 추출하여 Cloudwatch 이벤트 규칙에 전달합니다.
const lambdaTarget = new eventstargets.LambdaFunction(launchingLambda);
const cron_minute = this.node.tryGetContext('cron_minute');
const cron_hour = this.node.tryGetContext('cron_hour');
const cron_day = this.node.tryGetContext('cron_day');
const cron_month = this.node.tryGetContext('cron_month');
const cron_year = this.node.tryGetContext('cron_year');
new events.Rule(this, 'ScheduleRule', {
schedule: events.Schedule.cron({
minute: cron_minute,
hour: cron_hour,
day: cron_day,
month: cron_month,
year: cron_year
}),
targets: [lambdaTarget],
});
그런 다음 cdk.json
에서 모든 설정을 구성할 수 있습니다.{
"app": "npx ts-node bin/aws-rds-nightly-backup.ts",
"context": {
"@aws-cdk/core:enableStackNameDuplicates": "true",
"aws-cdk:enableDiffNoFail": "true",
"@aws-cdk/core:stackRelativeExports": "true",
"ec2_region": "us-east-1",
"ec2_type": "t2.large",
"db_host": "database-1.ct5iuxjgrvl6.us-east-1.rds.amazonaws.com",
"db_user": "postgres",
"db_pass": "exampledb",
"db_database": "testdb",
"cron_minute": "0",
"cron_hour": "8",
"cron_day": "1",
"cron_month": "*",
"cron_year": "*"
}
}
즐거운 백업을 즐겨보세요!
Reference
이 문제에 관하여(Silbo의 AWS CDK RDS 백업), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/aws-builders/aws-cdk-rds-backup-at-silbo-47pc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)