Create infrastructure using AWS CDK
Write code once and create multiple environments with single code Create infrastructure using AWS CDK
Install AWS Client
Make sure you have installed “AWS Client” on your system if not you can use the following command to install
brew install awscli
once you have installed the AWS client to verify please type the following command on the terminal
aws configure
Then you will see the following prompt then input your AWS Access Key ID
for example:
AWS Access Key ID [None]: AKIAI44QH8DHBEXAMPLE
Once you hit enter/return then you will see the following prompt then you need to input AWS Secret Access Key
for example:
Secret Access Key [None]: je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
Once you hit enter/return then you will see the following prompt then you need to input Default region name
for example:
Default region name [None]: ap-southeast-1
Once you hit enter/return then you will see the following prompt then you need to input Default output format
for example:
Default output format [None]: json
After that, you can .aws directory under your username as shown in the following screenshot
Note: .aws is a hidden directory
AWS CDK
AWS CDK is an open source framework for creating and managing AWS resources. By using languages familiar to the developer such as TypeScript or Python, the Infrastructure as Code is described. In doing so, CDK synthesizes the code into AWS Cloudformation Templates and can optionally deploy them right away.
AWS CDK has been experiencing a steady increase in enthusiastic developers since 2019 and already has a strong and helpful community that is very active on Slack, for example. There is of course much more to say about AWS CDK and I recommend you explore it. Drop me a line if you have any questions.
Developers use the CDK framework in one of the supported programming languages to define reusable cloud components called constructs, which are composed together into stacks, forming a "CDK app".
They then use the AWS CDK CLI to interact with their CDK app. The CLI allows developers to synthesize artifacts such as AWS CloudFormation Templates, deploy stacks to development AWS accounts and "diff" against a deployed stack to understand the impact of a code change.
The AWS Construct Library includes a module for each AWS service with constructs that offer rich APIs that encapsulate the details of how to use AWS. The AWS Construct Library aims to reduce the complexity and glue-logic required when integrating various AWS services to achieve your goals on AWS.
Modules in the AWS Construct Library are designated Experimental while we build them; experimental modules may have breaking API changes in any release. After a module is designated Stable, it adheres to semantic versioning, and only major releases can have breaking changes. Each module's stability designation is available on its Overview page in the AWS CDK API Reference. For more information, see Versioning in the CDK Developer Guide.
At a glance
Install or update the AWS CDK CLI from npm (requires Node.js ≥ 14.15.0). We recommend using a version in Active LTS
$ npm i -g aws-cdk
(See Manual Installation for installing the CDK from a signed .zip file).
Initialize a project:
$ mkdir hello-cdk
$ cd hello-cdk
$ cdk init sample-app --language=typescript
This creates a sample project looking like this:
export class HelloCdkStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const queue = new sqs.Queue(this, 'HelloCdkQueue', {
visibilityTimeout: cdk.Duration.seconds(300)
});
const topic = new sns.Topic(this, 'HelloCdkTopic');
topic.addSubscription(new subs.SqsSubscription(queue));
}
}
Deploy this to your account:
$ cdk deploy
lets play with AWS arora serverless RDS
Arora is not same as RDS on AWS
Unlike RDS and Aurora Clusters, Aurora Serverless does not have a public endpoint. In fact, according to the documentation, there is no way to choose if the cluster should be public. This means working with the Aurora Serverless cluster can only be accomplished by:
- using a VPN into your VPC;
- running your application code in a VPC which you have access to;
- launching an EC2 instance and installing the MySQL client to work with the database; or
use the Aurora Web Data API.
- The first three options should be fairly well understood, This article is going to present the Web Data API to interface with your Aurora Cluster. Before we dive in, what is Aurora Serverless anyway?
Aurora Serverless
Aurora Serverless is built upon Amazon Aurora, which is a “built for the cloud” relational database supporting both MySQL and PostgreSQL. These two highly popular open-source databases are used by enterprises around the world. Aurora’s custom design makes it significantly faster than standard MySQL and PostgreSQL databases. Amazon Aurora is a fully managed database, available as part of the Amazon Relational Database Service.
Aurora Serverless builds on these capabilities by providing a “database in the cloud”, where the capabilities of Amazon Aurora are allocated and automatically scaled based upon your application’s demand. There are no “servers” deployed in your infrastructure and no database capacity for you to monitor and manage. This makes Aurora Serverless ideal for many types of applications, especially those with a transient workload.
Install the AWS CDK Toolkit globally using the following Node Package Manager command.
npm install -g aws-cdk
Run the following command to verify the correct installation and print the version number of the AWS CDK.
cdk --version
Create a CDK App Create a new directory aurora-cdk using the following command
mkdir aurora-cdk && cd aurora-cdk
from the above command, we have created the aurora-cdk directory and we will create the CDK App using TypeScript
You need to initialize the app using the cdk init command, specifying the desired template (“app”) and programming language.
Example:
cdk init app --language typescript
Once the app successfully created it will show you the All Done! as shown below
Now you will see there are a file aurora-cdk.ts under bin directory
Above file contain an instance of the AuroraCdkStack the implementation of that class is under the lib folder as shown below
Before creating new Instance & VPN we will do some refactoring and Renaming.
bin -> aurora-cdk.ts
We renamed from (AuroraCdkStack)
import { AuroraCdkStack } from '../lib/aurora-cdk-stack';
To (AuroraSlsStack)
import { AuroraSlsStack } from '../lib/aurora-cdk-stack';
// We refactored to the following code.
#!/usr/bin/env node
import 'source-map-support/register';
import cdk = require('@aws-cdk/core');
import { Aws, Construct } from '@aws-cdk/core';
import { AuroraSlsStack } from '../lib/aurora-cdk-stack';
const deploymentStage = 'aurora-sls-dev';
const defaultEnv: cdk.Environment = {
account: Aws.ACCOUNT_ID,
region: 'ap-southeast-1',
};
const app = new cdk.App();
class AuroraCdkStack extends Construct {
constructor(scope: Construct, id: string, env: cdk.Environment) {
super(scope, id);
new AuroraSlsStack(this, 'AuroraSlsStack', {env}, deploymentStage);
}
}
new AuroraCdkStack(app, deploymentStage, defaultEnv);
First, before creating Aurora instance we will create a VPC.
We need to add aws-ec2 package dependency. try to run following command
npm install @aws-cdk/aws-ec2
and for Aurora, Serverless Instance run the following command
npm install @aws-cdk/aws-rds
Here is the final version of following file aurora-cdk-stack.ts
lib -> aurora-cdk-stack.ts
import { CfnOutput, Construct, Stack, StackProps } from '@aws-cdk/core';
import { Vpc, SubnetType } from '@aws-cdk/aws-ec2';
import { CfnDBCluster, CfnDBSubnetGroup } from '@aws-cdk/aws-rds';
export class AuroraSlsStack extends Stack {
constructor(scope: Construct, id: string, props: StackProps, deploymentStage: string) {
super(scope, id, props);
// create vpc
const vpc = new Vpc(this, 'Vpc', {
cidr: '10.0.0.0/16',
natGateways: 0,
subnetConfiguration: [
{ name: 'aurora_isolated_', subnetType: SubnetType.ISOLATED }
]
});
// get subnetids from vpc
const subnetIds: string[] = [];
vpc.isolatedSubnets.forEach(subnet => {
subnetIds.push(subnet.subnetId);
});
// output subnet ids
new CfnOutput(this, 'VpcSubnetIds', {
value: JSON.stringify(subnetIds)
});
// output security group
new CfnOutput(this, 'VpcDefaultSecurityGroup', {
value: vpc.vpcDefaultSecurityGroup
});
// create subnetgroup
const dbSubnetGroup: CfnDBSubnetGroup = new CfnDBSubnetGroup(this, 'AuroraSubnetGroup', {
dbSubnetGroupDescription: 'Subnet group to access aurora',
dbSubnetGroupName: 'aurora-sls-subnet-group',
subnetIds
});
// create aurora db serverless cluster
const aurora = new CfnDBCluster(this, 'AuroraServerlessCdk', {
databaseName: 'dbname',
dbClusterIdentifier: 'aurora-sls',
engine: 'aurora',
engineMode: 'serverless',
masterUsername: 'masteruser',
masterUserPassword: 'IT_IS_SMART_TO_GENERATE_AND_OUTPUT_THIS',
port: 3306,
dbSubnetGroupName: dbSubnetGroup.dbSubnetGroupName,
scalingConfiguration: {
autoPause: true,
maxCapacity: 2,
minCapacity: 2,
secondsUntilAutoPause: 3600
}
});
//wait for subnet group to be created
aurora.addDependsOn(dbSubnetGroup);
// construct arn from available information
const account = props.env?.account;
const region = props.env?.region;
const auroraArn = `arn:aws:rds:${region}:${account}:cluster:${aurora.dbClusterIdentifier}`;
new CfnOutput(this, 'AuroraClusterArn', {
exportName: `${deploymentStage}`,
value: auroraArn
});
}
}
Build the App Try to run the following command.
npm run build
This will create compiled Javascript files as shown in the screenshots.
Then try to run following command
cdk synth
You will see it will return you the CloudFormation Template as shown below
Now, it’s time to Deploy the CDK Stack 🚀🚀🚀🚀 Try to run following command
cdk deploy
After successful deployment, it will show you the Output as shown below
Comments