Posted on :: 945 Words :: Tags: ,

Hôm nay mình sẽ hướng dẫn bạn bắt đầu với Cloud Development Kit for Terraform (CDKTF). Nói đơn giản, CDKTF cho phép bạn viết infrastructure code bằng các ngôn ngữ quen thuộc như TypeScript, Python, Java thay vì phải học HCL.

Infrastructure as Code (IaC) là gì?

Infrastructure as Code (IaC) là phương pháp quản lý hạ tầng bằng code thay vì config thủ công qua UI. Bạn viết config thành file, commit lên Git, và deploy tự động - đơn giản vậy thôi.

Tại sao nên dùng IaC?

  • Nhất quán: Mỗi lần deploy đều giống nhau, không lo lỗi do tay nhầm chuột.
  • Version control: Infrastructure của bạn nằm trong Git, muốn rollback hay review changes đều được.
  • Scale dễ dàng: Cần thêm 10 servers? Copy-paste rồi sửa vài dòng là xong.

IaC trên các nền tảng Cloud

  • AWS: Có CloudFormation và CDK để quản lý infrastructure.
  • Azure: Dùng ARM templates hoặc Bicep.
  • GCP: Có Deployment Manager và Terraform.

CDKTF mở rộng sức mạnh của Terraform bằng cách cho phép bạn viết code bằng ngôn ngữ lập trình thực sự. Điều này giúp quản lý và scale infrastructure trên AWS, Azure, GCP dễ dàng hơn nhiều.

Tại sao dùng CDKTF thay vì HCL?

HCL (HashiCorp Configuration Language) tuy mạnh và phổ biến, nhưng CDKTF có mấy ưu điểm vượt trội:

  1. Quen thuộc hơn: Dùng ngôn ngữ bạn đã biết (TypeScript, Python, Java) thay vì phải học thêm HCL. Learning curve giảm đáng kể.

  2. Tái sử dụng code: Bạn có toàn bộ power của programming language - functions, loops, conditionals. Viết code modular và DRY hơn nhiều.

  3. IDE support xịn hơn: Autocompletion, linting, debugging đầy đủ. Productivity tăng vọt.

  4. Tích hợp dễ: Dùng chung codebase với app code, gọi library có sẵn, không phải tách riêng infrastructure ra.

  5. Testing: Viết unit test cho infrastructure code bằng framework quen thuộc. Đảm bảo config đúng trước khi deploy.

Chuẩn bị

Đảm bảo bạn đã cài:

  • Node.js và npm
  • Terraform
  • CDKTF CLI

Bước 1: Cài CDKTF CLI

Cài global qua npm:

npm install --global cdktf-cli@latest

Bước 2: Init project mới

Tạo folder và khởi tạo project:

mkdir my-cdktf-project
cd my-cdktf-project

Init CDKTF project:

cdktf init --template="typescript"

Lệnh này sẽ setup project CDKTF với TypeScript.

Bước 3: Viết infrastructure code

Mở file main.ts - đây là nơi bạn định nghĩa infrastructure. Ví dụ tạo một S3 bucket trên AWS:

import { Construct } from "constructs";
import { App, TerraformStack } from "cdktf";
import { AwsProvider, S3Bucket } from "@cdktf/provider-aws";

class MyStack extends TerraformStack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    new AwsProvider(this, "AWS", {
      region: "us-west-2",
    });

    new S3Bucket(this, "MyBucket", {
      bucket: "my-cdktf-bucket",
    });
  }
}

const app = new App();
new MyStack(app, "my-stack");
app.synth();

Bước 4: Deploy

Deploy infrastructure lên cloud:

cdktf get
cdktf deploy

Xử lý Module chưa có CDKTF native support

Đôi khi bạn muốn dùng một Terraform module nhưng nó chưa có CDKTF binding. Không sao, bạn vẫn dùng được bằng cách thêm vào cdktf.json và generate code.

Ví dụ: Dùng Terraform Module không có native support

Giả sử bạn muốn dùng module quản lý IAM roles từ Terraform registry nhưng chưa có CDKTF package. Làm như sau:

  1. Thêm module vào cdktf.json

    Mở cdktf.json và thêm vào terraformModules:

    {
      "language": "typescript",
      "app": "npx ts-node main.ts",
      "terraformProviders": ["hashicorp/aws@~> 3.0"],
      "terraformModules": [
        {
          "name": "iam-role",
          "source": "terraform-aws-modules/iam/aws//modules/iam-role",
          "version": "~> 4.0"
        }
      ]
    }
    
  2. Generate code

    Chạy lệnh này để generate TypeScript code từ module:

    cdktf get
    

    CDKTF sẽ tự động generate code cho module vào folder .gen.

  3. Sử dụng module đã generate

    import { Construct } from "constructs";
    import { App, TerraformStack } from "cdktf";
    import { AwsProvider } from "@cdktf/provider-aws";
    import { IamRole } from "./.gen/modules/iam-role";
    
    class MyStack extends TerraformStack {
      constructor(scope: Construct, id: string) {
        super(scope, id);
        new AwsProvider(this, "AWS", {
          region: "us-west-2",
        });
    
        new IamRole(this, "IAMRole", {
          name: "my-iam-role",
          // Thêm config khác ở đây
        });
      }
    }
    

    Update main.ts:

    const app = new App();
    new MyStack(app, "my-stack");
    app.synth();
    

    Chạy cdktf get để install provider, sau đó cdktf deploy để deploy lên AWS.

    Bằng cách thêm module vào cdktf.json và chạy cdktf get, bạn có thể generate code cho bất kỳ Terraform module nào, kể cả những module chưa có CDKTF package chính thức.

Mẹo hay

Mẹo!

Docs chính thức khuyên nên tách infrastructure thành nhiều stacks (network stack, VM stack, etc.). Nhưng theo kinh nghiệm của mình, mỗi stack có file lock-state riêng nên khi deploy nhiều stack cùng lúc, nếu một stack fail thì các stack khác cũng bị terminate nhưng lock file không tự xóa. Phải vào xóa tay, rất phiền.

Mình thấy cách tốt hơn là tách thành modules thay vì stacks. App của bạn nên nằm trong một stack duy nhất (giống cách dùng HCL truyền thống).

Mẹo!

Aspects rất hữu ích để modify nhiều resources cùng lúc, giúp đảm bảo consistency.

Tài liệu: Aspects

Tài liệu tham khảo

Kết

Xong rồi! Bạn vừa tạo và deploy thành công project CDKTF đầu tiên. CDKTF giúp việc viết và quản lý infrastructure code trở nên đơn giản hơn nhiều nhờ dùng ngôn ngữ lập trình quen thuộc. Happy coding!