← Kỹ sư dữ liệu← Data Engineer
Kỹ sư dữ liệuData Engineer19 Th7, 2026Jul 19, 202630 phút đọc24 min read

Cloud Data PlatformCloud Data Platforms

Thuộc bộ kiến thức Data Engineer Roadmap.

Tổng quan

Hầu như mọi data platform được xây dựng ngày nay đều chạy trên server của người khác. Đây không phải chi tiết phụ — đó là thực tế vận hành cốt lõi của data engineering hiện đại, và cần hiểu tại sao trước khi liệt kê dịch vụ nào làm gì. Các cơ chế chung của ba cloud lớn — IAM, networking, compute instance, object/block storage, managed relational database — đã được trình bày ở ../cloud/README.md và các bài deep dive AWS/GCP; bài này giả định bạn đã nắm nền tảng đó và không lặp lại. Thay vào đó, bài này tập trung vào lớp nằm ngay trên nền tảng đó và đặc thù cho roadmap này: các data warehouse, data lake, dịch vụ ETL/orchestration mà data engineer thực sự vận hành hàng ngày, cộng với Snowflake — warehouse cloud-agnostic đã trở thành một “cloud thứ tư” đứng ngang hàng AWS, Azure, GCP.

Có ba lực giải thích vì sao cloud platform gần như thay thế hoàn toàn data warehouse on-premises trong thập kỷ qua. Thứ nhất, khối lượng công việc phân tích (analytical workload) vốn dĩ có tính “spiky” (bùng phát không đều): một batch load ban đêm hay đợt báo cáo cuối quý cần compute nhiều hơn hẳn một buổi chiều thứ Ba bình thường, và một cụm on-prem cố định được size theo đỉnh tải sẽ nằm không phần lớn thời gian còn lại — elastic compute trên cloud cho phép mở rộng khi cần và thu nhỏ (thậm chí về 0) khi không cần, nên bạn trả tiền sát hơn với những gì thực sự dùng. Thứ hai, và quan trọng hơn về kiến trúc, các cloud warehouse hiện đại tách rời storage khỏi compute — đặc điểm do Snowflake tiên phong và nay được BigQuery cùng Redshift phiên bản mới chia sẻ (Redshift Serverless, và RA3 node với managed storage) — để hai thứ này scale, và được tính phí, độc lập với nhau. Bạn có thể lưu hàng petabyte dữ liệu lịch sử với giá rẻ trên object storage, đồng thời chỉ chạy một cụm compute nhỏ phần lớn thời gian, rồi bật compute lớn hơn nhiều cho một job cụ thể, mà không bao giờ phải di chuyển hay re-shard dữ liệu. Thứ ba, các managed service chuyển gánh nặng vận hành — vá lỗi, xử lý node lỗi, backup, tuning, capacity planning — sang cho nhà cung cấp cloud, nên một nhóm vài data engineer ngày nay có thể vận hành hạ tầng mà mười năm trước cần cả một đội database administrator on-prem chuyên trách.

Kiến thức nền tảng

Tách rời storage và compute

Hiểu rõ một ý tưởng kiến trúc này sẽ giải thích được phần lớn cách các cloud warehouse hiện đại vận hành, nên đáng để đi sâu trước khi điểm qua từng dịch vụ.

Một appliance MPP (massively parallel processing) on-premises kinh điển — như Teradata hay Redshift thế hệ đầu với dense-compute node — gộp storage và compute vào chung các node vật lý. Mỗi node vừa giữ một shard dữ liệu vừa có CPU/RAM để truy vấn shard đó. Cách này nhanh với workload phân bổ tốt, nhưng nghĩa là storage và compute chỉ có thể scale cùng nhau: thêm dung lượng để chứa nhiều dữ liệu lịch sử hơn cũng đồng nghĩa phải trả thêm cho compute dù có cần hay không, và resize cluster là thao tác chậm, thường gây gián đoạn vì dữ liệu phải được phân phối lại theo số node mới.

Việc tách hai lớp này — object storage (S3, ADLS, GCS, hay storage nội bộ của Snowflake, tất cả cuối cùng đều dựa trên loại blob storage rẻ, bền, gần như vô hạn) giữ dữ liệu, còn các cụm compute độc lập, “ephemeral” gắn vào storage đó theo nhu cầu — phá vỡ sự ràng buộc trên. Storage tăng trưởng đơn giản bằng cách ghi thêm file, với giá vài xu mỗi GB mỗi tháng, không kéo theo hệ quả gì cho compute. Compute được cấp phát, resize, tạm dừng, và tính phí như một chiều hoàn toàn tách biệt, thường theo giây hoặc theo query. Đây chính là lý do khiến việc giữ lại nhiều năm dữ liệu thô “phòng khi cần” trở nên hợp lý về kinh tế (storage gần như miễn phí), trong khi vẫn kiểm soát chi phí compute chặt chẽ (tạm dừng khi không ai query, chỉ scale lên cho đúng workload cần nó). Snowflake xây dựng toàn bộ kiến trúc quanh ý tưởng này ngay từ đầu; BigQuery đẩy xa hơn nữa thành mô hình serverless hoàn toàn, nơi bạn gần như không cần nghĩ đến cụm compute; Redshift bổ sung khái niệm này sau qua loại node RA3 và Redshift Serverless, rời xa thiết kế dense-compute gắn chặt ban đầu.

AWS data stack

Các dịch vụ dữ liệu của AWS được hiểu tốt nhất như một tập hợp các khối xây dựng (building block) được định nghĩa rõ ràng, cấp phát riêng lẻ, mà data engineer tự kết nối lại — chứ không phải một sản phẩm tích hợp sẵn.

Amazon S3 là nền tảng mà hầu hết phần còn lại của AWS data stack đứng trên. Đây là lớp storage cho data lake được xem là chuẩn mực thực tế (de facto) của cả ngành, không chỉ riêng AWS — object storage rẻ, bền, dung lượng gần như không giới hạn, có versioning, lifecycle policy để chuyển dữ liệu lạnh vào Glacier, và — quan trọng với pipeline — khả năng phát S3 event notification ngay khi một object được tạo, đây chính là trigger mà phần lớn pipeline ingestion “AWS-native” được xây dựng xoay quanh.

Amazon Redshift là data warehouse MPP của AWS, đã được trình bày sâu về kiến trúc trong ./06-data-modeling-and-warehousing.md (columnar storage, distribution style, sort key). Redshift hiện có hai chế độ vận hành: provisioned cluster (bạn chọn loại node và số lượng, trả theo node-hour, và — với node RA3 — có managed storage tách rời dựa trên S3) và Redshift Serverless (bạn chỉ định một khoảng dung lượng theo Redshift Processing Unit và nó tự động scale, tính phí theo giây sử dụng thực tế). Redshift Spectrum cho phép một cluster Redshift query trực tiếp dữ liệu nằm trong S3 dưới dạng external table, không cần load trước — một cầu nối nhẹ giữa lake và warehouse có trước cả xu hướng lakehouse rộng hơn.

