Terraform Poka-Yokes: Writing Effective, Scalable, Dynamic, and Error-Resistant Terraform

Bài tóm tắt CapitalOne 2020 3. Quy mô lớn Độ khó: Trung bình

CapitalOne · 2020 · 3. Quy mô lớn · Độ khó: Trung bình — bài gốc

Bài của một Senior DevOps Engineer/SRE, nửa hướng dẫn nửa kể cách đội làm; mọi nhận định là theo tác giả.

Bối cảnh

  • Tác giả hỗ trợ sáu team chạy hơn 75 microservice trên ECS; môi trường non-prod có ngày tới khoảng 100 lần deploy. Mục tiêu: hỗ trợ được nhiều team mà không cần thêm người theo tỉ lệ 1–1, và developer tự quản ứng dụng được.
  • Poka-yoke (chống sai) là cơ chế trong quy trình ngăn, sửa hoặc làm lộ lỗi của người ngay khi nó xảy ra.

Thay đổi chính

  • Infrastructure-Application pattern (theo loạt bài của Martin Atkins): hạ tầng dùng chung (cụm ECS, ALB, security group, Route 53, database, S3) do đội nền tảng quản trong Terraform riêng; developer chỉ quản phần hạ tầng của ứng dụng. Khác bản gốc, dữ liệu dùng chung giữa hai tầng không đi qua Consul mà tra thẳng API của nhà cung cấp, nên tầng tài khoản có thể viết bằng CloudFormation, CDK hay công cụ khác.
  • Poka-yoke 1, module hai tầng: module cấp thấp không chủ kiến (ví dụ ecs-service: service, autoscaling target, policy scale lên/xuống theo alarm bộ nhớ), bọc trong module có chủ kiến theo ứng dụng (thêm SNS, SQS...). Bắt buộc tạo ứng dụng qua module có chủ kiến thì thực hành tốt (mã hoá, security group đúng, IAM role, ACL của S3) có sẵn.
  • Poka-yoke 2, tra cứu thay vì danh sách: dùng data source với filter (AMI theo tag, cluster, VPC) thay vì bắt developer duy trì danh sách biến.
  • Đặt nội suy/ghép chuỗi ở một chỗ, tên tài nguyên nhất quán.
  • Poka-yoke 3, state locking: khoá state khi deploy để hai lần apply không đè nhau và lộ ra khi có người đang chạy.

Vì sao

  • Theo tác giả: poka-yoke cho developer thất bại sớm, nhanh, mà không làm hỏng thứ họ không được đụng tới; giảm downtime và hiểu lầm khi deploy nhiều.

Bài học cho SWE

  • Ranh giới giữa hạ tầng dùng chung và hạ tầng của ứng dụng là ranh giới quyền: đội nền tảng giữ phần đầu, đóng gói mặc định đúng vào module mà developer buộc phải dùng.
  • Mỗi danh sách người phải tự cập nhật là một chỗ sẽ sai; tra từ API lúc chạy.

Liên quan