TS를 사용하여 CDK 위에 Aurora MySQL 생성

이 게시물에는 TypeScript 위에 CDK를 사용하여 자신만의 Aurora MySQL을 생성하는 방법에 대한 몇 가지 정보를 전파하기 위한 제안이 포함되어 있습니다.



오로라는 무엇입니까?



Amazon Aurora MySQL은 고급 상용 데이터베이스의 속도 및 안정성과 오픈 소스 데이터베이스의 단순성 및 비용 효율성을 결합한 완전 관리형 MySQL 호환 관계형 데이터베이스 엔진입니다.
Aurora MySQL은 MySQL을 즉시 대체합니다. 신규 및 기존 MySQL 배포를 간단하고 비용 효율적으로 설정, 운영 및 확장할 수 있으므로 비즈니스와 애플리케이션에 집중할 수 있습니다. Amazon RDS는 프로비저닝, 패치 적용, 백업, 복구, 장애 감지 및 복구와 같은 일상적인 데이터베이스 작업을 처리하여 Aurora에 대한 관리를 제공합니다. 또한 Amazon RDS는 Aurorayou can read about it in the docs에 대해 자세히 살펴보려는 경우 기존 Amazon RDS for MySQL 애플리케이션을 Aurora MySQL로 변환하는 푸시 버튼 마이그레이션 도구를 제공합니다.

CDK란?



IaC와 유사한 terraform 또는 pulumi AWS CDK는 코드에서 클라우드 인프라를 정의하고 AWS CloudFormation을 통해 프로비저닝하기 위한 프레임워크입니다.
AWS CDK를 사용하면 CDKhere에 대해 자세히 볼 수 있는 프로그래밍 언어의 상당한 표현력을 통해 클라우드에서 안정적이고 확장 가능하며 비용 효율적인 애플리케이션을 구축할 수 있습니다.

손을 더럽힐 시간입니다!!!




이 간단한 자습서에서는 CDK v2를 사용할 것이므로 Typescript를 사용하여 프로젝트를 만들어야 합니다. Typescript에 이미 익숙하다고 가정하고 TS 프로젝트 구성에 대한 초기 단계는 건너뜁니다.