RDS và Aurora là các database OLTP được quản lý của AWS (PostgreSQL, MySQL, và nhiều engine khác) — những hệ thống vận hành tạo ra dữ liệu mà một warehouse cuối cùng sẽ ingest, chứ bản thân chúng không phải engine phân tích. Aurora bổ sung engineering về storage và replication riêng của AWS trên nền các engine mã nguồn mở để đạt throughput cao hơn và failover nhanh hơn. Data engineer chủ yếu tương tác với RDS/Aurora như một hệ thống nguồn: trích xuất qua change data capture (cả Aurora và RDS đều hỗ trợ, thường đi kèm AWS Database Migration Service) hoặc trích xuất batch theo lịch, đổ vào warehouse hoặc lake.

AWS Glue là dịch vụ ETL và metadata được quản lý của AWS, và nó làm hai việc khác nhau dễ bị nhầm lẫn. Glue ETL chạy các job Apache Spark serverless (hoặc job Python shell đơn giản hơn) để biến đổi dữ liệu, được tạo từ trình soạn job trực quan hoặc viết tay bằng PySpark. Glue Data Catalog là kho metadata bền vững, tương thích Hive metastore: nó lưu định nghĩa bảng (schema, vị trí, phân vùng) cho dữ liệu nằm trong S3, và một phần lớn hệ sinh thái analytics của AWS — Athena, Redshift Spectrum, EMR, chính các job Glue ETL — đọc từ cùng một catalog dùng chung này, nên đăng ký schema của một bảng một lần trong Glue sẽ khiến nó hiển thị cho mọi engine kể trên. Amazon Athena là engine SQL serverless, tính phí theo query của AWS (xây trên Trino/Presto) query trực tiếp dữ liệu trong S3, dùng Glue Data Catalog để lấy schema — ví dụ AWS-native của mẫu hình “serverless query engine” mà BigQuery là điển hình trên GCP.

EC2 nằm bên dưới hầu như mọi dịch vụ AWS ở một dạng nào đó (node của Redshift, cluster EMR, môi trường thực thi của Glue cuối cùng đều chạy trên năng lực EC2), nhưng data engineer hiếm khi tự cấp phát EC2 thô cho workload dữ liệu ngày nay — các nền tảng compute chung đã được trình bày ở bài cloud fundamentals, bài này chỉ xem EC2 như nền tảng mà các dịch vụ khác xây dựng trên đó.

Một pipeline AWS-native điển hình ghép các mảnh này theo mô hình có thể đoán trước: database ứng dụng (RDS/Aurora) hoặc nguồn bên ngoài đổ file thô vào S3; một S3 event kích hoạt hàm Lambda hoặc step function khởi động job Glue ETL; Glue đăng ký các bảng kết quả vào Data Catalog; Redshift (load qua COPY từ S3, hoặc query trực tiếp qua Spectrum) hoặc Athena phục vụ truy vấn phân tích; và một công cụ BI (QuickSight hoặc bên thứ ba) nằm trên cùng.

Azure data stack

Azure data stack phản chiếu khá sát hình dạng của AWS, dịch vụ tương ứng dịch vụ, đây thường là cách học nhanh nhất nếu bạn đã biết AWS.

Azure Blob Storage là object storage và nền tảng data lake của Azure, đóng vai trò tương tự S3. Azure Data Lake Storage Gen2 (ADLS Gen2) là Blob Storage được bật thêm hierarchical namespace, cho nó ngữ nghĩa thư mục thực sự và ACL kiểu POSIX — cấu hình mà data engineer thực sự muốn cho một lake, thay vì Blob Storage phẳng thông thường.

Azure SQL Database là database quan hệ OLTP được quản lý của Azure (engine SQL Server dưới dạng dịch vụ) — đối tác nguồn vận hành tương ứng với RDS của AWS, và, giống RDS, chủ yếu liên quan đến data engineer như một hệ thống nguồn để trích xuất chứ không phải nơi xây warehouse.

Azure Data Factory (ADF) là câu trả lời duy nhất của Azure cho những gì AWS chia thành Glue một orchestrator riêng (như Managed Airflow hay Step Functions): nó vừa là công cụ ETL/ELT (với trình thiết kế pipeline trực quan và “mapping data flow” biên dịch xuống Spark bên dưới, tinh thần tương tự Glue ETL), vừa là orchestrator pipeline đầy đủ với scheduling, trigger, quản lý phụ thuộc, tinh thần tương tự Airflow. Sự kết hợp hai vai trò này là khác biệt cấu trúc quan trọng nhất cần nắm khi chuyển đổi giữa các cloud: nơi một pipeline AWS thường nối Glue (transform) với một orchestrator riêng, một pipeline Azure thường làm cả hai việc chỉ trong ADF.

Azure Cosmos DB là database NoSQL đa mô hình (multi-model), phân tán toàn cầu của Azure — hỗ trợ các mẫu truy cập document, key-value, graph (Gremlin API), và column-family (Cassandra API) trên cùng một engine nền, với các mức consistency có thể điều chỉnh từ strong đến eventual. Nó được trình bày từ góc độ modeling NoSQL trong ./05-nosql-databases.md; trong ngữ cảnh cloud platform, Cosmos DB thường xuất hiện như một hệ thống nguồn vận hành độ trễ thấp (hoặc đôi khi là serving layer cho một data product) mà ADF hay Azure Functions trích xuất theo lịch hoặc qua change feed.

Azure Virtual Machines đóng vai trò nền tảng giống EC2 bên AWS — các dịch vụ dữ liệu chuyên biệt (integration runtime của Data Factory, dedicated SQL pool của Synapse) chạy trên năng lực VM, nhưng data engineer hiếm khi tự cấp phát VM thô cho công việc pipeline.

Lưu ý rằng dịch vụ warehouse chuyên dụng của Azure — Azure Synapse Analytics — là đối tác gần nhất của Azure với Redshift/BigQuery/Snowflake (một warehouse SQL MPP với serverless on-demand query pool bên cạnh dedicated pool được cấp phát), nhưng roadmap gom câu chuyện data-warehousing cốt lõi của Azure chủ yếu quanh việc Data Factory điều phối dữ liệu vào Azure SQL/Synapse/Cosmos DB hơn là xem Synapse như một chủ đề riêng; đáng để biết nó tồn tại và vị trí của nó trong bảng so sánh AWS/GCP bên dưới.

GCP data stack

Cấu trúc GCP nhìn tương tự AWS và Azure ở lớp storage, nhưng warehouse của nó là một mô hình vận hành thực sự khác biệt, chứ không chỉ là cụm MPP đổi tên.

Google Cloud Storage (GCS) là object storage và nền tảng data lake của GCP — vai trò tương tự S3 và Blob Storage, với các khái niệm riêng của GCS như storage class (Standard, Nearline, Coldline, Archive) để phân tầng chi phí theo lifecycle.

