In this article, I introduce Amazon CDK and how to write AWS infrastructure-as-code using TypeScript. We will do it step by step.
AWS Cloud Development Kit (AWS CDK) accelerates cloud development using common programming languages to model your applications.
Step 1: Open command/terminal or PowerShell window
Step 2: Check node is installed or not. (If not installed, please visit the link to download some settings)
npm --version
Step 3: Check AWS CLI is installed or not
aws --version
Step 4: Install the AWS CDK CLI.
Use the npm command below to install the AWS CDK CLI.
npm install -g aws-cdk
Step 5: Verify AWS CDK is installed
cdk
Step 6: Create a CDK project
mkdir agapifa cd agapifa
Step 7: Create the package.json
{ "name": "agapifa", "version": "1.0.0", "description": "", "scripts": { "build": "npx tsc", "start": "npm run build -w", "cdk": "cdk", "diff": "npx aws-cdk diff", "deploy": "npx aws-cdk deploy", "destroy": "npx aws-cdk destroy", "lint": "eslint .", "lint:fix": "eslint --fix", "format": "prettier --write './**/*.{js,jsx,ts,tsx,css,md,json}' --config ./.prettierrc" }, "author": "", "license": "ISC", "devDependencies": { "@trivago/prettier-plugin-sort-imports": "^4.0.0", "@types/node": "^18.13.0", "@typescript-eslint/eslint-plugin": "^5.51.0", "aws-cdk": "^2.73.0", "eslint": "^8.34.0", "eslint-config-prettier": "^8.6.0", "eslint-config-standard-with-typescript": "^34.0.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-prettier": "^4.2.1", "prettier": "^2.8.4", "ts-node": "^10.9.1", "typescript": "^4.9.5" }, "dependencies": { "aws-cdk-lib": "^2.73.0", "constructs": "^10.1.306", "eslint-plugin-n": "^15.6.1", "eslint-plugin-promise": "^6.1.1", "source-map-support": "^0.5.21" } }
Step 8: Create tsconfig.json
{ "compilerOptions": { "noImplicitAny": false, "emitDecoratorMetadata": true, "experimentalDecorators": true, "target": "es2017", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "strict": true, "forceConsistentCasingInFileNames": true, "noEmit": true, "esModuleInterop": true, "module": "commonjs", "moduleResolution": "node", "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", "incremental": true, "baseUrl": "./", "rootDir": "./", "outDir": "./dist", "strictPropertyInitialization": false, "paths": { "@/*": ["src/*"] } }, "include": ["**/*.ts"], "exclude": ["node_modules", "**/node_modules/*", "cdk.out"] }
Step 9: Create cdk.json
{ "app": "npx ts-node --prefer-ts-exts lib/index.ts", "context": { "@aws-cdk/core:newStyleStackSynthesis": "true", "@aws-cdk/core:bootstrapQualifier": "hnb659fds" } }
Step 10: Code. (Create a directory tree like this)
Step 11: Add code to the file lib/index.ts
#!/usr/bin/env node import { App } from 'aws-cdk-lib'; import { Construct } from 'constructs'; import apiStack from './stacks/api-stack'; class AgapifaApp extends Construct { constructor(scope: App, id: string) { super(scope, id); // API Stack new apiStack(this, `${id}-ApiStack`, { stackName: `${id}-ApiStack`, }); } } const app = new App(); new AgapifaApp(app, 'Agapifa');
Step 12: Add the below content in lib/stacks/api-stack.ts
import { Stack, StackProps } from 'aws-cdk-lib'; import { Construct } from 'constructs'; import S3Resource from '../../lib/resources/s3'; class ApiStack extends Stack { constructor(scope: Construct, id: string, props: StackProps) { super(scope, id, props); new S3Resource(this, `${id}-S3`, {}).setupBucket('images').setupPolicies().build(); } } export default ApiStack;
Step 13: Add content to lib/resources/s3/index.ts
import { Stack, StackProps, aws_iam as iam, aws_s3 as s3 } from 'aws-cdk-lib'; class S3Resource { private _s3Bucket: s3.Bucket; private _scope: Stack; private _scopeId: string; constructor(scope: Stack, id: string, props: StackProps) { this._scope = scope; this._scopeId = id; } setupBucket(bucketName: string) { this._s3Bucket = new s3.Bucket(this._scope, `${this._scopeId}-${bucketName}`, { bucketName: `${this._scopeId}-${bucketName}`.toLocaleLowerCase(), accessControl: s3.BucketAccessControl.BUCKET_OWNER_FULL_CONTROL, blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL, encryption: s3.BucketEncryption.S3_MANAGED, }); return this; } setupPolicies() { this._s3Bucket.addToResourcePolicy( new iam.PolicyStatement({ actions: ['*'], principals: [new iam.AnyPrincipal()], resources: [this._s3Bucket.bucketArn, this._s3Bucket.arnForObjects('*')], }), ); return this; } build() { return this._s3Bucket; } } export default S3Resource;
Step 14: Build the AWS CDK application
yarn build
Step 15: Deploy the AWS CDK application
*** You need to bootstrap the AWS CDK application before you can deploy it to AWS
cdk bootstrap --profile agapifa
Once you've installed it, you can continue with the deployment of the AWS CDK application.
cdk deploy --profile agapifa
Step 16: Check on the console
In this tutorial, you learned how to install the AWS CDK, set up and initialize an AWS CDK project, assemble it into a CloudFormation template, and deploy to AWS Cloud. If you want to remove the newly created stack from your AWS account, run the following command
cdk destroy --profile agapifa
Good luck with your installation!!!
--------------------------------
Reference documents: