DevOps AI
  • Home
  • Bảo mật
  • AI & Automation
  • DevOps & Cloud
  • Bộ đề luyện thi cloud
No Result
View All Result
DevOpsAI
  • Home
  • Bảo mật
  • AI & Automation
  • DevOps & Cloud
  • Bộ đề luyện thi cloud
No Result
View All Result
DevOpsAI
No Result
View All Result
Home DevOps & Cloud

Tạo subnet trong CDK

best practice khi tạo subnets với CDK

Quân Nguyễn by Quân Nguyễn
25 Tháng 4, 2025
in DevOps & Cloud
0
Share on FacebookShare on Twitter

Trong bài viết trước mình đã refactoring source code, nếu bạn chưa xem thì có thể xem lại ở đây để hiểu hơn.



Bài viết trước


Cấu hình đa môi trường cho CDK app

Trong bài viết này mình xin chia sẽ cách mình dùng CDK để tạo subnets. 

Related Post

cdk terraform

CDK cho Terraform

29 Tháng 4, 2025
Ưu Đãi Đặc Biệt: Nhận Ngay Coupon Giảm 25% cho Bộ Đề Luyện Thi Cloud!

Ưu Đãi Đặc Biệt: Nhận Ngay Coupon Giảm 25% cho Bộ Đề Luyện Thi Cloud!

29 Tháng 4, 2025

Đổi MTU cho Calico trong Kubernetes

30 Tháng 4, 2025

Tắt NLA trên Amazon EC2 Windows instance

30 Tháng 4, 2025

Subnets

Mình cần tạo những subnets như sau.

Subnet nameCidrAZ
public-subnet-1a10.90.16.0/280
public-subnet-1c10.90.16.16/281
vitaldb-subnet-1a10.90.16.32/280
vitaldb-subnet-1c10.90.16.48/281
mobilecachedb-subnet-1a10.90.16.64/280
mobilecachedb-subnet-1c10.90.16.80/281
admindb-subnet-1a10.90.16.96/280
admindb-subnet-1c10.90.16.112/281
register-subnet-1a10.90.16.128/280
register-subnet-1c10.90.16.144/281
admin-subnet-1a10.90.16.160/280
admin-subnet-1c10.90.16.176/281
mobile-subnet-1a10.90.16.192/280
mobile-subnet-1c10.90.16.208/281
vitalwebhook-subnet-1a10.90.16.224/280
vitalwebhook-subnet-1c10.90.16.240/281
vital-transform-subnet-1a10.90.17.0/280
vital-transform-subnet-1c10.90.17.16/281
vital-parsing-subnet-1a10.90.17.32/280
vital-parsing-subnet-1c10.90.17.48/281
vital-raw-subnet-1a10.90.17.64/280
vital-raw-subnet-1c10.90.17.80/281
vital-job-subnet-1a10.90.17.96/280
vital-job-subnet-1c10.90.17.112/281
common-services-subnet-1a10.90.17.128/280
common-services-subnet-1c10.90.17.144/281

mình có ba thông tin về mỗi subnet:

  1. tên subnet
  2. cidr subnet
  3. az của subnet

thông tin này là đủ để mình có thể tạo đc subnets.

 Quy tắt đặt tên Logical ID và tag

Mình sẽ sử dụng CfnSubnet trong constructor này mình muốn chỉ định Logical ID là dạng viết hoa chử cái đầu và viết liền của tên subnet.

ví dụ: public-subnet-1a => PublicSubnet1a

còn tên subnet dùng để đánh tag:

<tên project>-<tên môi trường>-<tên stack>-<tên subnet>

từ bài viết này trở về sau mình để sẽ tuân thủ quy tắt này.

Khởi tạo props

Mình sẽ tạo thêm một props trong class Resource (đã được giải thích trong bài trước) dùng cho việc format tên subnet thành tên Logical ID như quy tắt ở trên.

Mình cảm thấy đây là một lợi ích lớn khi mình chuyển qua dùng CDK  vì mọi định dạng hay quy tắt mình đều có thể triển khai thông qua code, từ đó nó được đồng bộ trên tất cả thành viên trong dự án.

mình sẽ thêm props Format  trong file lib/resources/abstract/index.ts

				
					import { Construct } from 'constructs';
import * as cdk from "aws-cdk-lib";
export abstract class Resource {
    constructor() {}
    protected createTagName(scope: Construct, ProjectName: string, StageName: string, stackname: string, originalName: string): string {
        return [
            ProjectName,
            StageName,
            stackname,
            originalName,
        ].join('-');
    }
    protected Format(scope: Construct, name: string): string {
        return name
            .split('-')
            .map((name) => name[0].toUpperCase() + name.substring(1))
            .join('');
    }
    // protected FomatId(scope: Construct, id: number): string {
    //     return ('00' + id).slice(-3);
    // }
}

				
			