BigQuery là data warehouse serverless của GCP, và từ “serverless” ở đây thực sự mang ý nghĩa kiến trúc chứ không chỉ là marketing: không có cluster nào để size, cấp phát, hay resize. Bạn load hoặc stream dữ liệu vào, viết SQL, và execution engine của BigQuery (bắt nguồn từ Dremel, dùng kiến trúc distributed shuffle gọi là Borg bên dưới) cấp phát bất kỳ lượng compute nào một query cần từ một pool đa người dùng chung, trong suốt, theo từng query. Mô hình pricing đi theo đúng triết lý serverless này: on-demand pricing tính phí theo byte quét mỗi query (khuyến khích cắt cột và lọc theo partition để kiểm soát chi phí), trong khi capacity-based (flat-rate) pricing cho phép người dùng khối lượng lớn đặt trước một số lượng “slot” cố định (đơn vị compute query của BigQuery) để có chi phí ổn định, không phụ thuộc workload. Đây là một mô hình tư duy khác biệt đáng kể so với Redshift hay Snowflake, nơi bạn vẫn phải chọn và quản lý kích thước warehouse/cluster dù nó có thể auto-scale — với BigQuery trong mô hình on-demand thì không có kích thước nào để chọn cả.

Dataflow là dịch vụ thực thi được quản lý hoàn toàn của GCP cho các pipeline Apache Beam, xử lý cả batch và streaming với cùng một mô hình lập trình, cùng cơ chế autoscaling được quản lý — đối tác trực tiếp với những gì Glue ETL/Spark làm bên AWS hay mapping data flow của Data Factory làm bên Azure, nhưng xây trên mô hình trừu tượng batch/streaming thống nhất của Beam thay vì Spark.

Compute Engine là dịch vụ VM thô của GCP, đóng vai trò nền tảng giống EC2/Azure VM — cũng hiếm khi được data engineer tự cấp phát trực tiếp cho logic pipeline.

Google Deployment Manager là dịch vụ infrastructure-as-code gốc ban đầu của GCP (template YAML/Jinja/Python mô tả tài nguyên GCP theo kiểu khai báo) — câu trả lời ban đầu của GCP cho CloudFormation, dù trong thực tế phần lớn các nhóm dữ liệu dùng GCP ngày nay chuyển sang Terraform vì cùng lý do nhất quán đa-cloud trình bày bên dưới, và Google cũng đang định hướng công việc IaC mới về phía provider GCP của Terraform và Config Connector thay vì tiếp tục đầu tư cho Deployment Manager.

Snowflake: warehouse cloud-agnostic

Snowflake không phát minh ra cloud data warehousing, nhưng đây là nền tảng chịu trách nhiệm lớn nhất trong việc phổ biến kiến trúc storage/compute/services tách rời như một chuẩn kỳ vọng cho warehouse hiện đại, và trong việc làm cho kiến trúc đó khả dụng đồng nhất trên cả ba cloud lớn.

Kiến trúc Snowflake có ba lớp riêng biệt. Storage layer giữ toàn bộ dữ liệu, được nén và tổ chức theo định dạng micro-partition độc quyền của Snowflake, nằm vật lý trên bất kỳ object storage cloud nền nào (S3, Azure Blob, hoặc GCS) mà tài khoản Snowflake được triển khai — nhưng điều này được trừu tượng hóa hoàn toàn khỏi người dùng; bạn không bao giờ đụng vào bucket hay tự cấu hình storage. Compute layer gồm các virtual warehouse — các cụm tài nguyên compute độc lập, có kích thước theo “cỡ áo” (X-Small đến 6X-Large và hơn), mỗi cái có thể được bật, resize, hoặc tắt trong vài giây, và nhiều virtual warehouse có thể query cùng dữ liệu nền đồng thời mà không tranh giành compute với nhau, vì mỗi warehouse có phần compute riêng dành cho nó. Cloud services layer xử lý xác thực, metadata, phân tích và tối ưu query, và kiểm soát truy cập, điều phối giữa hai lớp còn lại.

Hai tính năng vận hành xuất phát trực tiếp từ kiến trúc này và giải thích phần lớn sự phổ biến của Snowflake. Auto-suspend và auto-resume cho phép một virtual warehouse tự động tạm dừng sau một khoảng thời gian nhàn rỗi có thể cấu hình (dừng tính phí compute hoàn toàn — bạn không trả gì khi tạm dừng, vì tính phí storage hoàn toàn tách biệt) và tự động khôi phục ngay khi có query mới đến, thường trong một hai giây. Điều này biến “chỉ trả tiền cho compute thực sự dùng” thành hành vi mặc định thay vì thứ bạn phải tự xây dựng. Multi-cluster warehouse cho phép một warehouse logic duy nhất tự động thêm hoặc bớt cụm song song để phản ứng với tải query đồng thời, giải quyết bài toán “nhiều analyst cùng vào dashboard lúc 9 giờ sáng” mà không cần can thiệp thủ công hay ai đó quyết định resize.

Khả năng nổi bật khác của Snowflake là Secure Data Sharing (và Snowflake Marketplace rộng hơn xây trên đó): dữ liệu có thể được chia sẻ trực tiếp, chỉ đọc, không cần sao chép, giữa các tài khoản Snowflake — kể cả xuyên qua các nhà cung cấp cloud và khu vực khác nhau — vì định dạng storage và metadata nền tảng nhất quán bất kể tài khoản đó được triển khai trên cloud nào. Một công ty chạy tài khoản Snowflake trên Azure có thể chia sẻ một tập dữ liệu sống với đối tác chạy tài khoản của họ trên AWS mà không cần ETL, không truyền file, không nhân bản dữ liệu.

Kết hợp lại — sự tách rời storage/compute được làm tốt, mô hình vận hành thực sự đơn giản (không cần tune distribution key, sort key, hay job vacuum như Redshift trước đây thường yêu cầu), hành vi và giá cả nhất quán bất kể bạn chọn cloud nền nào, và chia sẻ dữ liệu không ma sát — giải thích vì sao Snowflake phát triển từ “một lựa chọn warehouse khác” thành nền tảng mà nhiều tổ chức coi như một “cloud thứ tư” thực thụ, nằm trên AWS, Azure, hoặc GCP thay vì chỉ cạnh tranh như một dịch vụ bên trong một trong số đó.

Khái niệm chính

Infrastructure as code cho data platform

Cấp phát warehouse, database/schema của nó, virtual warehouse (Snowflake) hay cluster (Redshift), IAM role và grant, cùng các pipeline nuôi chúng bằng tay — qua web console — không scale được quá vài môi trường, và không để lại lịch sử có thể review về lý do một permission hay resource nào đó tồn tại. Cơ chế chung của infrastructure as code — desired-state reconciliation, công cụ khai báo (declarative) so với mệnh lệnh (imperative), quản lý state, drift — đã được trình bày sâu trong ../devops/en/12-infrastructure-as-code.md; bài này chỉ bổ sung phần đặc thù cho data platform.

