Atlantis - Giải pháp CI/CD Terraform Infrastructure as Code

Atlantis - Giải pháp CI/CD Terraform Infrastructure as Code

Terraform là gì ? Tại sao có Atlantis tích hợp với terraform?

Atlantis là 1 công cụ open source được tích hợp với terraform, cho phép mấy ông dev và vận hành System run "terraform plan" và "terraform apply" trực tiếp từ 1 pull request. Bằng cách comment trên merge request, 1 request trigger sẽ hook tới http endpoint của Atlantis, sau khi thực thi "plan" hoặc "apply" nó sẽ gửi lại kết quả output ngay dưới đoạn comment trên merge request. Từ đó có thể review đánh giá đoạn code trong terraform và merge vào master.

Trước khi có Atlantis

workflow của các bạn là gì? với tôi sẽ xảy ra như hình dưới và chỉ xảy ra khi làm việc 1 mình 1 ngựa:

Chỉ đơn giản là thay đổi trên branch master, chạy plan đến khi nào thấy OK và apply code vào hệ thống và cuối cùng là push lên branch master lại. Điều này khá ổn khi làm việc 1 mình. Nhưng khi bạn làm việc với team có thể workflow này bị conflict khi thay đổi trên cùng 1 branch master và apply terraform code ở máy local của mình, nhẹ thì "đậu phộng", "WTF cái gì vậy" mời nhau nước nôi cafe hay chầu bia còn nặng thì ăn ngay incident report vào mặt. Lý do là nếu có 2 người ở 2 máy khác nhau cùng làm trên 1 branch, cùng quản lý 1 số resource hệ thống nào đó, có thể người này apply trước, người khi apply sau và thay đổi cuối cùng sẽ là người apply sau cùng. Điều này xảy ra nhiều tình huống khó lường, có thể resource đó được update không thay đổi nhiều hoặc 1 số tình huống có thể dẫn đến destroy hệ thống và tạo lại cái mới. Có 1 cách để cheat, để lách tình cảnh này đó là phân chia cho mỗi người chỉ quản lý riêng biệt hệ thống không ai đụng ai cả. Nhưng cũng không khả thi nếu size của team ngày càng lớn, việc ngày càng nhiều thì dẫn đến workflow thứ 2.

Workflow trên phù hợp với team cỡ vừa, khá hoặc có thể tách ra thành nhiều team nhỏ với các resource hệ thống riêng biệt khác nhau với nhiều git repo khác nhau. Có thể tạo ra từ branch master và làm việc độc lập nhưng khi muốn apply code thì các thành viên trong team buộc phải tạo 1 merge request và thông qua team leader có thể 1 - 2 người review code và apply trên máy họ sau đó merge về branch chính, master. Hừm... Nhưng khi sếp bạn muốn 1 giải pháp automate phần này, 1 giải pháp về CI/CD, có thể chạy plan trước cho mọi người review trên kết quả đó kết hợp với review code và quyết định apply ngay trên merge request đó mà không phải xuống máy local của mình pull code về và apply, không mang tính chất chuyên nghiệp cũng như nhiều bước phải setup rườm rà, có thể xảy ra lỗi trong quá trình pull code hoặc merge vào branch chính master. Hoặc secure hơn, chỉ có 1 máy trung gian được apply code vào hệ thống, phân quyền trên máy đó, ví dụ trên AWS sẽ attach 1 role IAM vào 1 EC2 có quyền hành để apply code thay đổi hệ thống. Để tích hợp việc đó ...

Atlantis là công cụ triển khai rất hiệu quả khi bạn làm việc với team từ 3, 4 người trở lên. Bằng cách quản lý source code terraform trên VCS (Github, Gitlab, Bitbucket ... ) các bạn trong team có thể tạo ra nhiều merge request vào branch chính và các team leader có thể vào review, chạy plan thử và quyết định merge hay không ngay trên merge request đó. Workflow như hình dưới đây:

Mọi thứ chỉ là ngay khi có thay đổi, merge request được tạo ra sẽ có 1 trigger request tới atlantis chạy plan:

nếu OK team leader sẽ approve trên merge request đó và trigger sẽ lại được gửi tới atlantis apply thay đổi vào hệ thống:

và cuối cùng là merge code thay đổi vào branch master và đóng request lại.

Với atlantis, bạn có thể cấu hình cho atlantis credential để có quyền thay đổi hệ thống, hoặc secure hơn như nói ở trên, gán role IAM lên EC2 đã cài đặt Atlantis để có thể secure hơn. Và những quyền này không phải gán cho những team members hoặc phải tạo ra nhiều credential key với nhiều quyền lực tối cao, đe doạ nguy hiểm tới hệ thống :D.

Tuy nhiên, Atlantis cũng có vài điểm có thể không phù hợp với các bạn và với mình mà thôi để bài viết sau nhé :x. Để có thể trải nghiệm về nó có thể download tại đây: https://github.com/runatlantis/atlantis/releases và tài liệu document: https://www.runatlantis.io/docs/ .