tạo file lib/resources/subnet.ts với nội dung như sau

				
					import * as ec2 from 'aws-cdk-lib/aws-ec2';
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { BaseResource } from './abstract';
import { Vpc } from './vpc';
export interface ResourceInfo {
    readonly id: string;
    readonly cidrBlock: string;
    readonly availabilityZone: string;
    readonly assign: (subnet: ec2.CfnSubnet) => void;
}
				
			

Mình dùng interface ResourceInfo để định nghĩa các thông tin cua subnets

assign: (subnet: ec2.CfnSubnet) => void; dùng để gán lại giá trị của subnet thành một props cảu class subnet.Điều này là có lợi cho các công việ như lấy ID của subnet để tạo các tài nguyên khác về sau này, chỉ cần import class subnet sau đó bạn có thể truy cập vào các subnet cần dùng.Ví dụ: mình đã import Class vpc để truy cập vào thuộc tính VPC ID nhằm mục đích tạo subnet.

import { Vpc } from ‘./vpc’;

Tăng trãi nghiệm.đối với Cloudformation hay thậm chí terraform, để có được thông tin của tài nguyên như ID, ARN chúng ta cần phải tạo output và sau đó để sử dụng cần phải đảm bảo là output phải luôn có sẳn, nhưng đối với CDK chúng ta có thể dễ dàng kiểm tra được điều đó mỗi khi cũng tạo call class sau đó nhấn dấu chấm, rất tuyệt đúng không! tiếp theo đến phần tạo class

				
					export class SN extends BaseResource {
    public public1a: ec2.CfnSubnet;
    public public1c: ec2.CfnSubnet;
    public vitaldb1a: ec2.CfnSubnet;
    public vitaldb1c: ec2.CfnSubnet;
    public mobilecachedb1a: ec2.CfnSubnet;
    public mobilecachedb1c: ec2.CfnSubnet;
    public admindb1a: ec2.CfnSubnet;
    public admindb1c: ec2.CfnSubnet;
    public register1a: ec2.CfnSubnet;
    public register1c: ec2.CfnSubnet;
    public admin1a: ec2.CfnSubnet;
    public admin1c: ec2.CfnSubnet;
    public mobile1a: ec2.CfnSubnet;
    public mobile1c: ec2.CfnSubnet;
    public vitalwebhook1a: ec2.CfnSubnet;
    public vitalwebhook1c: ec2.CfnSubnet;
    public vitaltransform1a: ec2.CfnSubnet;
    public vitaltransform1c: ec2.CfnSubnet;
    public vitalparsing1a: ec2.CfnSubnet;
    public vitalparsing1c: ec2.CfnSubnet;
    public vitalraw1a: ec2.CfnSubnet;
    public vitalraw1c: ec2.CfnSubnet;
    public vitaljob1a: ec2.CfnSubnet;
    public vitaljob1c: ec2.CfnSubnet;
    public commonservices1a: ec2.CfnSubnet;
    public commonservices1c: ec2.CfnSubnet;
    private readonly vpc: Vpc;
    private readonly projectName: string;
    private readonly stageName: string;
    private readonly stackname: string;
    public readonly resourcesInfo: ResourceInfo[] = [
        {
            id: 'public-subnet-1a',
            cidrBlock: '10.90.16.0/28',
            availabilityZone: '0',
            assign: (subnet) => (this.public1a = subnet),
        },
        {
            id: 'public-subnet-1c',
            cidrBlock: '10.90.16.16/28',
            availabilityZone: '1',
            assign: (subnet) => (this.public1c = subnet),
        },
        ...
        ...
        ...
    ];
    constructor(
        scope: Construct,
        projectName: string,
        stageName: string,
        stackname: string,
        vpc: Vpc,
    ) {
        super();
        this.projectName = projectName;
        this.stageName = stageName;
        this.stackname = stackname;
        this.vpc = vpc;
        for (const resourceInfo of this.resourcesInfo) {
            const subnet = this.createSN(scope, resourceInfo);
            resourceInfo.assign(subnet);
        }
    }
    private createSN(scope: Construct, resourceInfo: ResourceInfo): ec2.CfnSubnet {
        const logigcalId: string = this.Format(scope, resourceInfo.id);
        const subnet = new ec2.CfnSubnet(scope, logigcalId, {
            availabilityZone:
                cdk.Stack.of(scope).availabilityZones[resourceInfo.availabilityZone],
            cidrBlock: resourceInfo.cidrBlock,
            mapPublicIpOnLaunch: false,
            vpcId: this.vpc.vpc.ref,
            tags: [
                {
                    key: `Name`,
                    value: this.createTagName(
                        scope,
                        this.projectName,
                        this.stageName,
                        this.stackname,
                        resourceInfo.id,
                    ),
                },
            ],
        });
        return subnet;
    }
}

				
			

