
IaC hay Infrastructure As Code, là một thuật ngữ nói về cơ sở hạ tầng được định nghĩa dưới dạng code, Infrastructure ở đây có nghĩa là những gì mà bạn sẽ sử dụng, và bạn định nghĩa những thứ đó dưới dạng code, sau đó bạn đưa code đó cho provider, và họ sẽ đưa cho bạn đúng những gì mà bạn yêu cầu, provider ở đây có thể là cloud provider như AWS, Azure, GCP, hoặc bạn không dùng cloud thì ở data center cũng có một số provider như Openstack, vsphere. còn nếu bạn tự build một con server nhỏ, dùng ansible để cài cắm cấu hình server, deploy app thì dùng docker, thì đó cũng là một dạng của IaC.
Dự án gần đây nhất mình sử dụng tools IaC là Cloudformation, khi làm việc với CloudFomation, trãi nghiệm khá là chán, CloudFomation dùng ngôn ngữ yaml, nó hổ trợ một vài build-in function để đọc, lấy data từ các resource khác, ngoài ra không có hổ trợ vòng lặp, nếu bạn muốn tạo resoủce thì bạn phải lặp lại code rất nhiều điều đó dẫn đến bạn phải làm việc với một file yaml khá là dài lên đến vài nghìn dòng, đúng là một trải nghiệm cực hình, nó xứng đáng với tên gọi là Infrastructure As Text.
Input được đưa vào dưới dạng parammeter, ngoài ra bạn có thêm một tùy chọn khác là lấy parammeter store (một service lưu trử parammeter dưới dạng alias).
Làm việc với CloudFomation là bạn sẽ làm việc với từng stack, các stack sẽ được một stack cha( stack master) quản lý, và việc truyền output từ stack này sang stack khác sẻ phụ thuộc vào stack cha, tùy thuộc vào độ sâu của stack thì độ phức tạp khi lấy output của stack sẽ tăng lên.
LONO
Trong lúc chán nản mình đã research và tìm thấy LONO
Tools này mình thấy cũng khá hay, cũng phù hợp với team mình, một team đã khá quen thuộc với Cloudformation cũng có thể dễ dang mapping sang LONO. Bù lại phải học một số cú pháp cơ bản của Ruby.
Thời gian mình học Ruby và LONO cũng tầm 1 tháng, project sau một thời gian ngâm cứu thì cũng đã hoàn thiện.
Bén duyên với CDK
Thằng bàn bên thấy mình ngày ngày cặm cụi với Ruby cũng tò mò tìm hiểu, rồi nó phán một câu CDK giờ mới là trend, thế là mình cũng tìm hiểu thử CDK, CDK là một thư viện dùng để provisioning hạ tầng trên cloud thông qua ngôn ngữ lập trình như Typescript, javascript, Python, Java, C#…
Mình quyết định sử dụng Typescript vì được cộng đồng support nhiều nhất, cú pháp nghe đồn là một bản nâng cấp của javascript, mà nghe cái gì tốt, tối tân là mình theo thôi :v
Project đầu tiên
Mình coi cú pháp của javascript cơ bản trong vòng hai ngày, sau đó chuyển qua Typescript, cửi ngựa xem hoa được một lúc, mình quyết định làm một project nho nhỏ để luyện syntax, chứ xem không mà không thực hành thì sao mà nhớ 🙂
Project này mình sẽ tạo vpc và subnet, để tăng độ khó cho game thì mình sẽ dùng một file XLSX để quản lý vpc và subnet bao gồm tên, ciddr, az.
file sẽ trông như thế này.

