S3でデータレイクを構築する
ランディング、処理、キュレーションのゾーンを備えたS3ベースのデータレイクを設計し、バケットポリシーを適用して、クエリ効率を高めるためにパーティション単位でデータを整理します。
「S3でデータレイクを構築する」はCoddyKit上の無料AWS Solutions Architectレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAWS Solutions Architect学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AWS Solutions Architectコースには全4レッスンが含まれています。
データレイクとは
データレイクとは、あらゆる規模の構造化データ、半構造化データ、非構造化データを保存する集中型リポジトリです。データウェアハウスとは異なり、データレイクでは分析に必要になるまで、データを未加工のネイティブ形式で保存します。Amazon S3 は、耐久性、スケーラビリティ、分析サービスとの統合性に優れているため、AWS のデータレイクで最も一般的な基盤です。
データレイクゾーンのアーキテクチャ
適切に設計された S3 データレイクでは、3 つの論理ゾーンを使用します。Landing Zone(未加工の取り込みデータをそのまま保存)、Processing Zone(クレンジングおよび変換済み)、Curated Zone(分析に対応し、ビジネスで利用可能)です。通常、各ゾーンには別々の S3 プレフィックスまたはバケットを使用します。このパターンは、メダリオンアーキテクチャ(bronze、silver、gold)と呼ばれることもあります。
# Example zone structure inside one S3 bucket
# s3://my-data-lake/
# landing/ <- raw ingest from source systems
# processing/ <- cleansed, validated data
# curated/ <- aggregated, analytics-readyS3 バケット構造の作成
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/*"
}
]
}クエリ効率を高めるデータのパーティショニング
パーティショニングでは、クエリの述語(例:year/month/day や region/service)に対応するフォルダ階層で 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(Optimised Row Columnar)のような列指向フォーマットでデータを保存すると、分析クエリのパフォーマンスが大幅に向上し、S3 のデータスキャンコストも低下します。列指向フォーマットでは、クエリエンジンが必要な列だけを読み取り、繰り返し値を効率的に圧縮し、述語プッシュダウンを利用できます。raw ゾーンの CSV や JSON は、必ず curated ゾーンで 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 Zone のデータは継続的に増加しますが、古い未加工ファイルが再びアクセスされることはほとんどありません。S3 Lifecycle Policies を使用して、時間の経過に応じて未加工データをより安価なストレージクラスへ自動的に移行します。たとえば、landing/ 内のオブジェクトを 30 日後に 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 Zone に新しいファイルが到着したら、処理を自動的に開始する必要があります。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/"}]}
}
}]
}'データレイクにおける暗号化とコンプライアンス
本番環境のデータレイクでは、あらゆる場所で暗号化を適用する必要があります。機密データの SSE-KMS には AWS KMS Customer Managed Keys (CMK) を使用し、各利用者に対して明示的なキー許可を要求します。削除や上書きが禁止されている規制対象データには、S3 Object Lock を Compliance モードで有効にします。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 は列レベルおよび行レベルのきめ細かなアクセス制御を提供することを学びました。次は、サーバーレス ETL と Glue Data Catalogue のための AWS Glue について学びます。
よくある質問
「S3でデータレイクを構築する」レッスンは無料ですか?
はい。「S3でデータレイクを構築する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AWS Solutions Architectコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AWS Solutions Architectコースには全4レッスンが含まれています。
「S3でデータレイクを構築する」で何を学びますか?
ランディング、処理、キュレーションのゾーンを備えたS3ベースのデータレイクを設計し、バケットポリシーを適用して、クエリ効率を高めるためにパーティション単位でデータを整理します。 ブラウザで直接実行するハンズオンコードでAWS Solutions Architectを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AWS Solutions Architectを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAWS Solutions Architectは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「S3でデータレイクを構築する」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAWS Solutions Architectレッスンでコードを書いて実行できますか?
はい。すべてのAWS Solutions Architectレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。