phần định dạng LogicalID mình làm như sau. Bằng việc kết thừa lại Class Resource

				
					const logigcalId: string = this.Format(scope, resourceInfo.id);
				
			

Về phần AZ thì mình sẽ làm như sau.

				
					cdk.Stack.of(scope).availabilityZones[resourceInfo.availabilityZone]
				
			

trong file lib/resources/index.ts sửa lại như sau

				
					import { Vpc } from './vpc';
import { SN } from './subnet';
export { Vpc, SN };
				
			

Tạo Subnet

 

				
					import * as cdk from 'aws-cdk-lib';
import { Vpc, SN } from './resources';
import { getConfig } from '../config/build-config';
export class HelloCkdStack extends cdk.Stack {
    constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
        super(scope, id, props);
        const config = getConfig(scope);
        // VPC
        const vpc = new Vpc(this, config.projectName, config.environment, `network`);
        // Subnet
        new SN(this, config.projectName, config.environment, `network`, vpc);
    }
}

				
			

Bonus

mình có thêm phần script để format code typescript, để sử dụng bạn chạy lệnh

				
					npm run prettier
				
			

Github

Vì thời lượng có hạn nên một số tinh chỉnh mình không để cập đến, chi tiét hơn về code trong bài viết, các bạn có thể tham khảo ở đây

Tags: awscdkCloudformationđịnh nghĩaec2kiến trúcnetworkvpc
Quân Nguyễn

Quân Nguyễn

Related Posts

cdk terraform
DevOps & Cloud

CDK cho Terraform

by Quân Nguyễn
29 Tháng 4, 2025
Ưu Đãi Đặc Biệt: Nhận Ngay Coupon Giảm 25% cho Bộ Đề Luyện Thi Cloud!
Tin tức

Ưu Đãi Đặc Biệt: Nhận Ngay Coupon Giảm 25% cho Bộ Đề Luyện Thi Cloud!

by devopsify
29 Tháng 4, 2025
Đổi MTU cho Calico trong Kubernetes
DevOps & Cloud

Đổi MTU cho Calico trong Kubernetes

by Hiếu Tạ
30 Tháng 4, 2025
Next Post

Grafana là gì? Dựng Grafana - Prometheus để monitor Server

Để lại một bình luận Hủy

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Recommended

Hướng dẫn cài đặt Kubernetes trên Ubuntu 22.04

Hướng dẫn cài đặt Kubernetes trên Ubuntu 22.04

1 Tháng 5, 2025
Các website demo hay được sử dụng cho thực hành Automation Test

Các website demo hay được sử dụng cho thực hành Automation Test

11 Tháng 6, 2025
Cài đặt Maven trên Windows

Cài đặt Maven trên Windows

11 Tháng 6, 2025
Cài đặt Grafana – Loki – Promtail monitoring log Container

Cài đặt Grafana – Loki – Promtail monitoring log Container

1 Tháng 5, 2025
Sử dụng VS Code và Playwright MCP tự động test demo website Demoblaze thông qua GitHub Copilot Agent

Sử dụng VS Code và Playwright MCP tự động test demo website Demoblaze thông qua GitHub Copilot Agent

16 Tháng 6, 2025
MCP server 2025 tốt nhất : Hướng dẫn chọn & bảo mật

MCP server 2025 tốt nhất : Hướng dẫn chọn & bảo mật

16 Tháng 6, 2025
DevOpsify Check Tool hỗ trợ MCP – Tự động hóa kiểm tra qua AI Claude & VS Code

DevOpsify Check Tool hỗ trợ MCP – Tự động hóa kiểm tra qua AI Claude & VS Code

13 Tháng 6, 2025
GitHub Action DevOpsify Check Tool – Tự động kiểm tra bảo mật & hiệu suất

GitHub Action DevOpsify Check Tool – Tự động kiểm tra bảo mật & hiệu suất

11 Tháng 6, 2025
DevOpsify

Cộng đồng DevOps Việt Nam chia sẽ kiến thức giúp tăng tốc quá trình phát triển ứng dụng và tự động hóa trong lĩnh vực Cloud DevOps & AI.

Bài viết mới

  • Sử dụng VS Code và Playwright MCP tự động test demo website Demoblaze thông qua GitHub Copilot Agent
  • MCP server 2025 tốt nhất : Hướng dẫn chọn & bảo mật
  • DevOpsify Check Tool hỗ trợ MCP – Tự động hóa kiểm tra qua AI Claude & VS Code

Categories

  • AI & Automation
  • Bảo mật
  • Chưa phân loại
  • DevOps & Cloud
  • Tin tức
No Result
View All Result
  • Home
  • Bảo mật
  • AI & Automation
  • DevOps & Cloud
  • Bộ đề luyện thi cloud

© 2025 DevOpsify