Terraform, và bản fork mã nguồn mở của nó OpenTofu (ra đời sau khi HashiCorp đổi license Terraform từ MPL sang BUSL hạn chế hơn năm 2023 — xem bài IaC để biết toàn bộ câu chuyện), là các công cụ thống trị để cấp phát hạ tầng dữ liệu chính vì chúng có provider hạng nhất, được duy trì tích cực cho cả bốn nền tảng trong bài này: provider snowflake chính thức quản lý database, schema, warehouse, user, role, và grant bên trong tài khoản Snowflake dưới dạng code, song song với các resource provider aws, azurerm, và google cho S3 bucket, Redshift cluster, BigQuery dataset, hay ADF pipeline trong cùng một hoặc cấu hình đi kèm. Điều này quan trọng với data platform hơn hầu hết mọi lĩnh vực hạ tầng khác, vì phần lớn công việc data platform hàng ngày chính là quản lý permission và access — ai có thể query schema nào, role nào được dùng warehouse nào, service account nào được ghi vào bucket nào — và Terraform/OpenTofu biến tất cả những thứ đó thành cấu hình có version control, có thể review, có thể diff, thay vì thao tác console một lần rồi thôi.

AWS CDK (Cloud Development Kit) đáng để biết như một mô hình thay thế: thay vì ngôn ngữ cấu hình khai báo (HCL), bạn viết code thực sự bằng TypeScript, Python, Java, hoặc ngôn ngữ đa dụng khác, và CDK tổng hợp nó xuống thành CloudFormation template. Cách này mang lại các cấu trúc lập trình thực sự — vòng lặp, điều kiện, hàm, unit test, thư viện các construct best-practice dùng chung của tổ chức — đổi lại là chỉ dùng được cho AWS. Các nhóm đã đầu tư sâu vào hệ sinh thái AWS, với kỹ sư thoải mái viết code hơn HCL, thường ưa CDK chính vì lý do đó; các nhóm đa-cloud hoặc có dùng Snowflake hầu như luôn chọn Terraform/OpenTofu, đơn giản vì CDK không có cách nào quản lý resource của Snowflake, Azure, hay GCP.

Các lựa chọn serverless cho xử lý dữ liệu

Serverless query engine và compute theo sự kiện (event-driven) là mẫu hình lặp lại xuyên suốt mọi cloud được nhắc trong bài này, và chúng quan trọng chính vì workload phân tích và pipeline thường có tính bùng phát, khó dự đoán hơn là ổn định.

Serverless query engine — chế độ on-demand của BigQuery, Athena bên AWS, và Redshift Serverless — đều chia sẻ cùng một giá trị cốt lõi: không có cluster nào nằm không chờ query tiếp theo, nên chi phí bám sát mức sử dụng thực tế (byte quét, hay giây compute) thay vì dung lượng được cấp phát sẵn. Điều này phù hợp đặc biệt tốt với phân tích ad-hoc, báo cáo không thường xuyên, và workload có khối lượng query khó đoán hoặc bùng phát, vì không có quyết định capacity-planning nào có thể sai theo cả hai hướng (quá nhỏ thì query xếp hàng; quá lớn thì lãng phí năng lực nhàn rỗi).

Compute theo sự kiện, kích hoạt khi file đến (event-driven, file-arrival-triggered) là mẫu hình serverless lớn còn lại, và đây là cơ chế đứng sau phần lớn pipeline ingestion hiện đại: một object đáp xuống S3 (hoặc Blob Storage, hoặc GCS) phát ra event notification, kích hoạt một hàm serverless (Lambda, Azure Functions, Cloud Functions/Cloud Run) khởi động xử lý phía sau — kiểm tra file, kích hoạt job Glue hay pipeline Dataflow, hoặc load vào warehouse. Cách này phù hợp đặc biệt tốt với ingestion dữ liệu vì việc file đến vốn dĩ không đều (một đối tác thả file bất cứ khi nào hệ thống của họ sinh ra nó, không theo lịch của bạn), và chỉ trả tiền cho vài giây compute cần để phản ứng với mỗi lần file đến sẽ tốt hơn chạy một poller hay job theo lịch cố định nhàn rỗi phần lớn thời gian và đôi khi bị trễ.

Chọn công nghệ phù hợp

Không có “stack tốt nhất” duy nhất cho cloud data, và việc xem đây thuần túy là so sánh công nghệ sẽ bỏ lỡ những yếu tố thực sự quyết định trong thực tế.

Cam kết cloud hiện có chi phối phần lớn các tổ chức: một công ty đã chạy hạ tầng ứng dụng trên AWS sẽ mặc định dùng Redshift/Glue/Athena vì cùng lý do họ mặc định dùng mọi dịch vụ AWS khác — setup IAM sẵn có, networking sẵn có, quan hệ vendor và chiết khấu doanh nghiệp sẵn có, đội ngũ đã quen thuộc. Logic tương tự áp dụng đối xứng cho các tổ chức đã cam kết với Azure và GCP. Một yếu tố duy nhất này lấn át phần lớn so sánh ở mức tính năng đối với đa số các nhóm.

Kỹ năng của đội ngũ quan trọng độc lập với cam kết cloud: một nhóm gồm nhiều analyst SQL giỏi và ít data engineer chuyên trách thường nghiêng về BigQuery hoặc Snowflake chính vì họ phải quản lý rất ít hạ tầng hàng ngày, trong khi một nhóm có chuyên môn sâu về Spark và hạ tầng có thể khai thác nhiều giá trị hơn từ khả năng tùy chỉnh cao hơn của Redshift hay Databricks.

Mô hình chi phí là một quyết định kiến trúc thực sự, không chỉ là so sánh dòng chi phí: pay-per-query (BigQuery on-demand, Athena, Snowflake với auto-suspend tích cực) thưởng cho workload bùng phát, khó đoán và phạt workload nặng, ổn định liên tục, trong khi capacity dự trữ/flat-rate (BigQuery flat-rate slot, Redshift reserved instance, Snowflake với warehouse chạy gần như liên tục) trở nên rẻ hơn. Các nhóm thường nhầm lẫn hai chiều này — cấp phát dung lượng dự trữ cho workload bùng phát, hoặc dùng pricing on-demand cho workload chưa bao giờ thực sự ngừng — và đây là một trong những nguồn phổ biến nhất gây vượt chi phí cloud data platform.

Khối lượng và tốc độ dữ liệu đẩy về những công cụ cụ thể bất kể ưu tiên cloud nào: ingestion streaming thông lượng rất cao có xu hướng kéo theo Kafka/Kinesis/Pub/Sub cộng với bộ xử lý hỗ trợ streaming (Dataflow, Flink) bất kể warehouse nào ở phía sau, trong khi workload phân tích thuần batch, khối lượng vừa phải được phục vụ thoải mái bởi hầu như bất kỳ nền tảng nào trong bốn nền tảng ở bài này.

