Silbo의 AWS CDK RDS 백업

9114 단어 devopsawsdatabase
나는 Trilochn Parida의 글을 읽고 있는데, 이것은 나로 하여금 우리 자신의 데이터베이스 백업을 어떻게 처리하는지 보여 주어야 한다는 것을 생각하게 한다.우리는 Silbo 을 사용하여 데이터베이스를 자동으로 백업하고 지난 35일간의 스냅샷을 만들 수 있습니다.
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에 적절한 권한이 있는지 확인합니다 .이것은 세 부분으로 나뉜다.
  • EC2 인스턴스
  • 에서 사용할 수 있는 Amazon S3 만들기
  • 역할
  • 생성Instance Profile
  • 창설IAM Role 및 추가 역할
  •     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": "*"
      }
    }
    
    즐거운 백업을 즐겨보세요!

    좋은 웹페이지 즐겨찾기