0Pricing
AWS Solutions Architect · 课时

在 S3 上构建数据湖

设计基于 S3 的数据湖,划分落地区、处理区和精选区,应用存储桶策略,并按分区组织数据以提高查询效率

在 S3 上构建数据湖 是 CoddyKit 上的免费 AWS Solutions Architect 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AWS Solutions Architect 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AWS Solutions Architect 课程共包含 4 节课。

什么是数据湖?

数据湖是一种集中式存储库,可以以任意规模存储结构化、半结构化和非结构化数据。与数据仓库不同,数据湖会以数据的原始格式存储数据,直到分析时才进行处理。Amazon S3 凭借其持久性、可扩展性以及与分析服务的集成,成为 AWS 上最常见的数据湖基础。

数据湖分区架构

设计良好的 S3 数据湖通常使用三个逻辑分区:Landing Zone(原始摄取区,未经修改)、Processing Zone(已清洗和转换)以及 Curated Zone(可直接用于分析、可供业务使用)。每个分区通常对应一个独立的 S3 前缀或存储桶。这种模式有时也称为奖章架构(青铜、白银、黄金)。

# Example zone structure inside one S3 bucket
# s3://my-data-lake/
#   landing/    <- raw ingest from source systems
#   processing/ <- cleansed, validated data
#   curated/    <- aggregated, analytics-ready

创建 S3 存储桶结构

使用 AWS CLI 创建启用版本控制并加密的 S3 存储桶,并为每个分区应用前缀。启用版本控制,这样重新处理数据时始终可以回到原始源数据;同时启用服务器端加密(SSE-S3 或 SSE-KMS),以保护静态数据。阻止所有公共访问,确保数据保持私密。

aws s3api create-bucket \
  --bucket my-data-lake-123 \
  --region us-east-1

aws s3api put-bucket-versioning \
  --bucket my-data-lake-123 \
  --versioning-configuration Status=Enabled

aws s3api put-bucket-encryption \
  --bucket my-data-lake-123 \
  --server-side-encryption-configuration \
    '{"Rules":[{"ApplyServerSideEncryptionByDefault":{"SSEAlgorithm":"AES256"}}]}'

应用存储桶策略控制分区访问

每个分区都应拥有自己的访问策略,使不同团队和服务只能操作其所需的数据。例如,数据摄取角色可在 landing 前缀上执行 s3:PutObject,ETL 角色可读取 landing 分区并写入 processing 分区,而分析角色对 curated 分区只能进行只读访问。这样可以在数据湖内部实施最低权限原则。