다음 패키지를 설치해야 합니까?

  • aws-cdk 도구 키트는 AWS CDK 애플리케이션 작업에 사용할 수 있는 cdk 명령줄 인터페이스를 제공합니다.

  • constructs은 "시스템 상태의 일부"
  • 를 정의하는 클래스입니다.

  • aws-cdk-lib 라이브러리는 CDK 응용 프로그램을 정의하고 응용 프로그램에 CDK 구조를 추가하는 API를 제공합니다.

  • npm i aws-cdk aws-cdk-lib constructs
    

    이제 app.ts라는 파일 또는 인프라를 나타내는 파일을 만들고 이 파일에서 constructs에서 확장되는 클래스를 만들고 구성된 그래프의 빌딩 블록을 나타냅니다.

    app.ts



    import { Environment } from 'aws-cdk-lib'
    import { Construct } from 'constructs'
    
    import { AuroraMySqlStorage } from '../stacks/aurora-mysql-storage.stack'
    export interface DatabaseProps {
      env: Environment
      variables?: any
    }
    
    export class DatabaseAuroraApp extends Construct {
      constructor(scope: Construct, id: string, props: DatabaseProps) {
        super(scope, id)
    
        new AuroraMySqlStorage(this, 'my-first-database', {
          stackName: 'my-first-database-stack',
          env: props.env,
          variables: props.variables,
          databaseName: 'my-first-database',
        })
      }
    }
    
    

    Cloudformation에서 스택은 단일 단위로 관리할 수 있는 AWS 리소스 모음입니다.

    즉, 스택을 생성, 업데이트 또는 삭제하여 리소스 모음을 생성, 업데이트 또는 삭제할 수 있습니다. 스택의 모든 리소스는 스택의 AWS CloudFormation 템플릿에 의해 정의됩니다.

    예를 들어 스택에는 웹 서버, 데이터베이스 및 네트워킹 규칙과 같은 웹 애플리케이션을 실행하는 데 필요한 모든 리소스가 포함될 수 있습니다. 해당 웹 애플리케이션이 더 이상 필요하지 않은 경우 스택을 삭제하면 됩니다. 그러면 관련 리소스가 모두 삭제됩니다.

    따라서 위의 코드에서는 Aurora MySQL 스택을 생성하고 있습니다. stacks라는 폴더와 이 폴더 안에 Aurora MySQL 클러스터 자체와 리소스를 나타내는 aurora-mysql-storage.stack.ts라는 파일을 생성하겠습니다.

    스택/aurora-mysql-storage.stack.ts



    import { StackProps, Environment, Stack } from 'aws-cdk-lib'
    import { IVpc, Vpc } from 'aws-cdk-lib/aws-ec2'
    import { Construct } from 'constructs'
    
    import { DatabaseAuroraMySQLStorage } from '../lib/database-aurora-mysql-storage'
    
    export interface IStorageStackProps extends StackProps {
      variables?: any
      env: Environment
      databaseName: string
    }
    
    export class AuroraMySqlStorage extends Stack {
      constructor(scope: Construct, id: string, props: IStorageStackProps) {
        super(scope, id, props)
    
        const vpc: IVpc = Vpc.fromLookup(this, 'vpc', {
          tags: { vpcIdentity: 'my-vpc' },
        })
    
        new DatabaseAuroraMySQLStorage(this, 'my-first-database-storage', {
          variables: props.variables,
          env: props.env,
          databaseName: props.databaseName,
          vpc,
        })
      }
    }
    

    lib 폴더에서 오로라 생성 자체를 나타내는 파일을 만듭니다.

    lib/database-aurora-mysql-storage.ts



    import { Environment, Duration, RemovalPolicy } from 'aws-cdk-lib'
    import { InstanceType, IVpc, SecurityGroup, SubnetType } from 'aws-cdk-lib/aws-ec2'
    import { RetentionDays } from 'aws-cdk-lib/aws-logs'
    import {
      DatabaseClusterEngine,
      SubnetGroup,
      DatabaseCluster,
      ParameterGroup,
      AuroraMysqlEngineVersion,
    } from 'aws-cdk-lib/aws-rds'
    import { Secret } from 'aws-cdk-lib/aws-secretsmanager'
    import { Construct } from 'constructs'
    
    export interface DatabaseAuroraAppProps {
      env: Environment
      variables?: any
      databaseName: string
      vpc: IVpc
    }
    
    export class DatabaseAuroraMySQLStorage extends Construct {
      variables: any
      instanceName: string
    
      constructor(scope: Construct, id: string, props: DatabaseAuroraAppProps) {
        super(scope, id)
    
        this.variables = props.variables
        this.instanceName = `${props.databaseName}-aurora-mysql`
        const databaseUsername = 'admin'
        const clusterName = `${this.instanceName}-cluster-aurora-mysql`
    
        const securityGroup = new SecurityGroup(this, id.concat(`${this.instanceName}-sg`), {
          vpc: props.vpc,
          description: `${this.instanceName}-instance-sg`,
          securityGroupName: `${this.instanceName}-instance-sg`,
          allowAllOutbound: true,
        })
    
        const databaseCredentialsSecret = new Secret(this, 'DBCredentialsSecret', {
          secretName: `${this.instanceName}-credentials`,
          generateSecretString: {
            secretStringTemplate: JSON.stringify({
              username: databaseUsername,
            }),
            excludePunctuation: true,
            includeSpace: false,
            generateStringKey: 'password',
          },
        })
        /** Version "8.0.mysql_aurora.3.01.0". */
        const dbEngine = DatabaseClusterEngine.auroraMysql({ version: AuroraMysqlEngineVersion.VER_3_01_0 })
        /**
         let's suppose you need to create a trigger on your database,
         this custom parameter group it's responsible to perform this with the following parameter log_bin_trust_function_creators,
         because the default parameter group is not editable
        */
        const parameterGroupForInstance = new ParameterGroup(
          this,
          `${this.instanceName}-${dbEngine.engineVersion?.fullVersion}`,
          {
            engine: dbEngine,
            description: `Aurora RDS Instance Parameter Group for database ${this.instanceName}`,
            parameters: {
              log_bin_trust_function_creators: '1',
            },
          },
        )
        new DatabaseCluster(this, clusterName, {
          engine: dbEngine,
          instanceProps: {
            instanceType: new InstanceType('t3.small'),
            vpc: props.vpc,
            vpcSubnets: {
              subnetType: SubnetType.PRIVATE_ISOLATED,
            },
            securityGroups: [securityGroup],
            parameterGroup: parameterGroupForInstance,
          },
          backup: {
            retention: Duration.days(RetentionDays.ONE_WEEK),
            preferredWindow: '03:00-04:00',
          },
          credentials: {
            username: databaseUsername,
            password: databaseCredentialsSecret.secretValueFromJson('password'),
          },
          instances: 1,
          cloudwatchLogsRetention: RetentionDays.ONE_WEEK,
          defaultDatabaseName: props.databaseName,
          iamAuthentication: false,
          clusterIdentifier: 'my-first-aurora-cluster',
          subnetGroup: this.createSubnetGroup(props.vpc),
        })
      }
    
      // you need to create a subnet group for your database
      private createSubnetGroup(vpc: IVpc) {
        return new SubnetGroup(this, 'aurora-rds-subnet-group', {
          description: `Aurora RDS Subnet Group for database ${this.instanceName}`,
          subnetGroupName: 'aurora-rds-subnet-group',
          vpc,
          removalPolicy: RemovalPolicy.DESTROY,
          vpcSubnets: {
            subnets: vpc.isolatedSubnets,
          },
        })
      }
    }
    

    이제 루트 파일에 진입점을 생성해야 합니다. 저는 창의성이 별로 없어서 이것을 startup.ts라고 했습니다.

    시작.ts



    #!/usr/bin/env node
    import { App } from 'aws-cdk-lib'
    /**
     *This module provides source map support for stack traces in node via the V8 stack trace API.
     It uses the source-map module to replace the paths and line numbers of source-mapped files
     with their original paths and line numbers. The output mimics the node's stack trace format
     with the goal of making every compile-to-JS language more of a first-class citizen.
     Source maps are completely general (not specific to any one language)
      so you can use source maps with multiple compile-to-JS languages in the same node process.
     */
    import 'source-map-support/register'
    import { DatabaseAuroraApp } from './lib/app.ts'
    
    const app = new App()
    
    new DatabaseAuroraApp(app, 'my-database', {
      env: someEnvConfigGoesHere,
      variables: someVariablesGoesHere,
    })
    /** 
    Synthesize this stage into a cloud assembly.
    */
    app.synth()
    

    이제 package.json에 다음 스크립트를 추가할 수 있습니다.

    "build:cdk": "npx cdk synth", //this can validate your cdk
    "diff:cdk": "npx cdk diff", //this can see all diffs
    "deploy:cdk": "npx cdk deploy --all --ci --no-previous-parameters", //this can deploy
    


    CDK는 훌륭한 도구이고 벤더 잠금이 있지만 AWS는 굉장하기 때문에 여러분이 이것을 즐기고 깊이 이해하기를 바랍니다.

    좋은 웹페이지 즐겨찾기