- ทำเครื่องหมายทุกการตัดสินใจเป็น Endorse(เห็นด้วย) และ Regret(เสียใจ)
การเลือก AWS
- การเลือก AWS แทน Google Cloud: เห็นด้วย กับการเลือก AWS เพราะ AWS ให้ความสำคัญกับลูกค้า ขณะที่ Google Cloud ให้ความรู้สึกพึ่งพาหุ่นยนต์และระบบอัตโนมัติมากเกินไป
- EKS: เห็นด้วย กับการใช้ EKS เพราะมีการผสานรวมกับบริการของ AWS ได้ลึก และ Kubernetes เองก็พัฒนาไล่ทันในหลายด้านแล้ว (เช่น ผสานรวมกับ Route53 ผ่าน externaldns)
- EKS managed add-ons: เสียใจ ที่ใช้ EKS managed add-ons เพราะจำเป็นต้องปรับแต่งการติดตั้ง และหลังจากเปลี่ยนไปใช้ helm chart ก็พบว่าดูแลจัดการได้ดีกว่า
ฐานข้อมูลและแคช
- RDS: เห็นด้วย กับการใช้ RDS ข้อมูลคือส่วนที่สำคัญที่สุดของอินฟรา และค่าใช้จ่ายของ RDS ก็คุ้มค่า
- Redis ElastiCache: เห็นด้วย กับการใช้ Redis เพราะมีประสิทธิภาพมากทั้งสำหรับแคชและงานใช้งานทั่วไป
- ECR: เห็นด้วย กับการย้ายจาก quay.io ไป ECR เพราะ ECR เสถียรกว่าและผสานรวมด้านสิทธิ์การเข้าถึงได้ลึกกว่า
เครือข่ายและซัพพอร์ต
- AWS VPN: เห็นด้วย กับการใช้ AWS VPN เพราะตั้งค่าและทำความเข้าใจได้ง่ายมาก ใช้ Okta เพื่อจัดการสิทธิ์การเข้าถึง VPN และประสบการณ์ใช้งานก็ดีมาก
- AWS Premium Support: เสียใจ เพราะค่าใช้จ่ายของ AWS Premium Support สูงมาก และถ้าภายในทีมไม่ได้ขาดความรู้เรื่อง AWS ก็ไม่คุ้มค่า
- Control Tower Account Factory for Terraform: เห็นด้วย กับการผสานรวม AFT เพราะช่วยทำให้การสร้างแอ็กเคานต์เป็นอัตโนมัติและช่วยทำมาตรฐานแท็กให้สม่ำเสมอ
การทำกระบวนการอัตโนมัติ
- การทำ postmortem อัตโนมัติด้วย Slack bot: เห็นด้วย กับการทำกระบวนการ postmortem ให้เป็นอัตโนมัติ เพราะช่วยกระตุ้นให้คนลงมือเขียน postmortem
- การใช้ incident template ของ PagerDuty: เห็นด้วย กับการใช้เทมเพลตเมื่อเกิด incident และยังปรับแต่งได้บ้างด้วยความยืดหยุ่นของ Notion
- การทบทวนตั๋วของ PagerDuty เป็นประจำ: เห็นด้วย กับการทบทวนการตั้งค่า alert อย่างสม่ำเสมอ เพื่อให้มั่นใจว่าแม้แต่ alert ที่ไม่สำคัญก็จะไม่ถูกเพิกเฉย
- การจัดการ postmortem ใน Datadog หรือ PagerDuty: เสียใจ ที่ใช้เครื่องมือจัดการแบบรวมศูนย์สำหรับ postmortem เพราะทั้งสองอย่างปรับแต่งกระบวนการภายหลังได้ยาก คิดว่าการใช้เครื่องมือที่ทรงพลังกว่าอย่าง Notion ดีกว่า
อื่นๆ
- การประชุมติดตามค่าใช้จ่ายรายเดือน: เห็นด้วย กับการประชุมรายเดือนเพื่อตรวจสอบค่าใช้จ่าย SaaS เพื่อเช็กว่าค่าใช้จ่ายเหมาะสมหรือไม่และดำเนินการที่จำเป็น ใน AWS จะจัดกลุ่มรายการตามแท็กและแยกตามแอ็กเคานต์ และแนะนำว่าไม่ควรดูเฉพาะ AWS แต่ควรตรวจสอบแหล่งค่าใช้จ่ายหลักทั้งหมดของบริษัท
- ไม่ได้ใช้ FaaS ให้มากกว่านี้: เสียใจ ที่ไม่สามารถใช้ FaaS ได้เต็มที่ เพราะไม่มีตัวเลือก FaaS สำหรับงาน GPU แม้ว่างาน CPU หลายอย่างน่าจะย้ายไปทำบน FaaS ได้ อีกข้อดีที่ซ่อนอยู่ของ Lambda คือการติดตามต้นทุนได้ง่ายมากและแม่นยำสูง
- GitOps: เห็นด้วย กับการใช้ GitOps ตอนนี้ใช้อยู่กับหลายส่วนของอินฟรา และลงทุนพัฒนาเครื่องมือเพื่อช่วยให้เข้าใจสถานะการ deploy
- ให้ความสำคัญกับประสิทธิภาพของทีมก่อน: เห็นด้วย กับการให้ความสำคัญกับการเพิ่มประสิทธิภาพของทีม ไม่เคยเสียใจเลยที่ลงทุนเวลาไปกับ automation หรือ documentation
- หลายแอปพลิเคชันใช้ฐานข้อมูลเดียวกัน: เสียใจ ที่ให้หลายแอปแชร์ฐานข้อมูลเดียวกัน เพราะก่อให้เกิดปัญหาหลายอย่าง
การนำ SaaS มาใช้
- นำ identity platform มาใช้ช้าเกินไป: เดิมใช้ Google Workspace ในการกำหนดสิทธิ์ แต่ เสียใจ ที่ไม่ได้นำโซลูชันด้าน identity อย่าง Okta มาใช้ให้เร็วกว่านี้ เพราะ Okta ผสานรวมได้ดีและช่วยแก้ปัญหาด้านความปลอดภัยกับ compliance
- Notion: เห็นด้วย กับการใช้ Notion สำหรับเขียนเอกสาร เป็นตัวเลือกที่ยอดเยี่ยมและใช้งานง่ายกว่าสิ่งที่เคยใช้ในอดีตมาก (เช่น Wikis, Google Docs, Confluence ฯลฯ) โดยแนวคิดเรื่อง database สำหรับจัดระเบียบหน้าต่างๆ มีประโยชน์มาก
- Slack: เห็นด้วย กับการใช้ Slack เพราะมีประสิทธิภาพในฐานะเครื่องมือหลักสำหรับการสื่อสาร
เครื่องมือและบริการสำหรับการพัฒนา
- ย้ายจาก JIRA ไป Linear: เห็นด้วย กับการใช้ Linear แทน JIRA เพราะมองว่า JIRA ซับซ้อนและหนักเกินไป
- ไม่ใช้ Terraform Cloud: ไม่เสียใจ ที่ไม่ได้ใช้ Terraform Cloud เพราะไม่สามารถอธิบายความคุ้มค่าของค่าใช้จ่ายได้ จึงย้ายไปใช้ Atlantis และเพิ่ม automation ที่ต้องการเข้าไปใน CI/CD pipeline
- GitHub Actions for CI/CD: เห็นด้วยในระดับหนึ่ง (Endorse-ish) กับการใช้ GitHub Actions เพราะ action ใน marketplace และไวยากรณ์ใช้งานง่าย แต่ข้อเสียคือรองรับ self-hosted workflow ได้จำกัด
การเลือกเทคโนโลยี
- Datadog: เสียใจ ที่ใช้ Datadog เพราะค่าใช้จ่ายสูงมาก และโมเดลค่าใช้จ่ายไม่เหมาะกับ Kubernetes cluster และบริษัท AI
- PagerDuty: เห็นด้วย กับการใช้ PagerDuty เพราะตัวผลิตภัณฑ์ดีและราคาสมเหตุสมผล
- Schema migration by Diff: เห็นด้วยในระดับหนึ่ง กับการใช้เครื่องมือสำหรับ schema migration เพราะข้อมูลสำคัญและ schema migration อาจมีความเสี่ยง
- Ubuntu for dev servers: เห็นด้วย กับการใช้ Ubuntu สำหรับเซิร์ฟเวอร์พัฒนา เพราะรองรับได้ดีและมีแพ็กเกจส่วนใหญ่ที่ต้องการ
- AppSmith: เห็นด้วย กับการใช้ AppSmith สำหรับ automation กระบวนการของวิศวกรภายใน โดยโฮสต์เองและถือว่าน่าพอใจพอสมควร ตอนแรกเคยพยายามใช้ retool เพื่อการผสานรวมที่ลึกกว่า แต่ในเวลานั้นยังไม่สามารถอธิบายความคุ้มค่าของราคาสำหรับการผสานรวมเพียงไม่กี่อย่างได้
- helm: เห็นด้วย กับการใช้ Helm v3 แม้จะมีปัญหาเรื่องการ deploy CRD และการฝึกนักพัฒนา แต่ก็ถือว่าดีพอสำหรับการแพ็กและ deploy Kubernetes object
- helm chart in ECR(oci): เห็นด้วย กับการเก็บ helm chart ใน OCI registry เพราะมีปัญหาน้อยกว่าวิธีเดิมที่ใช้ S3 และปลั๊กอิน
- bazel: ยังไม่แน่ใจ กับ bazel เพราะดูเหมือนจะมากเกินไปสำหรับการ deploy บริการ Go และ GitHub Actions ก็ใช้งานง่ายกว่าสำหรับวิศวกรจำนวนมาก
- ไม่ได้ใช้ OpenTelemetry: เสียใจ ที่ส่ง metrics โดยใช้ DataDog API โดยตรง และแนะนำให้เริ่มใช้ OpenTelemetry ตั้งแต่แรก
- เลือก renovatebot แทน dependencyabot: เสียใจ ที่ไม่ได้คิดเรื่องการอัปเดต dependency ให้ทันสมัยตั้งแต่เนิ่นๆ แม้ Renovatebot จะปรับแต่งได้ แต่การตั้งค่าและดีบักก็ซับซ้อน
- Kubernetes: เห็นด้วย กับการใช้ Kubernetes เพราะจำเป็นต้องมีวิธีโฮสต์บริการที่รันระยะยาว และ Kubernetes ก็ได้รับความนิยมและทำงานได้ดี
- การซื้อ IP ของตัวเอง: เห็นด้วย กับการซื้อ IP block ของตัวเองเมื่อต้องทำงานกับพาร์ตเนอร์ภายนอก เพราะช่วยให้สามารถให้ whitelist เป็น CIDR block ที่ใหญ่ขึ้นแก่พาร์ตเนอร์ภายนอกได้
- เลือก Flux สำหรับ k8s GitOps: ไม่เสียใจ ที่เลือก Flux เป็นเครื่องมือ GitOps สำหรับ Kubernetes แม้ว่าจะยังต้องพัฒนาเครื่องมือเพื่อช่วยให้เข้าใจสถานะการ deploy
- Karpenter for node management: เห็นด้วย กับการใช้ Karpenter เมื่อใช้ EKS เพราะเชื่อถือได้มากกว่าและคุ้มค่ากว่า autoscaler อื่นๆ
- การใช้ SealedSecrets: เสียใจ ที่ใช้ SealedSecrets เพราะทำให้ซับซ้อนสำหรับนักพัฒนา และยังทำให้สูญเสีย automation เดิมของ AWS สำหรับการหมุนรหัสผ่าน
- การใช้ ExternalSecrets: เห็นด้วย กับการใช้ ExternalSecrets เพื่อซิงก์รหัสผ่านจาก AWS -> Kubernetes เพราะนักพัฒนาเข้าใจได้ง่าย และสามารถสร้าง/อัปเดตรหัสผ่านใน AWS ได้สะดวกด้วย terraform
- การใช้ ExternalDNS: เห็นด้วย กับการใช้ ExternalDNS เพื่อซิงก์รายการ DNS จาก Kubernetes -> Route53 และแทบไม่มีปัญหาเลยตลอด 4 ปีที่ผ่านมา
- การใช้ cert-manager: เห็นด้วย กับการใช้ cert-manager สำหรับจัดการใบรับรอง SSL เพราะใช้งานง่ายมากในการออกใบรับรอง Let's Encrypt และไม่มีปัญหา
- Bottlerocket for EKS: เสียใจ ที่รัน EKS cluster บน Bottlerocket เพราะมักเกิดปัญหา networking CSI และดีบักได้ยาก
- การเลือก Terraform แทน CloudFormation: เห็นด้วย กับการใช้ Terraform เพราะขยายไปยังผู้ให้บริการ SaaS รายอื่นได้ง่ายกว่า และมีไวยากรณ์ที่อ่านง่ายกว่า CloudFormation
- ไม่ใช้โซลูชัน IaC แบบ code-first: ไม่เสียใจ โดย Terraform และ CloudFormation ใช้ไฟล์ข้อมูล ขณะที่ Pulumi หรือ CDK อธิบายอินฟราด้วยโค้ด และข้อจำกัดของ HCL ใน Terraform ก็ช่วยลดความซับซ้อนได้
- ไม่ใช้ service mesh: ไม่เสียใจ แม้ service mesh จะดูน่าสนใจ แต่บริษัทต่างๆ มักประเมินความซับซ้อนต่ำเกินไป คำแนะนำทั่วไปด้านอินฟราคือ "ยิ่งน้อยยิ่งดีกว่า"
- Nginx load balancer for EKS ingress: ไม่เสียใจ และ เห็นด้วย กับการใช้ Nginx เพราะแม้จะเก่า แต่เป็นเทคโนโลยีที่เสถียรและผ่านการพิสูจน์แล้ว
- homebrew for company scripts: เห็นด้วย กับการใช้ homebrew เพื่อแจกจ่ายสคริปต์ของบริษัท เพราะดีพอสำหรับการแจกจ่ายสคริปต์และไบนารีให้ทั้งผู้ใช้ Linux และ Mac
- Go for services: เห็นด้วย กับการใช้ภาษา Go สำหรับบริการต่างๆ เพราะวิศวกรใหม่เรียนรู้ได้ง่ายและโดยรวมเป็นตัวเลือกที่ดี
4 ความคิดเห็น
บทความ GeekNews เก่า ๆ ที่น่าอ่านเกี่ยวกับเรื่องนี้
สำหรับคนที่ทำบริษัทคนเดียวในฐานะนักพัฒนา ใช้เทคสแตกอะไรกันบ้าง?
สแตกสถาปัตยกรรมของเทคสตาร์ทอัพที่มีวิศวกรคนเดียว
เทคสแตกของ Healthchecks.io ซึ่งเป็น 1-person SaaS
แนะนำเครื่องมือสำหรับนักพัฒนา 1-person SaaS
เทคสแตกของบริษัทฮาร์ดแวร์ที่ดำเนินการโดยผู้หญิงคนเดียว
บริหารสตาร์ทอัพด้วยเงิน 6 ดอลลาร์ต่อปี
Stack on a Budget - การพัฒนาบนพื้นฐานของฟรีเทียร์
บริหารซอฟต์แวร์สตาร์ทอัพด้วยความพยายามให้น้อยที่สุด
วิธีรองรับทราฟฟิก 80TB และ 5M pageviews ด้วยงบ 500,000 วอนต่อเดือน ($400)
ทั้งเนื้อหาและคอมเมนต์ล้วนมีคุณค่ามากครับ
โอ้โห....นี่เป็นข้อมูลเชิงปฏิบัติที่หาได้ยากมากจริง ๆ
ความคิดเห็นจาก Hacker News
ค่าใช้จ่ายส่วนเพิ่มของการใช้ RDS นั้นคุ้มค่า
ความเห็นนี้อาจไม่เป็นที่นิยม แต่ Google Cloud ดีกว่า AWS และ Google Cloud Run ทำให้การรัน Docker container บนคลาวด์เป็นเรื่องเหมือนฝัน ชื่อบริการเรียบง่ายกว่า มีบริการสำคัญที่ต้องรู้จักน้อยกว่าชุดบริการอันซับซ้อนของ AWS และ UI ก็ใช้งานเข้าใจง่ายกว่า ข้อเสียคือมีชุมชนน้อยกว่าเลยมีบทสอนน้อย หาคนมีประสบการณ์ยากกว่า และมีเครื่องมือจาก third-party น้อยกว่า แนะนำให้ลองใช้
การใช้ EC2 + ASG เป็นประสบการณ์ที่ดีมาก มันเรียบง่ายในเชิงแนวคิด: เอา image ไป launch ใน ASG แล้วตั้งนโยบาย auto scale แทบไม่มีอะไรให้ต้องกังวล ในทางกลับกัน การใช้ k8s เป็นงานใหญ่ตลอดเวลา ต้องตั้งทั้งทีมขึ้นมาดูแล k8s ต้องนำแนวคิดนับสิบของ k8s เข้ามาใช้ หรือไม่ก็ลงทุนเป็นคน-ปีใน "platform engineering" เพื่อซ่อนแนวคิดของ k8s ต้องออกแนวทางปฏิบัติและ SDK รวมถึงตัวตรวจสอบสารพัดเพื่อให้ใช้งาน k8s ได้ "อย่างถูกต้อง" และถึงอย่างนั้นก็ยังต้องเขียน YAML กับโค้ดอีกนับหมื่นบรรทัดเพื่อทำ operator บางครั้งก็อดสงสัยไม่ได้ว่า k8s มัน intrusive เกินไปหรือเปล่า
ความเห็นเกี่ยวกับผลิตภัณฑ์ SaaS
นึกภาพนักพัฒนายุค 90s/00s มาอ่านรายการนี้แล้วคงงงกับความซับซ้อนและศัพท์ต่าง ๆ
เป็นเรื่องอ่านที่น่าสนใจ แต่ไม่แน่ใจว่าผู้เขียนเสียใจมากพอถึงขั้นต้องเขียนบล็อกหรือเปล่า
รู้สึกอยากลองย้อนกลับไปใช้เซิร์ฟเวอร์ยักษ์เครื่องเดียวราคา $100k แล้วรันทุกอย่างอยู่ในกล่องเดียว
ผมเรียนรู้พื้นฐานของ Kubernetes / EKS ได้สำเร็จ แต่กำลังคิดจะย้ายไป ECS Kubernetes ซับซ้อนเกินความต้องการของเรา ควบคุมด้วยอะไรอย่าง CloudFormation ได้ยาก load balancer ที่ provision จาก add-on ก็อ้างอิงจากภายนอก Kubernetes ได้ยาก logging จาก EKS Fargate ไป Cloudwatch ดูเหมือนจะไม่ทำงานแม้ทำตามเอกสารแล้ว และ metric CPU/หน่วยความจำก็ไม่ทำงานเหมือนบน EKS EC2 ดูเหมือนว่าจะต้องใช้ ADOT ด้วย พอลองทำสภาพแวดล้อมใหม่บน ECS กลับใช้เวลาแค่ 1/10 และทุกอย่างทำงานได้ดี
ชอบทั้งวิธีเขียนและเนื้อหาของบทความนี้ แม้จะไม่เห็นด้วยกับบางการตัดสินใจและคำแนะนำ แต่แม้ในกรณีนั้น การได้อ่านเหตุผลก็ยอดเยี่ยมมาก อยากให้มีการเผยแพร่บทความลักษณะคล้ายกันให้มากขึ้นและมีวิธีเอามาเทียบกันได้บ้าง อ่านแล้วได้แรงบันดาลใจให้อยากเขียนบทความแนวเดียวกัน
ฐานข้อมูลแบบ kitchen sink ที่ทุกคนใช้งานร่วมกันเป็นปัญหาที่พบบ่อย และก็ยังถูกทำซ้ำอยู่เรื่อย ๆ พอบริษัทเติบโตขึ้น มันจะกลายเป็น technical debt และคอขวดด้านประสิทธิภาพอย่างมาก การใช้ managed DB อย่าง RDS ทำให้สามารถแยกดูแลคลัสเตอร์ DB ตามแอปหลักแต่ละตัวได้ง่าย