Mức chấp nhận vendor lock-in là yếu tố chiến lược nhất và khó đảo ngược nhất. Sử dụng sâu các dịch vụ độc quyền cloud-native (mô hình job cụ thể của Glue, định dạng pipeline độc quyền của ADF, các phần mở rộng SQL riêng của BigQuery) hiệu quả nhưng tốn kém để gỡ bỏ sau này; tính portable đa-cloud của Snowflake và việc dựa vào SQL chuẩn và connector mở giảm lock-in với một cloud cụ thể nhưng vẫn tạo ra lock-in riêng với Snowflake; dựa vào open table format (Iceberg, Delta Lake — xem ./07-data-lakes-and-modern-architectures.md) và compute engine mở (Spark, Trino) trên nền object storage thuần giảm lock-in nhiều nhất, đổi lại bạn phải tự làm nhiều việc tích hợp và vận hành hơn. Không lựa chọn nào trong số này sai tự thân — đó là các điểm khác nhau trên một đánh đổi thực sự giữa sự đơn giản vận hành và tính linh hoạt dài hạn, và câu trả lời đúng phụ thuộc vào việc sự linh hoạt đó thực sự đáng giá bao nhiêu với một tổ chức cụ thể.

Bảng so sánh: AWS vs. Azure vs. GCP vs. Snowflake

Khía cạnhAWSAzureGCPSnowflake
Object storage (nền tảng lake)S3Azure Blob Storage / ADLS Gen2Google Cloud Storage (GCS)Nội bộ (được trừu tượng hóa; nằm trên S3/Blob/GCS tùy triển khai)
Data warehouseRedshift (provisioned cluster hoặc Serverless)Synapse Analytics (dedicated hoặc serverless SQL pool)BigQuery (serverless hoàn toàn)Snowflake (virtual warehouse)
Mô hình vận hành warehouseChọn/quản lý cluster (hoặc khoảng RPU serverless)Chọn dedicated pool, hoặc dùng serverless on-demand poolKhông có cluster nào để quản lý; execution cấp phát theo từng queryChọn/resize virtual warehouse (cỡ “áo”); có thể auto-suspend/resume
Managed OLTP source DBRDS / AuroraAzure SQL DatabaseCloud SQL / AlloyDBN/A (không phải engine OLTP; ingest từ mọi nguồn)
NoSQL / multi-model DBDynamoDBCosmos DBFirestore / BigtableN/A
ETL / tích hợp dữ liệuGlue (ETL + Data Catalog)Data Factory (ETL + orchestration trong một)Dataflow (Apache Beam, batch + streaming)Snowpipe (ingestion) + Streams/Tasks (transform trong warehouse); thường đi kèm dbt
OrchestrationStep Functions / Managed Airflow (tách rời khỏi Glue)Data Factory (tích hợp sẵn)Cloud Composer (Airflow được quản lý)Bên ngoài (Airflow, dbt Cloud, Snowflake Tasks cho trường hợp đơn giản)
Serverless SQL query engineAthena (Trino/Presto trên S3)Synapse serverless SQL poolBigQuery on-demandN/A (bản thân warehouse là query engine)
Metadata catalogGlue Data Catalog (dùng chung cho Athena, Spectrum, EMR)Microsoft PurviewData Catalog (thuộc Dataplex)Metadata tài khoản tích hợp sẵn; tích hợp với catalog bên ngoài
IaC gốcCloudFormation, CDKARM templates / BicepDeployment Manager (legacy), Config ConnectorN/A — cấp phát qua provider snowflake của Terraform/OpenTofu
IaC đa-cloudTerraform / OpenTofuTerraform / OpenTofuTerraform / OpenTofuTerraform / OpenTofu
Chia sẻ dữ liệu xuyên cloudHạn chế (theo từng dịch vụ, thường qua replication)Hạn chế (theo từng dịch vụ)Hạn chế (theo từng dịch vụ)Native (Secure Data Sharing / Marketplace, xuyên cloud và khu vực)
Mô hình giáTheo node-hour (provisioned) hoặc theo giây (Serverless); Athena theo byte quétTheo DWU/vCore (dedicated) hoặc theo dữ liệu xử lý (serverless pool)Theo byte quét (on-demand) hoặc theo slot (flat-rate/capacity)Theo giây compute của virtual warehouse (tách biệt với storage)
Tách rời storage/computeCó (node RA3, Serverless)Một phần (dedicated pool của Synapse ít hơn; serverless pool thì có)Có, hoàn toàn (thiết kế cốt lõi)Có, hoàn toàn (thiết kế cốt lõi, do Snowflake tiên phong)
Phù hợp nhất vớiNhóm đã dùng AWS; cần bắc cầu lake/warehouse kiểu SpectrumNhóm đã dùng Azure/Microsoft stack; muốn ETL+orchestration trong một công cụNhóm muốn không phải quản lý cluster; workload query BI/ad-hoc nặngTổ chức đa-cloud, cross-cloud, hoặc cần chia sẻ dữ liệu nhiều; nhóm muốn tối thiểu việc tune warehouse

Best Practices

Tài liệu tham khảo

Part of the Data Engineer Roadmap knowledge base.

Overview

Almost every data platform built today is built on someone else’s servers. That is not a footnote — it is the defining operational fact of modern data engineering, and it is worth understanding why before cataloguing which service does what. The general mechanics of the three major clouds — IAM, networking, compute instances, block/object storage, managed relational databases — are already covered in ../cloud/README.md and its AWS/GCP deep dives; this note assumes that foundation and does not repeat it. What it covers instead is the layer that sits directly on top of that foundation and is specific to this roadmap: the data warehouses, lakes, and ETL/orchestration services that data engineers actually spend their days operating, plus Snowflake, the cloud-agnostic warehouse that has become a fourth platform in its own right alongside AWS, Azure, and GCP.

Three forces explain why cloud platforms displaced on-premises data warehouses so completely over the last decade. First, analytical workloads are inherently spiky: a nightly batch load or an end-of-quarter reporting rush needs far more compute than an average Tuesday afternoon, and a fixed on-prem cluster sized for the peak sits mostly idle the rest of the time — cloud elasticity lets compute scale up for the spike and back down (or to zero) afterward, so you pay closer to what you actually use. Second, and more architecturally significant, modern cloud warehouses separate storage from compute — a trait pioneered by Snowflake and now shared by BigQuery and modern Redshift (Redshift Serverless, and RA3 nodes with managed storage) — so that the two scale, and are billed, independently. You can hold petabytes of historical data cheaply in object storage while running a small compute cluster against it most of the time, then spin up much larger compute for a specific job, without ever having to move or re-shard the data itself. Third, managed services shift operational burden — patching, node failure recovery, backup, tuning, capacity planning — onto the cloud provider, so a team of a few data engineers can now run infrastructure that a decade ago required a dedicated on-prem database administration team.

Fundamentals

The separation of storage and compute

Understanding this one architectural idea unlocks most of what makes modern cloud warehouses behave the way they do, so it is worth dwelling on before touring individual services.

