Q55 — AWS SAA-C03 第16章

第 55/100 問 | ← 第16章

Q1255. ある企業では、パートナーから提供されるデータをもとに、毎日および毎月のビジネス指標(メトリクス)を作成しています。パートナーは毎日、JSON形式のデータファイルを企業が所有するAmazon S3バケットに配信します。S3オブジェクトのキーには、Apache Hive形式の日付パーティション(例:year=2023/month=10/day=15)が使用されています。企業はAmazon EventBridgeルールを使用してAWS Lambda関数を起動し、その関数がS3バケット内のすべてのオブジェクトを読み込んで、日々および毎月のメトリクスを集計しています。また、企業では時折、過去の履歴データへのアクセスが必要となる分析を行います。データ量が増加するにつれ、Lambda関数が頻繁にタイムアウトするようになりました。ソリューションアーキテクトは、このLambda関数のタイムアウトを防止する必要があります。これらの要件を満たすうち、運用上のオーバーヘッドが最も少ない解決策はどれでしょうか?

正解: C. Lambda関数を変更し、Amazon Athenaを用いて日付フィルターを指定してS3オブジェクトをクエリするようにします。

解説

正解はCです。「Lambda関数を変更し、Amazon Athenaを用いて日付フィルターを指定してS3オブジェクトをクエリするようにします」。 解説: 問題の根本原因は、Lambda関数が毎回S3バケット内のすべてのオブジェクト(履歴データを含む)を読み込んでいるため、データ量の増加に伴い処理時間が長くなり、タイムアウトが発生している点にあります。この課題に対応するには、処理対象データ量を削減しつつ、引き続き日々および毎月のメトリクスを集計できる解決策が必要です。 なぜ選択肢Cが最適か: ・Amazon Athenaは、SQLを用いてS3上のデータを直接クエリ可能であり、Hive形式のパーティション(例:year=2023/month=10/day=15)を活用したパーティションプルーニングが可能です。 ・Lambda関数は、必要な期間のパーティションのみを対象にクエリできます(例:日々の集計ならWHERE date = CURRENT_DATE、毎月の集計ならWHERE date BETWEEN start_of_month AND end_of_month)。 ・全オブジェクトを読み込む必要がなく、Athenaは関連するパーティションのみをスキャンするため、処理時間は劇的に短縮されます。 ・運用オーバーヘッドが極めて小さい:データ構造やパイプラインの複雑な変更は不要で、単に日付フィルター付きのSQLクエリを追加するだけです。 他の選択肢が不適切な理由: A:EventBridgeとStep Functionsによる再試行設定は、根本原因(Lambdaが全データを読み込むこと)を解決しません。処理時間の短縮にはならず、むしろStep Functionsの導入という余分な複雑さとオーバーヘッドを追加します。 B:古いS3オブジェクトを削除すると、要件で明記されている「時折実施される履歴データを必要とする分析」ができなくなり、要件違反となります。また、データ保持ポリシーをLambda関数内で実装するのは非推奨かつ持続不可能です。 D:AWS GlueはETL処理向けのサービスであり、単純なクエリ用途には過剰です。また、パーティショニングを活用しないまま全データを処理する場合、依然としてパフォーマンス問題が解消されません(Athenaが既に効率的にパーティションプルーニングを実現しているのに対し、Glueは追加の設定・監視・管理コストを伴います)。 結論:選択肢Cは、以下の点で最も効率的かつ運用負荷が最小の解決策です。 ・Athenaのパーティションプルーニングにより、必要なデータのみをクエリ可能。 ・Lambdaのタイムアウトを、処理時間の短縮によって確実に防止。 ・履歴データを完全に保持し、将来的な分析要件にも対応。 ・変更は最小限(日付フィルター付きSQLクエリの追加)で済み、保守性も高い。 最終的な正解:C