使用 CloudFormation 在 AWS 上部署 DuckLake
内容提要
本文介绍如何使用 CloudFormation 模板在 AWS 上部署 DuckLake。DuckLake 需要 S3 存储 Parquet 数据,并使用 Aurora PostgreSQL 作为元数据目录。该模板会创建 KMS 密钥、S3 存储桶(含强制 HTTPS 和加密的桶策略)、Aurora 集群与实例、IAM 策略和角色,并通过 OIDC 实现免静态密钥访问。CloudFormation 无需状态文件,失败时自动回滚,一条命令即可完成部署。
延伸解读
CloudFormation 与 Terraform 的关键差异
文章指出,CloudFormation 与 Terraform 相比有两个显著不同:一是无需状态文件,状态由 AWS 自身存储,因此没有 S3 后端、锁或状态损坏问题;二是失败时自动回滚,不会留下半部署的堆栈。这意味着运维负担更轻,但代价是绑定 AWS 生态,跨云或混合云场景可能不适用。
安全设计:分层防护与无静态密钥
模板通过 KMS 密钥、S3 桶策略和 IAM 策略构建了多层安全。桶策略强制拒绝 HTTP 和非 KMS 加密上传,即使 IAM 允许也无法绕过。IAM 角色使用 OIDC 联合,工作负载通过临时凭证访问,无需存储静态访问密钥。这种设计降低了密钥泄露风险,但要求工作负载平台支持 OIDC。
部署与运维的实用要点
部署前建议使用 cfn-lint 和 validate-template 检查模板。部署命令需指定 CAPABILITY_NAMED_IAM 以确认创建 IAM 资源。删除堆栈前必须清空 S3 桶,否则删除失败。生产环境应为桶设置 DeletionPolicy: Retain 防止误删数据,开发环境可用 Delete 自动清理。堆栈名称应包含环境标识,避免多环境资源命名冲突。
资源选型与成本考量
Aurora PostgreSQL 集群使用 db.t4g.medium 实例,文章认为对于元数据目录(主要处理模式查找和统计,而非重查询负载)是合理起点。但未提及具体价格或性能基准。读者需根据实际工作负载评估实例规格,并注意 Aurora 要求至少两个可用区的子网以实现高可用,这会影响网络配置和成本。
Q&A
DuckLake 在 AWS 上需要哪些基础设施?
DuckLake 需要两部分基础设施:一个用于存储 Parquet 数据文件的 S3 存储桶,以及一个用于元数据目录的 PostgreSQL 数据库(具体使用 Aurora PostgreSQL)。
CloudFormation 相比 Terraform 有什么优势?
CloudFormation 无需状态文件(状态存储在 AWS 自身,没有 S3 后端、锁定或状态损坏问题),并且在失败时自动回滚,避免半部署状态。
CloudFormation 模板中如何确保 S3 存储桶的安全?
通过桶策略设置拒绝规则:拒绝非 HTTPS 传输(aws:SecureTransport 为 false)和拒绝未加密的上传(要求 s3:x-amz-server-side-encryption 为 aws:kms)。这些规则强制所有调用者遵守,无法绕过。
如何为 DuckLake 的工作负载配置免静态密钥的 AWS 访问?
通过 IAM 角色和 OIDC 联合实现。角色信任策略允许 sts:AssumeRoleWithWebIdentity,工作负载(如 EKS 中的 Pod)提供 OIDC 令牌,AWS STS 验证后返回临时凭证(1 小时过期),SDK 自动刷新。无需存储静态访问密钥。
部署 DuckLake CloudFormation 栈的具体命令是什么?
使用 aws cloudformation deploy 命令,指定模板文件、栈名称、参数覆盖(如 EnvironmentName 和 DucklakeCatalogPassword),并添加 --capabilities CAPABILITY_NAMED_IAM 以确认创建 IAM 资源。
删除 DuckLake 栈时需要注意什么?
需要先清空 S3 存储桶(因为 S3 不会删除非空桶),然后使用 aws cloudformation delete-stack 删除栈,并等待完成。如果为生产环境设置了 DeletionPolicy: Retain,桶会保留。