A classic on-premises MPP (massively parallel processing) appliance — think a Teradata or an early-generation Redshift cluster with dense-compute nodes — bundles storage and compute into the same physical nodes. Each node holds a shard of the data and the CPU/RAM that queries that shard. This is fast for well-distributed workloads, but it means storage and compute can only be scaled together: adding capacity to hold more historical data also means paying for more compute whether you need it or not, and resizing the cluster is a slow, often disruptive operation because data has to be redistributed across the new node count.

Separating the two layers — object storage (S3, ADLS, GCS, or Snowflake’s internal storage, all ultimately backed by the same kind of cheap, durable, effectively infinite blob storage) holds the data, while independent, ephemeral compute clusters attach to that storage on demand — breaks that coupling. Storage grows by simply writing more files, at cents per GB per month, with no compute implication at all. Compute is provisioned, resized, paused, and billed as a completely separate dimension, often per-second or per-query. This is what makes it economically sane to keep years of raw history “just in case” (storage is nearly free) while still controlling costs tightly on the compute side (pause it when nobody is querying, scale it up only for the workload that needs it). Snowflake built its entire architecture around this idea from day one; BigQuery took it further into a fully serverless model where you barely think about compute clusters at all; Redshift retrofitted it via RA3 node types and Redshift Serverless, moving away from its original tightly-coupled dense-compute design.

AWS data stack

AWS’s data services are best understood as a set of well-defined, individually-provisioned building blocks that a data engineer wires together, rather than one integrated product.

Amazon S3 is the foundation almost everything else in the AWS data stack sits on top of. It is the de facto standard data lake storage layer across the industry, not just AWS — cheap, durable object storage with virtually unlimited capacity, versioning, lifecycle policies to tier cold data into Glacier, and — critically for pipelines — the ability to emit an S3 event notification the instant an object is created, which is the trigger most AWS-native ingestion pipelines are built around.

Amazon Redshift is AWS’s MPP data warehouse, covered in architectural depth in ./06-data-modeling-and-warehousing.md (columnar storage, distribution styles, sort keys). Redshift now offers two operating modes: provisioned clusters (you choose node type and count, pay per node-hour, and — with RA3 nodes — get separated managed storage backed by S3) and Redshift Serverless (you specify a capacity range in Redshift Processing Units and it scales automatically, billed per second of actual usage). Redshift Spectrum lets a Redshift cluster query data sitting directly in S3 as external tables, without loading it first — a lightweight lake/warehouse bridge that predates the broader lakehouse trend.

RDS and Aurora are AWS’s managed OLTP databases (PostgreSQL, MySQL, and others) — the operational systems that generate the data a warehouse ultimately ingests, rather than analytical engines themselves. Aurora adds AWS-specific storage and replication engineering on top of the open-source engines for higher throughput and faster failover. Data engineers mostly interact with RDS/Aurora as a source system: extracting via change data capture (Aurora and RDS both support this, often paired with AWS Database Migration Service) or scheduled batch extracts feeding into the warehouse or lake.

AWS Glue is AWS’s managed ETL and metadata service, and it does two distinct jobs that are easy to conflate. Glue ETL runs serverless Apache Spark jobs (or simpler Python shell jobs) to transform data, generated either from a visual job editor or hand-written PySpark. The Glue Data Catalog is a persistent, Hive-metastore-compatible metadata store: it holds table definitions (schema, location, partitioning) for data sitting in S3, and a huge portion of the AWS analytics ecosystem — Athena, Redshift Spectrum, EMR, Glue ETL jobs themselves — reads from this same shared catalog, so registering a table’s schema once in Glue makes it visible to every one of those engines. Amazon Athena is AWS’s serverless, pay-per-query SQL engine (built on Trino/Presto) that queries data directly in S3 using the Glue Data Catalog for schema — the AWS-native example of the “serverless query engine” pattern that BigQuery epitomizes on GCP.

EC2 underlies almost every AWS service in some form (Redshift nodes, EMR clusters, Glue’s execution environment all ultimately run on EC2 capacity), but data engineers rarely provision raw EC2 instances directly for data workloads today — general compute fundamentals are covered in the cloud fundamentals notes, and this note treats EC2 only as the substrate other services build on.

A typical AWS-native pipeline composes these pieces predictably: application databases (RDS/Aurora) or external sources land raw files in S3; an S3 event triggers a Lambda function or step function that kicks off a Glue ETL job; Glue registers the resulting tables in the Data Catalog; Redshift (loaded via COPY from S3, or queried live via Spectrum) or Athena serve the analytical queries; and a BI tool (QuickSight or a third party) sits on top.

Azure data stack

Azure’s data stack mirrors AWS’s shape closely, service-for-service, which is often the fastest way to learn it if you already know AWS.

Azure Blob Storage is Azure’s object storage and data lake foundation, playing the same role S3 plays on AWS. Azure Data Lake Storage Gen2 (ADLS Gen2) is Blob Storage with a hierarchical namespace enabled on top, giving it real directory semantics and POSIX-like ACLs — the configuration data engineers actually want for a lake, rather than plain flat Blob Storage.

Azure SQL Database is Azure’s managed OLTP relational database (SQL Server engine as a service) — the operational-source counterpart to AWS’s RDS, and, like RDS, mostly relevant to a data engineer as a source system to extract from rather than a target to build a warehouse on.

Azure Data Factory (ADF) is Azure’s single answer to what AWS splits across Glue and a separate orchestrator (like Managed Airflow or Step Functions): it is both an ETL/ELT tool (with a visual pipeline designer and “mapping data flows” that compile down to Spark under the hood, similar in spirit to Glue ETL) and a full pipeline orchestrator with scheduling, triggers, and dependency management, similar in spirit to Airflow. This dual role is the single biggest structural difference to internalize when moving between clouds: where an AWS pipeline typically wires Glue (transform) to a separate orchestrator, an Azure pipeline often does both inside ADF alone.

Azure Cosmos DB is Azure’s globally-distributed, multi-model NoSQL database — document, key-value, graph (Gremlin API), and column-family (Cassandra API) access patterns over the same underlying engine, with tunable consistency levels from strong to eventual. It is covered from the NoSQL-modeling side in ./05-nosql-databases.md; in the cloud-platform context, Cosmos DB most often shows up as a low-latency operational source (or occasionally a serving layer for a data product) that ADF or Azure Functions extract from on a schedule or via change feed.

Azure Virtual Machines play the same substrate role EC2 plays on AWS — data-specific services (Data Factory integration runtimes, Synapse’s dedicated SQL pools) run on top of VM capacity, but data engineers rarely provision bare VMs directly for pipeline work.

Note that Azure’s dedicated cloud warehouse offering — Azure Synapse Analytics — is the closest Azure analogue to Redshift/BigQuery/Snowflake (an MPP SQL warehouse with a serverless on-demand query pool alongside provisioned dedicated pools), but the roadmap groups Azure’s core data-warehousing story primarily around Data Factory orchestrating data into Azure SQL/Synapse/Cosmos DB rather than treating Synapse as a separate topic; worth knowing it exists and where it would slot into the AWS/GCP comparison (see the table below).

