AWS-CDK的实践和应用

这篇具有很好参考价值的文章主要介绍了AWS-CDK的实践和应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ㅤㅤㅤ
ㅤㅤㅤ
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ(我们关心的,不是你是否失败了,而是你对失败能否无怨。——林肯)
ㅤㅤㅤ
ㅤㅤㅤ
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤaws cdk,JavaScript,node,数据库,aws,云计算,node.js

以dynamodb备份还原资源为例进行演示
什么是aws-cdk

aws-cdk由aws提供,用代码编写的方式构建可靠,可扩展,高效的应用程序,它的优点有

  • 用自定义代码的方式运行aws资源
  • 使用参数,条件,组合等编程习惯构建aws资源
  • 使用代码审查,单元测试的方式,让aws资源部署和运行更加稳健
  • 使用更简单的api对接方式来完成aws资源的操作
  • 技术团队间更容易了解和分享公司的aws架构
CDKToolkit

可以将 AWS CDK 应用程序部署到 AWS 之前为 AWS CDK 预置资源的过程。(AWS 环境是 AWS 账户和区域的组合)。
这些资源包括用于存储文件的 Amazon S3 存储桶和授予执行部署所需权限的 IAM 角色等资源

aws-cdk入门相关链接

https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html
https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_backup.CfnBackupPlan.BackupPlanResourceTypeProperty.html
cdk.json配置
https://docs.aws.amazon.com/cdk/v2/guide/cli.html

演示的功能列表

备份计划

  • backupPlanCore
    • 用途:生成核心备份计划
    • 频率:每小时连续备份一次,保留七天,热存储区,备份库用default,核心备份
  • backupPlanStandard
    • 用途:生成标准备份计划
    • 频率:每天凌晨,中午备份一次,保留十五天,热存储区,备份库用default,普通备份
  • backupPlanOffSite
    • 用途:生成多地区备份保存计划
    • 频率:每天凌晨全表全备,中国-宁夏和中国-北京,热存储区,分别保留三十天,备份库用default,双地备份

初始化

  1. 本地安装cdk

    npm install -g aws-cdk
    
  2. 初始化ts新项目

    cdk init app --language typescript
    
  3. 查看应用列表

    cdk ls
    
  4. 初始化堆栈资源,前提是本地已经配置了aws证书

    安装aws-cli:https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html

    配置aws证书:https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html

    yarn run cdk-bootstrap-dev --aws-profile dev STAGE=dev
    
  5. 发布应用程序

    yarn run cdk-deploy-dev --profile dev STAGE=dev
    
  6. 销毁应用程序

    yarn run cdk-destory-dev --profile dev STAGE=dev
    

目录结构

  • bin:cdk应用程序的入口,用于加载lib下的文件
  • lib:定义cdk应用程序的堆栈
  • cdk.out:cdk应用程序的堆栈信息和元数据
  • cdk.json:cdk应用程序运行的配置文件

使用

  • backupPlanCore

    // 初始化app
    const app = new cdk.App();
    // 描述
    const description = 'aws-cdk堆栈 目前用于执行数据库备份操作';
    // 堆栈信息
    const cdkStack = new CdkStack(app, 'CdkStack', { description });
    // 表名列表
    const coreTableNameList = ['tenant-table-local'];
    cdkStack.backupPlanCore(coreTableNameList);
    
  • backupPlanStandard

    // 初始化app
    const app = new cdk.App();
    // 描述
    const description = 'aws-cdk堆栈 目前用于执行数据库备份操作';
    // 堆栈信息
    const cdkStack = new CdkStack(app, 'CdkStack', { description });
    // 表名列表
    const standardTableNameList = ['tenant-table-local'];
    cdkStack.backupPlanStandard(standardTableNameList);
    
  • backupPlanOffSite

    // 初始化app
    const app = new cdk.App();
    // 描述
    const description = 'aws-cdk堆栈 目前用于执行数据库备份操作';
    // 堆栈信息
    const cdkStack = new CdkStack(app, 'CdkStack', { description });
    // 表名列表
    const offsiteTableNameList = ['tenant-table-local'];
    cdkStack.backupPlanOffSite(offsiteTableNameList);
    

