IaC là gì hay Infrastructure As Code là gì, 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.
Lợi ích của việc dùng IaC
Đầu tiên bạn cần hiểu khái niệm về Mutable Infrastructure và Immutable Infrastructure, giả sử bạn deploy một con ec2 trên AWS, bạn cài nginx version 1,0, sau đó bạ nhận được yêu cầu update nginx lên version mới hơn, bạn sẽ làm gì?
Nếu bạn truy cập vào con server và tiến hành update version nginx lên, thì đó là Mutable Infrastructure nhược điểm của cách làm này đôi lúc update sẽ ảnh hưởng đến nhưng package khác trong hệ thống, hoặc sự tương thích giữa các package, và khi có như cầu rollback thì sẽ không được.
Còn Immutable Infrastructure thì sao? đó là bạn sẽ deploy một con ec2 khác song song với con ec2 hiện tại cùng với nginx version mới, nếu có vấn đề gì trong lúc deploy app thì bạn vẫn có thể quay trở về bản con ec2 cũ với nginx version cũ. Khi hiểu IaC là gì thì bạn sẽ dễ dàng dùng hơn trong việc xác định trạn thái của hệ thống. Cũng như dễ dàng đưa ra chiến lược nâng cấp cũng như hạ cấp hệ thống.
Bạn cũng sẽ giảm thiểu được những sai sót trong nếu như bạn làm bằng tay, và cũng như dẽ dàng hơn trong việc tự động hóa quy trình deploy infra.
Các công cụ IaC
Hiện nay có khá nhiều công cụ, nhưng nổi tiếng nhất là Terraform, mình cũng có một vài bài viết về công cụ này, ngoài ra còn có Cloudformation là một service của AWS và một số công cụ khác, ngoài ra còn có thể loại khác là IiC ( cái này mình tự đặt) là Infrastructure is Code dùng CDK là một thư viện của cloud provider, cho phép bạn có thể định nghĩa hạ tầng của bạn bằng các ngôn ngữ lập trình như python, C#, .net. Trong số các công cụ mà mình đã từng làm việc qua thì có Terraform và Cloudformation
Terraform
Khi bắt đầu hành trình devops, Terraform là cái tên được nhắc đến nhiều nhất, khi làm việc với Terraform bạn sẽ tập làm quen với ngôn ngữ HCL, nó có một số hàm build-in sẵn để hổ trợ trong việc sử lý dữ liệu, hay một vài vòng lặp, câu điều kiền, nói chung là trong quá trình trãi nghiệm thì mình thấy mấy cái này đủ dùng. bạn có thể định cấu hình input là một dạng array (mảng) sau đó dùng vòng lặp duyệt qua từng phần tử trong mảng và tạo ra các resource tương ứng.
Khi làm việc với Terraform, bạn sẽ làm việc với file .tf, bạ có thể tách nhỏ từng thành phần của hệ thống của bạn thành từng file riêng lẻ, khi deploy, Terraform sẽ biên dịch các file này và sau đó kiểm tra trạng thái hiện tại của hệ thống thông qua file state, đối chiếu với trạng thái từ code mà bạn mới thêm vào, tìm ra những sự thay đổi, tùy vào sự thay đổi mà Terraform sẽ thay đổi cấu hình của resource đó, hoặc xóa đi tạo lại resource mới thông qua API của prodvider, nói đến đây bạn có thể hiểu là thay vì dùng CDK thư viện của provider, nếu bạn không hề biết code, thì ngôn ngữ HCl sẽ dễ học và làm quen hơn, vì bản chất đều là gọi vào API của provider.
Terraform giữ trạng thái của nó trong một tệp. Tệp này có thể được lưu trữ trên đĩa, hoặc ở s3. Một điều đặt biệt mà trong Terraform là quản lý sự trôi dạt cấu hình. Tức là bạn quản lý cấu hình thông qua IaC, nhưng một ai đó (dev chẳng hạn) thực hiện cấu hình bằng tay trên hạ tầng mà bạn đang quản lý, khi bạn chạy ‘Terraform plan‘, nó sẽ tìm nạp trạng thái thực tế mới nhất của cơ sở hạ tầng và so sánh nó với trạng thái mong muốn, được xác định trong file cấu hình và file state phản ánh trạng thái thực tế khi bạn chạy ‘Terraform apply‘ lần cuối cùng. Nếu cơ sở hạ tầng của chúng tôi không còn phù hợp với trạng thái mong muốn (thường là do một số thay đổi manual), Terraform sẽ tính toán sự khác biệt và đề xuất đưa trạng thái hạ tầng trở lại phù hợp với những gì được mô tả trong cấu hình của chúng tôi bằng cách hoàn nguyên các thay đổi manual.
Input của Terraform có thể là biến môi trường, hoặc là file variables.tf, từ phiên bản 0.13 đã có hổ trợ lấy data từ file state, tức là bạn tạo resource ở một project khác, bạn có nhu cầu sử dụng chung resource này cho nhiều project, à bạn muốn lấy những cái id của resource, thì terraform_remote_state sẽ giúp bạn làm được điều này một cách dễ dàng.
Một số vẫn đề của Terraform là version, mỗi khi có version mới thì syntax cũng sẽ có cập nhật hoặc là bạn phải giữ cho version của Terraform được nhất quán ở các môi trường development và môi trường CI. để làm được điều này bạn cần sư dụng đến công cụ có tên là TFenv.
Terraform còn hổ trợ module giúp bạn có thẻ tận dụng tối đa code của bạn, giúp code DRY (don't repeat yourself), những Terraform vẫn có nhưng hạn chế về mặt tổ chức code, và bạn sẽ cần dùng đến một công cụ khác bổ trợ cho Terraform là Terragrunt. Hoặc xây dựng workflow với Atlantis.
CloudFormation
Đại diện này đến từ nhà AWS, tất nhiên là nó chỉ dùng cho AWS thôi thay vì multiple provider như Terraform, khi làm việc với CloudFormation, trãi nghiệm khá là tệ, CloudFormation 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ứoi 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ứoi dạng alias).
Làm việc với CloudFomation là bạ sẽ làm việc với từng stack