GCP data stack

GCP’s stack looks structurally similar to AWS and Azure’s at the storage layer, but its warehouse is a genuinely different operating model, not just a rebranded MPP cluster.

Google Cloud Storage (GCS) is GCP’s object storage and data lake foundation — the same role S3 and Blob Storage play, with GCS-native concepts like storage classes (Standard, Nearline, Coldline, Archive) for lifecycle-based cost tiering.

BigQuery is GCP’s serverless data warehouse, and “serverless” here is doing real architectural work, not just marketing: there is no cluster to size, provision, or resize. You load or stream data in, write SQL, and BigQuery’s execution engine (Dremel-derived, using a distributed shuffle-based architecture called Borg under the hood) allocates whatever compute a query needs from a shared multi-tenant pool, transparently, per query. Pricing follows this same serverless philosophy: on-demand pricing bills per byte scanned per query (encouraging column pruning and partition filtering to control cost), while capacity-based (flat-rate) pricing lets high-volume users reserve a fixed number of “slots” (BigQuery’s unit of query compute) for predictable, workload-independent cost. This is a meaningfully different mental model from Redshift or Snowflake, where you still choose and manage a warehouse/cluster size even if it can auto-scale — with BigQuery there is no size to choose in the on-demand model at all.

Dataflow is GCP’s fully managed execution service for Apache Beam pipelines, handling both batch and streaming with the same programming model and the same managed autoscaling — a direct analogue to what Glue ETL/Spark does on AWS or Data Factory’s mapping data flows do on Azure, but built on Beam’s unified batch/streaming abstraction rather than Spark’s.

Compute Engine is GCP’s raw VM service, playing the same substrate role as EC2/Azure VMs — again, rarely provisioned directly by data engineers for pipeline logic itself.

Google Deployment Manager is GCP’s original native infrastructure-as-code service (YAML/Jinja/Python templates describing GCP resources declaratively) — GCP’s original answer to CloudFormation, though in practice most GCP-based data teams today reach for Terraform instead, for the same cross-cloud-consistency reasons discussed below, and Google has been steering new IaC work toward Terraform’s GCP provider and Config Connector rather than continued Deployment Manager investment.

Snowflake: the cloud-agnostic warehouse

Snowflake did not invent cloud data warehousing, but it is the platform most responsible for popularizing the separated storage/compute/services architecture as the expected baseline for a modern warehouse, and for making that architecture available identically across all three major clouds.

Snowflake’s architecture has three distinct layers. The storage layer holds all data, compressed and organized into Snowflake’s proprietary micro-partition format, physically sitting on whichever underlying cloud object storage (S3, Azure Blob, or GCS) the Snowflake account is deployed on — but this is deliberately abstracted away from the user entirely; you never touch a bucket or configure storage directly. The compute layer is made of virtual warehouses — independent clusters of compute resources, sized in “T-shirt sizes” (X-Small through 6X-Large and beyond), each of which can be spun up, resized, or torn down in seconds, and multiple virtual warehouses can query the same underlying data concurrently without contending with each other for compute, because each warehouse gets its own dedicated compute allocation. The cloud services layer handles authentication, metadata, query parsing and optimization, and access control, coordinating across the other two layers.

Two operational features fall directly out of this architecture and explain much of Snowflake’s popularity. Auto-suspend and auto-resume let a virtual warehouse automatically pause after a configurable idle period (stopping compute billing entirely — you pay nothing while paused, since storage billing is fully separate) and automatically resume the moment a new query arrives, typically within a second or two. This makes “pay only for compute you actually use” a default behavior rather than something you have to engineer yourself. Multi-cluster warehouses let a single logical warehouse automatically add or remove parallel clusters in response to concurrent query load, solving the “many analysts hit the dashboard at 9am” concurrency problem without any manual intervention or a human deciding to resize anything.

Snowflake’s other headline capability is Secure Data Sharing (and the broader Snowflake Marketplace built on it): data can be shared live, read-only, and without copying, between Snowflake accounts — including across different cloud providers and regions — because the underlying storage format and metadata are consistent regardless of which cloud a given account happens to be deployed on. A company running its Snowflake account on Azure can share a live dataset with a partner running theirs on AWS with no ETL, no file transfer, and no data duplication involved.

Taken together — the storage/compute separation done well, a genuinely simple operational model (no tuning distribution keys, sort keys, or vacuum jobs the way Redshift historically required), consistent behavior and pricing regardless of which underlying cloud you pick, and frictionless data sharing — explain why Snowflake grew from “another warehouse option” into a platform many organizations treat as effectively a fourth cloud, sitting on top of AWS, Azure, or GCP rather than competing purely as a service within one of them.

Key Concepts

Infrastructure as code for data platforms

Provisioning a warehouse, its databases/schemas, virtual warehouses (Snowflake) or clusters (Redshift), IAM roles and grants, and the pipelines that feed them by hand — through a web console — does not scale past a handful of environments, and it leaves no reviewable history of why a given permission or resource exists. The general mechanics of infrastructure as code — desired-state reconciliation, declarative vs. imperative tools, state management, drift — are covered in depth in ../devops/en/12-infrastructure-as-code.md; this note only adds what is specific to data platforms.

Terraform, and its open-source fork OpenTofu (created after HashiCorp relicensed Terraform from MPL to the more restrictive BUSL in 2023 — see the IaC note for the full story), are the dominant tools for provisioning data infrastructure specifically because they have first-class, actively maintained providers for all four platforms in this note: the official snowflake provider manages databases, schemas, warehouses, users, roles, and grants inside a Snowflake account as code, right alongside aws, azurerm, and google provider resources for S3 buckets, Redshift clusters, BigQuery datasets, or ADF pipelines in the same or a companion configuration. This matters more for data platforms than almost any other infrastructure domain, because a huge fraction of day-to-day data platform work is permission and access management — who can query which schema, which warehouse a given role can use, which service account can write to which bucket — and Terraform/OpenTofu turn all of that into version-controlled, reviewable, diffable configuration rather than one-off console clicks.

AWS CDK (Cloud Development Kit) is worth knowing as the alternative model: instead of a declarative configuration language (HCL), you write actual TypeScript, Python, Java, or another general-purpose language, and CDK synthesizes that down to a CloudFormation template. This buys real programming constructs — loops, conditionals, functions, unit tests, shared libraries of organizational best-practice constructs — at the cost of being AWS-only. Teams already deep in the AWS ecosystem, with engineers more comfortable writing code than HCL, often prefer CDK for exactly that reason; multi-cloud or Snowflake-inclusive teams almost always end up on Terraform/OpenTofu instead, simply because CDK has no path to managing Snowflake, Azure, or GCP resources.

Serverless options for data processing