备份的核心代码文章来源地址https://www.toymoban.com/news/detail-666316.html

import * as cdk from 'aws-cdk-lib';
import { Duration, aws_dynamodb } from 'aws-cdk-lib';
import * as Backup from 'aws-cdk-lib/aws-backup';
import { BackupPlanRule, BackupResource, IBackupVault } from 'aws-cdk-lib/aws-backup';
import { Schedule } from 'aws-cdk-lib/aws-events';
import { Construct } from 'constructs';
import * as dayjs from 'dayjs';
import * as dotenv from 'dotenv';

export class CdkStack extends cdk.Stack {

  // 默认以秒为单位的日期作为备份计划和资源的后缀
  private readonly defaultPlanTime!: string;
  // 默认备份计划名称
  private readonly defaultPlanName!: string;
  // 默认备份资源名称
  private readonly defaultResourceName!: string;
  // 默认备份库配置
  private readonly defaultBackupVaultConfig!: IBackupVault;
  // 默认异地备份库配置
  private readonly defaultBackupVaultOffSiteConfig!: IBackupVault;
  // 默认备份库名称
  private readonly defaultBackupVaultName!: string;
  // 默认异地备份库名称
  private readonly defaultBackupVaultOffSiteName!: string;
  // 默认备份库ARN
  private readonly defaultBackupVaultArn!: string;
  // 默认异地备份库ARN
  private readonly defaultBackupVaultOffSiteArn!: string;
  // 当前账户id
  private readonly accountId!: string;

  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    // 加载环境变量
    const envPath = `${__dirname}/../.env.${process.env.STAGE ?? 'dev'}`;
    const env = dotenv.config({ path: envPath });
    if (!env.parsed) {
      throw new Error('class init error! env path invalid!');
    }
    // 获取账户环境信息
    this.accountId = cdk.Stack.of(this).account;
    this.defaultBackupVaultName = env.parsed.BACKUP_VAULT_NAME;
    this.defaultBackupVaultOffSiteName = env.parsed.OFFSITE_VAULT_NAME;
    // 中国-宁夏
    this.defaultBackupVaultArn = `arn:aws-cn:backup:cn-northwest-1:${this.accountId}:backup-vault:Default`;
    // 中国-北京
    this.defaultBackupVaultOffSiteArn = `arn:aws-cn:backup:cn-north-1:${this.accountId}:backup-vault:Default`;
    this.defaultPlanTime = dayjs().format('YYYYMMDDHHmmss');
    this.defaultPlanName = `backupPlan-${this.defaultPlanTime}`;
    this.defaultResourceName = `backupResource-${this.defaultPlanTime}`;
    this.defaultBackupVaultConfig = Backup.BackupVault.fromBackupVaultArn(this, this.defaultBackupVaultName, this.defaultBackupVaultArn);
    this.defaultBackupVaultOffSiteConfig = Backup.BackupVault.fromBackupVaultArn(this, `${this.defaultBackupVaultOffSiteName}-offsite`, this.defaultBackupVaultOffSiteArn);
  }

  // 核心计划备份
  backupPlanCore(tableNameList: string[]) {
    if (tableNameList.length === 0) {
      console.log('backupPlanCore tableNameList is empty');
      return;
    }
    const backPlan = new Backup.BackupPlan(this, 'BackPlanCore');
    const backPlanCoreRule = new BackupPlanRule({
      // 保存时长 保留七天
      deleteAfter: Duration.days(7),
      // 多久迁移至冷存储区 moveToColdStorageAfter
      // 规则名称
      ruleName: this.defaultPlanName,
      // 备份频率 每小时
      scheduleExpression: Schedule.cron({ hour: '*', minute: '0' }),
      // 备份库配置
      backupVault: this.defaultBackupVaultConfig,
      // 连续备份
      enableContinuousBackup: true,
    });
    const resourceList = tableNameList.map((tbName) => BackupResource.fromDynamoDbTable(aws_dynamodb.Table.fromTableName(this, 'TableCore', tbName)));
    const backCoreResource = {
      resources: resourceList,
      backupSelectionName: this.defaultResourceName,
    };
    backPlan.addSelection('Selection', backCoreResource);
    backPlan.addRule(backPlanCoreRule);
    return backPlan;
  }

  // 标准备份
  backupPlanStandard(tableNameList: string[]) {
    if (tableNameList.length === 0) {
      console.log('backupPlanStandard tableNameList is empty');
      return;
    }
    const backPlan = new Backup.BackupPlan(this, 'backupPlanStandard');
    const backPlanCoreRule = new BackupPlanRule({
      // 保存时长 保留七天
      deleteAfter: Duration.days(15),
      // 多久迁移至冷存储区 moveToColdStorageAfter
      // 规则名称
      ruleName: this.defaultPlanName,
      // 备份频率 每天凌晨和12点执行 utc时间 中国区会+8小时
      scheduleExpression: Schedule.cron({ hour: '16,4', minute: '0' }),
      // 备份库配置
      backupVault: this.defaultBackupVaultConfig,
      // 连续备份
      enableContinuousBackup: false,
    });
    const resourceList = tableNameList.map((tbName) => BackupResource.fromDynamoDbTable(aws_dynamodb.Table.fromTableName(this, 'TableStandard', tbName)));
    const backCoreResource = {
      resources: resourceList,
      backupSelectionName: this.defaultResourceName,
    };
    backPlan.addSelection('Selection', backCoreResource);
    backPlan.addRule(backPlanCoreRule);
    return backPlan;
  }

  // 异地备份
  backupPlanOffSite(tableNameList: string[]) {
    if (tableNameList.length === 0) {
      console.log('backupPlanOffSite tableNameList is empty');
      return;
    }
    const backPlan = new Backup.BackupPlan(this, 'backupPlanOffSite');
    const backPlanCoreRule = new BackupPlanRule({
      // 保存时长 保留30天
      deleteAfter: Duration.days(30),
      // 多久迁移至冷存储区 moveToColdStorageAfter
      // 规则名称
      ruleName: this.defaultPlanName,
      // 备份频率 每天凌晨和12点执行
      scheduleExpression: Schedule.cron({ hour: '16', minute: '0' }),
      // 备份库配置
      backupVault: this.defaultBackupVaultConfig,
      // 连续备份
      enableContinuousBackup: false,
      // 复制目标点
      copyActions: [
        {
          // 异地备份库配置
          destinationBackupVault: this.defaultBackupVaultOffSiteConfig,
          // 异地备份库保留30天
          deleteAfter: Duration.days(30),
        }
      ]
    });
    const resourceList = tableNameList.map((tbName) => BackupResource.fromDynamoDbTable(aws_dynamodb.Table.fromTableName(this, 'TableOffSite', tbName)));
    const backCoreResource = {
      resources: resourceList,
      backupSelectionName: this.defaultResourceName,
    };
    backPlan.addSelection('Selection', backCoreResource);
    backPlan.addRule(backPlanCoreRule);
    return backPlan;
  }


}

