Bài viết thuộc series “Chinh phục CDK”
Giới thiệu
Chào các bạn tới với hành trình chinh phục AWS CDK. Ở bài đầu tiên chúng ta sẽ tìm hiểu IaC (Infrastructure as Code) là gì, AWS CDK là gì và tại sao ta cần nó.
Infrastructure as Code
Từ cái tên Infrastructure as Code, ta có thể hiểu đơn giản rằng ta sẽ viết mã để mô tả và cung cấp (provisioning) hạ tầng của chúng ta 😁. Từ Infrastructure trong tiếng Việt có nghĩa là hạ tầng, còn trong ngành CNTT, ta hiểu nó là hạ tầng của hệ thống, bao gồm máy chủ, mạng, Gateway, Database, và tất cả những thứ cần thiết để triển khai ứng dụng của chúng ta trên môi trường máy chủ. Infrastructure as Code có lẽ được sử dụng phổ biến nhất trên môi trường đám mây.
Ví dụ trên AWS Cloud, thường ta sẽ đăng nhập vào Web Console và thao tác trên đó để tạo máy ảo (EC2) hoặc tạo Database. Và từ từ, hạ tầng của chúng ta sẽ phình to ra, đó là lúc ta sẽ gặp vấn đề. Ta sẽ không biết hệ thống hiện tại của mình đang có những gì. Ngay cả khi ta nhớ rõ, nếu người quản lý Cloud nghỉ việc, người mới sẽ không biết được hạ tầng hiện tại. Ngoài ra, nếu ai đó xóa EC2 của ta, ta phải tạo lại nó bằng tay. Ta không biết cấu hình của EC2 đó như thế nào, cho dù có tài liệu đi nữa thì việc tạo lại rất mất thời gian. Nếu nguyên hạ tầng Cloud bị xóa thì ta phải tạo lại nguyên cái hạ tầng hệ thống từ đầu sao? IaC sẽ giúp ta giải quyết những vấn đề trên. Ta sẽ viết mã để mô tả và lưu trữ lại hạ tầng của chúng ta. Nếu có sự cố xảy ra, chẳng hạn như hạ tầng chết hoặc ai đó sửa sai trên hạ tầng của ta, ta có thể triển khai lại nó một cách dễ dàng.
AWS Cloud Development Kit
AWS Cloud Development Kit (AWS CDK) là một framework để định nghĩa cơ sở hạ tầng đám mây bằng code (IaC) và cung cấp nó thông qua AWS CloudFormation. AWS CDK cho phép bạn phát triển các tài nguyên AWS nhanh hơn bằng cách sử dụng các công cụ phát triển của riêng bạn so với chỉ sử dụng AWS CloudFormation.
Thay vì phải viết hàng ngàn dòng YAML với CloudFormation, chỉ cần vài dòng mã của AWS CDK là bạn đã có được hạ tầng tương ứng. Bạn có thể chọn ngôn ngữ mà bạn quen thuộc để xây dựng hạ tầng trên AWS. Hiện tại khi mình viết bài này AWS CDK hỗ trợ các ngôn ngữ sau:
- TypeScript
- JavaScript
- Python
- Java
- C#
- Go
Trong series này chúng ta sẽ sử dụng Go.
Nên sử dụng Terraform hay AWS CDK?
Hiện tại, cả hai công cụ đều rất tốt trong lĩnh vực IaC. Việc sử dụng công cụ nào phụ thuộc vào bạn và công ty của bạn. Nếu bạn thích code theo phong cách Imperative, hãy sử dụng CDK. Nếu bạn thích phong cách Declarative hơn, hãy sử dụng Terraform.
Bắt đầu với AWS CDK
Để làm được bài này yêu cầu bạn phải có tài khoản AWS và IAM User với quyền Admin. Các bạn làm theo các bước ở đây AWS CLI Configure Quickstart. Sau khi có được Access Key thì bạn tạo tệp tin tên là ~/.aws/credentials
với nội dung sau:
[default]
aws_access_key_id=<your-key>
aws_secret_access_key=<your-key>
Sau đó các bạn cài NodeJS. Kiểm tra cài đặt thành công:
npm -v
Ta dùng npm
để cài AWS CDK Toolkit:
npm install -g aws-cdk
Kiểm tra cài đặt thành công:
cdk --version
Lưu ý: trước khi sử dụng AWS CDK ở một tài khoản hay Region mới, ta cần thực hiện Bootstrapping để CDK tạo những thứ cần thiết ở Region đó cho việc triển khai hạ tầng sau này. Vì đây là lần đầu sử dụng CDK, bạn cần chạy lệnh để Bootstrapping.
cdk bootstrap
Sau khi CDK chạy xong, hãy mở AWS CloudFormation lên. Bạn sẽ thấy một Stack có tên là CDKToolkit. Tất cả đã sẵn sàng, tiếp theo ta tiến hành viết code.
Hello CDK
Trong ví dụ này, ta sử dụng AWS CDK để tạo một EC2 trên AWS. Các bước ta thực hiện như sau:
- Khởi tạo ứng dụng
- Viết code
- Chuyển CDK thành CloudFormation Template
- Triển khai EC2 bằng câu lệnh
cdk deploy
- Xóa EC2 bằng câu lệnh
cdk destroy
Khởi tạo ứng dụng
Tạo một thư mục tên là sample
:
mkdir sample && cd sample
Khởi tạo ứng dụng:
cdk init app --language go
go get
Phần --language
cho phép ta chọn ngôn ngữ cho ứng dụng. Câu lệnh init
tạo cho ta các tệp tin sau:
.
├── README.md
├── cdk.json
├── go.mod
├── sample.go
└── sample_test.go
Ta sẽ viết code ở trong tệp tin sample.go
.
Viết code
Dán đoạn code sau vào tệp tin sample.go
.
package main
import (
"os"
"github.com/aws/aws-cdk-go/awscdk/v2"
"github.com/aws/aws-cdk-go/awscdk/v2/awsec2"
"github.com/aws/constructs-go/constructs/v10"
"github.com/aws/jsii-runtime-go"
)
type FirstAppStackProps struct {
awscdk.StackProps
}
func NewFirstAppStack(scope constructs.Construct, id string, props *FirstAppStackProps) awscdk.Stack {
var sprops awscdk.StackProps
if props != nil {
sprops = props.StackProps
}
stack := awscdk.NewStack(scope, &id, &sprops)
vpc := awsec2.Vpc_FromLookup(stack, jsii.String("VPC"), &awsec2.VpcLookupOptions{IsDefault: jsii.Bool(true)})
awsec2.NewInstance(stack, jsii.String("Server"), &awsec2.InstanceProps{
InstanceType: awsec2.NewInstanceType(jsii.String("t2.micro")),
MachineImage: awsec2.MachineImage_LatestAmazonLinux(&awsec2.AmazonLinuxImageProps{
CpuType: awsec2.AmazonLinuxCpuType_X86_64,
}),
Vpc: vpc,
})
return stack
}
func main() {
defer jsii.Close()
app := awscdk.NewApp(nil)
NewFirstAppStack(app, "FirstAppStack", &FirstAppStackProps{
awscdk.StackProps{
Env: env(),
},
})
app.Synth(nil)
}
func env() *awscdk.Environment {
return &awscdk.Environment{
Account: jsii.String(os.Getenv("CDK_DEFAULT_ACCOUNT")),
Region: jsii.String(os.Getenv("CDK_DEFAULT_REGION")),
}
}
Tạm thời ta chưa cần hiểu code, mình sẽ giải thích ở các bài sau. Ở đoạn code:
func env() *awscdk.Environment {
return &awscdk.Environment{
Account: jsii.String(os.Getenv("CDK_DEFAULT_ACCOUNT")),
Region: jsii.String(os.Getenv("CDK_DEFAULT_REGION")),
}
}
Ta có hai biến env là CDK_DEFAULT_ACCOUNT
và CDK_DEFAULT_REGION
, các bạn cấu hình hai biến này với tài khoản (Account ID) và Region tương ứng của các bạn. Ví dụ:
CDK_DEFAULT_ACCOUNT=12345678
CDK_DEFAULT_REGION=us-west-2
Chuyển CDK thành CloudFormation Template
Để chuyển CDK thành CloudFormation ta chạy câu lệnh sau:
cdk synth
Kết quả:
Resources:
...
Server7E7D21FA:
Type: AWS::EC2::Instance
Properties:
AvailabilityZone: us-west-2a
IamInstanceProfile:
Ref: ServerInstanceProfileB511E411
ImageId:
Ref: SsmParameterValueawsserviceamiamazonlinuxlatestamznamihvmx8664gp2C96584B6F00A464EAD1953AFF4B05118Parameter
InstanceType: t2.micro
SecurityGroupIds:
- Fn::GetAtt:
- ServerInstanceSecurityGroup71D53DD9
- GroupId
SubnetId: subnet-bff4edc8
Tags:
- Key: Name
Value: FirstAppStack/Server
UserData:
Fn::Base64: "#!/bin/bash"
DependsOn:
- ServerInstanceRole3D38A6B8
Metadata:
aws:cdk:path: FirstAppStack/Server/Resource
...
Nếu bạn đã sử dụng Terraform, bạn có thể hiểu bước này giống như bước terraform plan
để xem trước các tài nguyên sẽ được tạo ra.
Triển khai
Triển khai hạ tầng:
cdk deploy
Kết quả:
FirstAppStack: deploying... [1/1]
[0%] start: Publishing 0df75bf5cfbbe41ee58f03215896e6f45730ef416369e09ab978cd5c71cdf5ab:128937018484-us-east-1
[100%] success: Published 0df75bf5cfbbe41ee58f03215896e6f45730ef416369e09ab978cd5c71cdf5ab:128937018484-us-east-1
FirstAppStack: creating CloudFormation changeset...
✅ FirstAppStack
✨ Deployment time: 222.92s
Stack ARN:
arn:aws:cloudformation:us-east-1:*:stack/FirstAppStack/8ccf5700-bcbe-11ed-889d-12e29ceec6bb
✨ Total time: 237.51s
Truy cập EC2 Console ta sẽ thấy EC2 mới được tạo.
Xóa
Để tránh mất tiền thì các bạn nhớ xóa tài nguyên, chạy câu lệnh sau:
cdk destroy
Kết luận
Vậy là ta đã tìm hiểu xong về IaC là gì và cách sử dụng AWS CDK. Với CDK, ta có thể tạo và xóa tài nguyên một cách đơn giản. Trong bài tiếp theo, mình sẽ nói thêm về cách viết code.
Tác giả Quân Huỳnh
Nếu bài viết có gì sai hoặc cần cập nhật thì liên hệ Admin.
Tham gia nhóm chat của DevOps VN tại Telegram.
Kém tiếng Anh và cần nâng cao trình độ giao tiếp: Tại sao bạn học không hiệu quả?