Ý tưởng là mình sẽ đọc nội dung của file này sau đó lấy thông tin của vpc và subnet. Dùng CDK để provisioning resource từ các thông tin này.
Function đọc file XLSX
với các syntax cơ bản cộng với tính cần cù chịu khó lục lọi stackoverflow 🙂
import * as dir from "path";
import * as xlsx from "xlsx";
// define interface object for json prasing.
interface resourceObj {
VPC?: string;
Subnet: string;
Cidr: string;
AZ: number;
Mode: string;
}
// define module read xlsx file
export function xlsxReader(sheetIndex: number) {
// initialize the array as empty.
const sheetArr: resourceObj[] = [];
// read xlsx file.
const filePath = dir.resolve("./data", "data.xlsx");
const workbook = xlsx.readFile(filePath);
const sheetNames = workbook.SheetNames;
// convert sheet to json with sheet index.
const convertToJson = xlsx.utils.sheet_to_json(
workbook.Sheets[sheetNames[sheetIndex]],
{ raw: true }
);
// push oject to array.
convertToJson.forEach((obj: resourceObj) => {
sheetArr.push(obj);
});
return sheetArr;
}
Function tạo vpc và subnet
import * as ec2 from "aws-cdk-lib/aws-ec2";
import * as cdk from "aws-cdk-lib";
import { xlsxReader } from "../data/prasing_data";
// define tags for system and env.
const StageName: string = 'dev';
const SystemName: string = 'network';
const ProjectName: string = 'quannhm';
export class CdkStarterStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// get vpc cidr on file xlsx with sheet index 0.
let vpcCidr = xlsxReader(0)[0].VPC;
// create vpc with constructor level 1.
const vpc = new ec2.CfnVPC(this, "VPC", {
cidrBlock: `${vpcCidr}`,
enableDnsSupport: true,
enableDnsHostnames: true,
instanceTenancy: "default",
tags: [{
key: 'Name',
value: [ProjectName, StageName, SystemName, 'vpc'].join('-')
}]
});
// get subnet cidr on file xlsx with sheet index 0.
xlsxReader(0).forEach(subnetOjb => {
// declare var for subnet.
const subnetCidr: string = subnetOjb.Cidr;
const az: number = subnetOjb.AZ;
const subnetName: string = subnetOjb.Subnet;
const resourceName: string = subnetName.split('-').map(name =>
name[0].toUpperCase() + name.substring(1)).join('')
// create subnets.
const subnets = new ec2.CfnSubnet(this, resourceName, {
availabilityZone: this.availabilityZones[az],
cidrBlock: `${subnetCidr}`,
mapPublicIpOnLaunch: false,
vpcId: vpc.ref,
tags: [{
key: 'Name',
value: [ProjectName, StageName, SystemName, subnetName].join('-')
}]
});
// crate outputs subnets.
new cdk.CfnOutput(this, `${resourceName}Id`, {
value: subnets.attrId
});
});
}
}
Chỉ đơn giản vậy thôi, sau khi viết xong thì mình sẽ dùng lệnh để gen ra Cloudformation để kiểm tra xem code có chạy đúng không.
Đánh giá chung
Cứ ngỡ là thoát được Cloudformation, vẫn lấp ló bóng dáng nó ở đây, chắc có lẽ dùng để tạo changset integrate với codepipeline chăng.

Cú pháp Javascript cũng như Typescript cũng tương đối dễ học, dễ làm quen.
Tận dụng được hết sức mạnh của một ngôn ngữ lập trình, thay vì dùng một số ngôn ngữ lập trình giả cầy như Cloudformation 🙂
So với Terraform thì phải so sánh với ngôn ngữ HCL, cũng cần phải nhắc lại là có hai kiểu lập trình là Declarative và Imperative, phương pháp Declarative trả lời cho câu hỏi What bằng cách tập trung vào việc mô tả kiến trúc hạ tầng mà người sử dụng muốn. Phương pháp Imperative tập trung cho câu hỏi How, qua việc định nghĩa trạng thái mong muốn và các bước hệ thống cần thực hiện để đạt được trạng thái đó. Thì Terraform nó còn hơi lấp lững giữa hai kiểu trên còn CDK thì thiên hẵn về Imperative.
Hay nói cho đơn giãn là CDK là Infra is code, còn Terraform là Infar as code.