到了这里,关于AWS-CDK的实践和应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AWS密钥对实践

    使用 ssh-keygen 创建密钥对,然后把公钥导入AWS 使用 ssh-keygen 命令创建密钥 使用 -t 指定密钥对类型 使用 -b 指定密钥对位数 查看公钥内容 进入 AWS 控制台,进入 EC2 服务界面,选择 key pairs — Actions — import key pair 给密钥对命名,然后导入公钥文件 在这里你可以选择上面的 k

    2023年04月08日
    浏览(20)
  • AWS 密钥管理的最佳实践

    AWS 密钥的安全管理对于保护敏感数据和防止未经授权访问关键系统和应用程序至关重要。在当今快速升级的威胁环境中,组织必须确保其机密得到适当的管理和保护。 AWS 开发工具包(也称为 AWS 软件开发工具包)是一组软件开发工具和库,旨在使开发人员更轻松地在其应用

    2024年02月04日
    浏览(42)
  • AWS Amplify 部署node版本18报错修复

    Amplify env:Amazon Linux:2 Build Error : Specified Node 18 but GLIBC_2.27 or GLIBC_2.28 not found on build         报错原因是因为默认情况下,AWS Amplify 使用 Amazon Linux:2 作为其构建镜像,并自带 GLIBC 2.26。不过,构建需要 Node.js 18 的前端应用程序将需要 GLIBC 2.27 或 2.28。  网上搜了一圈,大多数推

    2024年02月14日
    浏览(24)
  • [ 云计算 | AWS 实践 ] 使用 Java 列出存储桶中的所有 AWS S3 对象

    本文收录于【#云计算入门与实践 - AWS】专栏中,收录 AWS 入门与实践相关博文。 本文同步于个人公众号:【 云计算洞察 】 更多关于云计算技术内容敬请关注:CSDN【#云计算入门与实践 - AWS】专栏。 本系列已更新博文: [ 云计算 | AWS 实践 ] Java 应用中使用 Amazon S3 进行存储桶

    2024年02月06日
    浏览(53)
  • AWS数据库简介

    主要介绍AWS里面的数据库服务,其中包括了AWS的关系数据库 RDS(Relational Database Service) 、非关系数据库 DynamoDB 、数据仓库和数据缓存的概念。 在我们深入了解AWS的数据库服务之前,首先让我们先来了解一下一些关于数据库的基本概念吧! 关系数据库,是建立在关系模型基

    2024年02月08日
    浏览(64)
  • 使用AWS Lambda函数的最佳实践!

    主题 函数代码 函数配置 指标和警报 处理流 安全最佳实践 有关 Lambda 应用程序最佳实践的更多信息,请参阅 Serverless Land 中的 Application design。 从核心逻辑中分离 Lambda 处理程序。这样您可以创建更容易进行单元测试的函数。在 Node.js 中可能如下所示: 利用执行环境重用来提

    2024年02月07日
    浏览(49)
  • 基于AWS云服务构建智能家居系统的最佳实践

    在当今智能家居时代,构建一个安全、高性能、可扩展和灵活的智能家居系统已经成为许多公司的目标。亚马逊网络服务(AWS)提供了一系列云服务,可以帮助企业轻松构建和管理智能家居系统。本文将探讨如何利用AWS云服务构建一个智能家居系统,并分享相关的最佳实践。 系统架

    2024年03月26日
    浏览(90)
  • AWS 中文入门开发教学 45- Cloud9 - Node.js的开发与调试

    在 Cloud9 环境中开发调试 Node.js 应用程序 cloud9还提供了一个非常好用的debug工具:

    2024年02月16日
    浏览(64)
  • 【AWS实验 】在 AWS Fargate 上使用 Amazon ECS 部署应用程序

    某团队正在开发一款在线游戏。乐观地认为该游戏会取得成功,并预计会有成千上万的游戏玩家通过互联网访问这款游戏。希望减少放在基础设施上的精力,更多地关注游戏开发。但不想分配任何前期基础设施资本来部署这款游戏。但是,想确保该应用程序在部署后可以针对

    2024年02月09日
    浏览(38)
  • [ 云计算 | AWS 实践 ] 使用 Java 更新现有 Amazon S3 对象

    本文收录于【#云计算入门与实践 - AWS】专栏中,收录 AWS 入门与实践相关博文。 本文同步于个人公众号:【 云计算洞察 】 更多关于云计算技术内容敬请关注:CSDN【#云计算入门与实践 - AWS】专栏。 本系列已更新博文: [ 云计算 | AWS 实践 ] Java 应用中使用 Amazon S3 进行存储桶

    2024年02月05日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包