Serverless query engines and event-driven compute are a recurring pattern across every cloud discussed in this note, and they matter specifically because analytical and pipeline workloads are so often spiky and unpredictable rather than steady-state.

Serverless query engines — BigQuery’s on-demand mode, Athena on AWS, and Redshift Serverless — all share the same value proposition: no cluster sits around idle waiting for the next query, so cost tracks actual usage (bytes scanned, or seconds of compute) rather than provisioned capacity. This fits ad-hoc analytics, infrequent reporting, and workloads with unpredictable or bursty query volume especially well, since there is no capacity-planning decision to get wrong in either direction (too small and queries queue; too large and idle capacity is wasted).

Event-driven, file-arrival-triggered compute is the other major serverless pattern, and it is the mechanism behind most modern ingestion pipelines: an object landing in S3 (or Blob Storage, or GCS) fires an event notification, which invokes a serverless function (Lambda, Azure Functions, Cloud Functions/Cloud Run) that kicks off downstream processing — validating the file, triggering a Glue job or Dataflow pipeline, or loading it into a warehouse. This suits data ingestion particularly well because file arrival is inherently irregular (a partner drops a file whenever their system produces it, not on your schedule), and paying only for the few seconds of compute needed to react to each arrival beats running a poller or a fixed-schedule job that is idle most of the time and occasionally late.

Choosing the right technology

There is no single “best” cloud data stack, and treating this as a pure technology comparison misses the factors that actually decide it in practice.

Existing cloud commitment dominates in most organizations: a company already running its application infrastructure on AWS will default to Redshift/Glue/Athena for the same reasons it defaults to any other AWS service — existing IAM setup, existing networking, existing vendor relationship and enterprise discount, existing team familiarity. The same logic applies symmetrically to Azure- and GCP-committed organizations. This single factor overrides most feature-level comparisons for the majority of teams.

Team skill set matters independently of cloud commitment: a team of strong SQL analysts and few dedicated data engineers often gravitates toward BigQuery or Snowflake precisely because of how little infrastructure they have to manage day to day, whereas a team with deep Spark and infrastructure expertise may extract more value from Redshift’s or Databricks’ greater tunability.

Cost model is a real architectural decision, not just a line-item comparison: pay-per-query (BigQuery on-demand, Athena, Snowflake with aggressive auto-suspend) rewards spiky, unpredictable workloads and punishes constant, heavy, steady-state usage, where reserved/flat-rate capacity (BigQuery flat-rate slots, Redshift reserved instances, Snowflake with warehouses running near-continuously) becomes cheaper. Teams frequently get this backwards — provisioning reserved capacity for a bursty workload, or running on-demand pricing against a workload that never really stops — and it is one of the most common sources of cloud data-platform cost overruns.

Data volume and velocity push toward specific tools regardless of cloud preference: very high-throughput streaming ingestion tends to pull in Kafka/Kinesis/Pub/Sub plus a streaming-capable processor (Dataflow, Flink) regardless of which warehouse sits downstream, while pure batch, moderate-volume analytical workloads are comfortably served by almost any of the four platforms in this note.

Vendor lock-in tolerance is the most strategic and least reversible factor. Deep use of cloud-native, proprietary services (Glue’s specific job model, ADF’s proprietary pipeline format, BigQuery-specific SQL extensions) is efficient but expensive to unwind later; Snowflake’s cross-cloud portability and reliance on standard SQL and open connectors reduces lock-in to any one cloud but still creates Snowflake-specific lock-in; leaning on open table formats (Iceberg, Delta Lake — see ./07-data-lakes-and-modern-architectures.md) and open compute engines (Spark, Trino) on top of plain object storage minimizes lock-in the most, at the cost of taking on more integration and operational work yourself. None of these are wrong choices in isolation — they are different points on a real trade-off between operational simplicity and long-term flexibility, and the right answer depends on how much that flexibility is actually worth to a given organization.

Comparison table: AWS vs. Azure vs. GCP vs. Snowflake

DimensionAWSAzureGCPSnowflake
Object storage (lake foundation)S3Azure Blob Storage / ADLS Gen2Google Cloud Storage (GCS)Internal (abstracted; sits on S3/Blob/GCS depending on deployment)
Data warehouseRedshift (provisioned clusters or Serverless)Synapse Analytics (dedicated or serverless SQL pools)BigQuery (fully serverless)Snowflake (virtual warehouses)
Warehouse operating modelChoose/manage cluster (or serverless RPU range)Choose dedicated pool, or use serverless on-demand poolNo cluster to manage at all; execution allocated per queryChoose/resize virtual warehouse (“T-shirt” sizes); can auto-suspend/resume
Managed OLTP source DBRDS / AuroraAzure SQL DatabaseCloud SQL / AlloyDBN/A (not an OLTP engine; ingests from any source)
NoSQL / multi-model DBDynamoDBCosmos DBFirestore / BigtableN/A
ETL / data integrationGlue (ETL + Data Catalog)Data Factory (ETL + orchestration in one)Dataflow (Apache Beam, batch + streaming)Snowpipe (ingestion) + Streams/Tasks (in-warehouse transform); often paired with dbt
OrchestrationStep Functions / Managed Airflow (separate from Glue)Data Factory (built-in)Cloud Composer (managed Airflow)External (Airflow, dbt Cloud, Snowflake Tasks for simple cases)
Serverless SQL query engineAthena (Trino/Presto over S3)Synapse serverless SQL poolBigQuery on-demandN/A (warehouse itself is the query engine)
Metadata catalogGlue Data Catalog (shared across Athena, Spectrum, EMR)Microsoft PurviewData Catalog (part of Dataplex)Built-in account metadata; integrates with external catalogs
Native IaCCloudFormation, CDKARM templates / BicepDeployment Manager (legacy), Config ConnectorN/A — provisioned via Terraform/OpenTofu snowflake provider
Cross-cloud IaCTerraform / OpenTofuTerraform / OpenTofuTerraform / OpenTofuTerraform / OpenTofu
Cross-cloud data sharingLimited (per-service, often via replication)Limited (per-service)Limited (per-service)Native (Secure Data Sharing / Marketplace, across clouds and regions)
Pricing modelPer node-hour (provisioned) or per-second (Serverless); Athena per byte scannedPer DWU/vCore (dedicated) or per data processed (serverless pool)Per byte scanned (on-demand) or per-slot (flat-rate/capacity)Per-second of virtual warehouse compute (separate from storage)
Storage/compute separationYes (RA3 nodes, Serverless)Partial (Synapse dedicated pools less so; serverless pool yes)Yes, fully (core design)Yes, fully (core design, pioneered this)
Best fitTeams already on AWS; need Spectrum-style lake/warehouse bridgingTeams already on Azure/Microsoft stack; want ETL+orchestration in one toolTeams wanting zero cluster management; heavy ad-hoc/BI query patternsCross-cloud, multi-cloud, or data-sharing-heavy organizations; teams wanting minimal warehouse tuning

Best Practices

References