+6

Chinh phục AWS CDK - Bài 0 - IaC và AWS Cloud Development Kit

Link bài viết gốc: Bài 0 - IaC và AWS Cloud Development Kit

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ó.

DevOps VN

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.

DevOps VN

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:

  1. Khởi tạo ứng dụng
  2. Viết code
  3. Chuyển CDK thành CloudFormation Template
  4. Triển khai EC2 bằng câu lệnh cdk deploy
  5. 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_ACCOUNTCDK_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í du:

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
✨  Synthesis time: 14.59s

FirstAppStack: building assets...

[0%] start: Building 0df75bf5cfbbe41ee58f03215896e6f45730ef416369e09ab978cd5c71cdf5ab:128937018484-us-east-1
[100%] success: Built 0df75bf5cfbbe41ee58f03215896e6f45730ef416369e09ab978cd5c71cdf5ab:128937018484-us-east-1

FirstAppStack: assets built

...

Do you wish to deploy these changes (y/n)?

Bấm y.

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:128937018484: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.

Bài tiếp theo: Bài 1 - Các bước khởi tạo ứng dụng và viết cấu hình cho dự án

Tham gia hội thảo DevOps

Rất vui được mời mọi người tham dự sự kiện đầu tiên của DevOps VN 🥰!!!

💥 TEL4VN khởi động lại năm 2023 với một sự kiện offline đầy hứa hẹn. Lần đầu tiên TEL4VN kết hợp cùng admin page DevOps Việt Nam thực hiện một sự kiện rầm rộ với nội dung chia sẻ về chặn đường “Làm sao để trở thành một DEVOPS ENGINEER” và “DEVOPS ENGINEER và các lựa chọn nghề nghiệp”.

🔗 Link đăng ký: https://forms.gle/3BuJTFwdQEu9sYeD9

Chủ đề 1: Làm sao để để trở thành Devops Engineer - Diễn giả: Huỳnh Minh Quân - Admin DevOps VN

Chủ đề 2: DevOps Engineer và các lựa chọn nghề nghiệp - Diễn giả: Trần Sỹ Hưng - Senior SRE/DRE at Axon

⏰ Thời gian: 9h00-11h30 ngày 18/03 📍 Địa điểm tổ chức: Lầu 3, SAMCO Building 326 Võ Văn Kiệt, P. Cô Giang, Quận 1, HCMC

Rất cảm ơn nhà tài trợ MGI đã hỗ trợ nơi tổ chức cho cộng đồng.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.