# Attach a policy that allows the ETL role to read landing/ and write processing/
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {"AWS": "arn:aws:iam::123456789012:role/ETLRole"},
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::my-data-lake-123/landing/*"
    },
    {
      "Effect": "Allow",
      "Principal": {"AWS": "arn:aws:iam::123456789012:role/ETLRole"},
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::my-data-lake-123/processing/*"
    }
  ]
}

对数据进行分区以提高查询效率

分区通过与查询谓词对应的文件夹层级来组织 S3 中的数据(例如年/月/日或区域/服务)。当 Athena 或 Glue 读取分区数据时,只会扫描相关分区,而不是整个数据集,从而大幅降低成本和查询时间。好的分区键应当是经常出现在 WHERE 子句中的字段。

# Hive-style partition naming for year/month/day
# s3://my-data-lake-123/curated/sales/
#   year=2024/month=01/day=15/part-00000.parquet
#   year=2024/month=01/day=16/part-00000.parquet
#   year=2024/month=02/day=01/part-00000.parquet

# Athena recognises this naming automatically

列式格式:Parquet 和 ORC

将数据存储为 Apache Parquet 或 ORC(优化的行列式)等列式格式,可以大幅提升分析查询性能并降低 S3 数据扫描成本。列式格式允许查询引擎只读取所需的列,高效压缩重复值,并支持谓词下推。请始终在 curated 分区中将原始 CSV 或 JSON 转换为 Parquet。

# Converting CSV to Parquet with AWS Glue (simplified PySpark)
import sys
from awsglue.context import GlueContext
from pyspark.context import SparkContext

sc = SparkContext()
glueContext = GlueContext(sc)

datasource = glueContext.create_dynamic_frame.from_catalog(
    database='my_db', table_name='raw_sales')

glueContext.write_dynamic_frame.from_options(
    frame=datasource,
    connection_type='s3',
    connection_options={'path': 's3://my-data-lake-123/curated/sales/'},
    format='parquet')

用于成本管理的 S3 生命周期策略

Landing 分区中的数据会持续增长,但较早的原始文件很少会再次访问。使用 S3 Lifecycle Policies,随着时间推移自动将原始数据转换到更低价的存储类。例如,30 天后将 landing/ 中的对象移至 S3 Glacier Instant Retrieval,90 天后再移至 Glacier Deep Archive。仅此一项就能将历史数据的存储成本降低 70%–90%。

aws s3api put-bucket-lifecycle-configuration \
  --bucket my-data-lake-123 \
  --lifecycle-configuration '{
    "Rules": [{
      "ID": "ArchiveLanding",
      "Filter": {"Prefix": "landing/"},
      "Status": "Enabled",
      "Transitions": [
        {"Days": 30, "StorageClass": "GLACIER_IR"},
        {"Days": 90, "StorageClass": "DEEP_ARCHIVE"}
      ]
    }]
  }'

使用 Lake Formation 实现精细访问控制

AWS Lake Formation构建于 S3 和 Glue Data Catalogue 之上,无需编写复杂的存储桶策略,即可提供表级、列级和行级访问控制。Lake Formation 与 Athena、Redshift Spectrum 和 EMR 集成。当多个团队查询同一个数据湖,并且需要对 PII 或财务数据等敏感列拥有不同的可见范围时,这是首选方案。

# Grant Lake Formation table access via CLI
aws lakeformation grant-permissions \
  --principal DataLakePrincipalIdentifier=arn:aws:iam::123456789012:role/AnalystRole \
  --permissions SELECT \
  --resource '{
    "Table": {
      "DatabaseName": "my_db",
      "Name": "curated_sales"
    }
  }'

用于触发数据摄取的 S3 事件通知

当新文件进入 S3 Landing 分区时,您需要自动触发处理流程。使用 S3 Event Notifications,在对象创建时将事件发布到 SQS、SNS 或 Lambda。随后,Lambda 函数或 Glue 工作流会获取新文件,对其进行验证,并使其沿着数据处理流程流转。这样就能创建完全自动化、事件驱动的数据湖摄取流程。

# S3 event notification to trigger Lambda on new object
aws s3api put-bucket-notification-configuration \
  --bucket my-data-lake-123 \
  --notification-configuration '{
    "LambdaFunctionConfigurations": [{
      "LambdaFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:ProcessNewFile",
      "Events": ["s3:ObjectCreated:*"],
      "Filter": {
        "Key": {"FilterRules": [{"Name": "prefix", "Value": "landing/"}]}
      }
    }]
  }'

数据湖中的加密与合规

生产环境中的数据湖必须在所有环节强制执行加密。对于敏感数据,请使用 AWS KMS Customer Managed Keys (CMK) 执行 SSE-KMS,并要求为每个使用者明确授予密钥权限。对于依法必须禁止删除或覆盖的监管数据,请以 Compliance 模式启用 S3 Object Lock。使用 Macie 自动发现数据湖中存储的 PII 并发出警报。

# Enforce KMS encryption on all PUT operations via bucket policy
{
  "Effect": "Deny",
  "Principal": "*",
  "Action": "s3:PutObject",
  "Resource": "arn:aws:s3:::my-data-lake-123/curated/*",
  "Condition": {
    "StringNotEquals": {
      "s3:x-amz-server-side-encryption": "aws:kms"
    }
  }
}

跨账户数据湖访问

在大型组织中,数据湖 S3 存储桶位于中央的数据平台账户,而使用数据的团队则在独立的 AWS 账户中运行。您可以结合使用存储桶策略(列出使用方账户的主体)和使用方账户中的IAM 角色来授予访问权限,这些角色可通过扮演角色获得跨账户权限。Resource Access Manager (RAM) 是基于 Lake Formation 进行共享的另一种选择。

# Bucket policy in central account allows consumer account to read curated/
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::999988887777:root"
  },
  "Action": ["s3:GetObject", "s3:ListBucket"],
  "Resource": [
    "arn:aws:s3:::my-data-lake-123",
    "arn:aws:s3:::my-data-lake-123/curated/*"
  ]
}

快速检查

测试您对本课 AWS Solutions Architect (SAA-C03) 相关概念的理解。

课程回顾

本课您学到了:数据湖使用带有 Landing、Processing 和 Curated 分区的 S3;分区和 Parquet 格式可以降低 Athena 查询成本;以及 Lake Formation 提供精细的列级和行级访问控制。接下来,我们将学习 AWS Glue 的无服务器 ETL 和 Glue Data Catalogue。

常见问题解答

「在 S3 上构建数据湖」课时是免费的吗?

是的 — 「在 S3 上构建数据湖」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AWS Solutions Architect 课程的其余内容,请升级到 CoddyKit PRO。 AWS Solutions Architect 课程共包含 4 节课。

「在 S3 上构建数据湖」这节课中我会学到什么?

设计基于 S3 的数据湖,划分落地区、处理区和精选区,应用存储桶策略,并按分区组织数据以提高查询效率 你通过在浏览器中直接运行的动手代码来练习 AWS Solutions Architect,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 AWS Solutions Architect 需要有经验吗?

无需任何先前经验。CoddyKit 上的 AWS Solutions Architect 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「在 S3 上构建数据湖」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 AWS Solutions Architect 课中编写并运行代码吗?

能。每节 AWS Solutions Architect 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 在 S3 上构建数据湖
  2. AWS Glue:ETL 与数据目录
  3. Amazon Athena:S3 上的无服务器 SQL
  4. Kinesis Streams、Firehose 与实时分析
← 返回 AWS Solutions Architect