TS를 사용하여 CDK 위에 Aurora MySQL 생성
29783 단어 typescriptcloudawstutorial
오로라는 무엇입니까?
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는 굉장하기 때문에 여러분이 이것을 즐기고 깊이 이해하기를 바랍니다.
Reference
이 문제에 관하여(TS를 사용하여 CDK 위에 Aurora MySQL 생성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/wakeupmh/create-aurora-mysql-on-top-of-cdk-with-ts-3949텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)