Amazon Web Services ブログ
データカタログと ETL ジョブの AWS Glue トリガーを使用してサーバーレスデータレイクを構築および自動化する
今日、データは、IoT センサー、アプリケーションログ、クリックストリームなどのリソースの非構造化データ、トランザクションアプリケーション、リレーショナルデータベース、スプレッドシートの構造化データなど、あらゆる場所から流れています。データはすべてのビジネスにとって非常に重要な部分になりました。そのため、データから迅速にデータを抽出するために、信頼できる唯一の情報源を維持し、データの取り込みから変換、分析まで、パイプライン全体を自動化する必要があります。
データ量、速度、種類が増えるにつれて、データ分析の複雑さに対する懸念が高まっています。この懸念は、データをビジネスユーザーが使用できる状態にするために必要な手順の数と複雑さから生じています。多くの場合、データエンジニアリングチームは、パイプラインの構築と、その抽出、変換、ロード (ETL) の最適化に時間を費やしています。プロセス全体を自動化することで、価値実現までの時間と運用コストを削減できます。この記事では、完全に自動化されたデータカタログと ETL パイプラインを作成してデータを変換する方法について説明します。
アーキテクチャ
この記事では、以下のアーキテクチャを構築して自動化する方法を学びます。
プライマリデータストアとして Amazon Simple Storage Service (Amazon S3) を使用して、サーバーレスデータレイクを構築します。Amazon S3 のスケーラビリティと高可用性を考えると、データの信頼できる唯一の情報源として最適です。
Amazon S3 にデータを取り込み、保存するためにさまざまな手法を使用できます。たとえば、ストリーミングデータを取り込むために Amazon Kinesis Data Firehose を使用できます。既存のデータベースからリレーショナルデータを取得するために AWS Database Migration Service (AWS DMS) を使用できます。また、AWS DataSync を使用して、オンプレミスのネットワークファイルシステム (NFS) からファイルを取り込むこともできます。
取り込まれたデータは Amazon S3 バケットに入り、これを raw ゾーンと呼びます。そのデータを利用できるようにするには、そのスキーマを AWS Glue のデータカタログに登録する必要があります。これを行うには、Amazon S3 トリガーによって呼び出される AWS Lambda 関数を使用して、データをカタログ化する AWS Glue クローラを起動します。クローラによるテーブル定義の作成が完了したら、Amazon CloudWatch Events ルールを使用して 2 番目の Lambda 関数を呼び出します。このステップで AWS Glue ETL ジョブが開始され、処理済みゾーンと呼ばれる別の Amazon S3 バケットにデータを処理して出力します。
AWS Glue ETL ジョブはデータを Apache Parquet 形式に変換し、処理済みの S3 バケットに保存します。ETL ジョブを変更して、より細かいパーティション化、圧縮、データの充実など、他の目的を達成することができます。監視と通知は自動化プロセスの不可欠な部分です。ETL ジョブが完了するとすぐに、別の CloudWatch ルールが Amazon Simple Notification Service (Amazon SNS) トピックを使用して E メール通知を送信します。この通知は、データが正常に処理されたことを示します。
要約すると、このパイプラインはデータを分類および変換し、完了時に E メール通知を送信します。
AWS CloudFormation を使用して、自動化されたデータパイプラインをデプロイする
まず、AWS CloudFormation テンプレートを使用して、必要なすべてのリソースを作成します。これにより手動エラーの可能性がなくなり、効率が上がり、時間の経過とともに一貫した設定が保証されます。
次の [スタックの起動] ボタンを使用して AWS CloudFormation テンプレートを起動します。
必ず 米国東部 (バージニア北部) リージョン (us-east-1) を選択してください。次に、適切なスタック名、E メールアドレス、および AWS Glue クローラ名を入力してデータカタログを作成します。メタデータテーブルを保存するために AWS Glue データベース名を追加します。次のスクリーンショットに示すように IAM リソースの作成を確認し、[作成] を選択します。
注 : ETL ジョブが完了したときに通知を受け取れるようにするため、有効な E メールアドレスを入力することが重要です。
この AWS CloudFormation テンプレートは、AWS アカウントに次のリソースを作成します。
- 生データと処理済みの Parquet データの両方を格納するための 2 つの Amazon S3 バケット。
- 2 つの AWS Lambda 関数 : 1 つは AWS Glue Data Catalog を作成するためのもので、もう 1 つは Amazon SNS にトピックを公開するための関数です。
- 再試行ロジックを維持するための Amazon Simple Queue Service (Amazon SQS) キュー。
- データが正常に処理されたことを知らせる Amazon SNS トピック。
- 2 つの CloudWatch Event のルール : 1 つは AWS Glue クローラに関するもので、もう 1 つは AWS Glue ETL ジョブに関するものです。
- AWS Glue、Amazon SNS、Amazon SQS、および Amazon S3 にアクセスするための AWS Identity and Access Management (IAM) ロール。
AWS CloudFormation スタックの準備が整ったら、E メールを確認して SNS サブスクリプションを確認します。[リソース] タブを選択して詳細を見つけます。
ETL ジョブが完了したらすぐに E メールアラートを受信できるように、次の手順に従って E メールサブスクリプションを確認してください。
- Amazon SNS コンソールのナビゲーションペインで、[トピック] を選択します。SNSProcessedEvent という名前の SNS トピックが画面に表示されます。
- [ARN] を選択します。トピックの詳細ページが表示され、E メールサブスクリプションが確認の保留中としてリストされます。エンドポイント列に記載されているように、必ずあなたの E メールアドレスのサブスクリプションがあることを確認してください。
E メールアドレスが表示されない場合、またはリンクが E メールで無効と表示されている場合は、対応するサブスクリプションエンドポイントを選択してください。その後、[確認のリクエスト] を選択してサブスクリプションを確認してください。リクエストの確認リンクについては、必ず E メールのジャンクフォルダを確認してください。
Amazon S3 バケットイベントトリガーを設定する
このセクションでは、生の S3 バケットにトリガーを設定します。そのため、新しいデータがバケットに入ったときに、AWS CloudFormation のデプロイで作成された GlueTriggerLambda をトリガーします。
通知を設定するには、以下の手順に従ってください。
- [Amazon S3 コンソール] を開きます。
- ソースバケットを選択してください。この場合、バケット名には raws3bucket、たとえば <stackname>-raws3bucket-1k331rduk5aph が含まれます。
- [プロパティ] タブを開き、[詳細設定] で [イベント] を選択します。
- [通知を追加] を選択し、次の設定で通知を設定します。
- 名前 – 選択した名前を入力します。この例では、crawlerlambdaTrigger です。
- イベント – ファイルをアップロードするときに AWS Glue データカタログを作成するには、[すべてのオブジェクト作成イベント] チェックボックスをオンにします。
- 送信先– Lambda 関数を選択します。
- Lambda – デプロイセクションで作成した Lambda 関数を選択します。Lambda 関数は文字列 GlueTriggerLambda を含んでいるはずです。
すべての設定については、次のスクリーンショットを参照してください。終了したら、[保存] を選択します。
イベント設定の詳細については、Amazon S3 コンソールユーザーガイドの [S3 バケットのイベント通知を有効にして設定する方法] を参照してください。
データセットをダウンロードする
この記事では、公開されているニューヨークのグリーンタクシーデータセットを CSV 形式で使用します。毎月のデータを raw ゾーンにアップロードし、AWS Glue クローラを使用して自動データカタログの作成を実行します。カタログ化後、自動 AWS Glue ETL ジョブが毎月のグリーンタクシーデータの Parquet 形式への変換をトリガーし、それを処理済みゾーンに保存します。
生データセットは、NYC タクシーおよびリムジンコミッションの旅記録データサイトからダウンロードできます。毎月のグリーンタクシーデータセットをダウンロードして、1 か月分のデータだけをアップロードします。たとえば、最初に 2018 年 1 月のグリーンタクシーデータのみを生の S3 バケットにアップロードします。
AWS Glue クローラを使用してデータカタログを自動化する
最新のデータレイクの重要な側面の 1 つは、利用可能なデータを簡単に見つけられるようにカタログ化することです。データレイクに対して ETL ジョブまたはアドホッククエリを実行するには、最初に、場所、形式、サイズなどの他のメタデータ情報とともにデータのスキーマを決定する必要があります。AWS Glue クローラを使用すると、このプロセスが簡単になります。
データを raw ゾーンにアップロードした後、記事の前半で作成した Amazon S3 トリガーが GlueTriggerLambdafunction を呼び出します。この関数は、クロールされたデータから推測されたメタデータ情報を格納する AWS Glue Data Catalog を作成します。
AWS Glue コンソールを開きます。AWS CloudFormation テンプレートを使用して作成されたデータベース、テーブル、およびクローラが表示されるはずです。AWS Glue クローラは次のように表示されます。
左側のナビゲーションを使用してテーブルを参照すると、先ほど作成したデータベース内のテーブルが表示されます。
次のように、テーブル名を選択し、クローラによって検出されたメタデータをさらに調べます。
列、データ型、その他の詳細も表示できます。 次のスクリーンショットで、Glue Crawler は列名とそれぞれのデータ型を決定することによって、Amazon S3 で利用可能なファイルからスキーマを作成しました。このスキーマを使用して外部テーブルを作成できます。
AWS Glue で ETL ジョブを作成する
AWS Glue は、インフラストラクチャを維持することなく、従量制料金モデルで ETL ジョブを実行するためのマネージド Apache Spark 環境を提供します。
AWS Glue コンソールを開き、[ETL] セクションの下の [ジョブ] を選択して AWS Glue ETL ジョブの作成を開始します。ジョブに好きな名前を付けてください。そして後で必要になるのでその名前を書き留めておいてください。次のように、名前が <stackname>– GlueLabRole を含む、既に作成した IAM ロールを選択します。他のデフォルトオプションをそのまま使用します。
AWS Glue は必要な Python または Scala コードを生成します。これはデータ変換のニーズに応じてカスタマイズできます。[拡張プロパティ] セクションで、[ジョブブックマーク] リストで [有効化] を選択して、古いデータの再処理を回避します。
次のページで、生の Amazon S3 バケットをデータソースとして選択し、[次へ] を選択します。[データターゲット] ページで、データターゲットパスとして処理済みの Amazon S3 バケットを選択し、フォーマットとして [Parquet] を選択します。
次のページでは、必要に応じて、列名の変更、関心のない列の削除、データ型の変更など、スキーマを変更できます。AWS Glue はそれに応じて ETL コードを生成します。
最後に、ジョブのパラメータを確認し、次のように [ジョブの保存とスクリプトの編集] を選択します。
次のページでは、データ変換の要件に従ってスクリプトをさらに変更できます。この記事の手順では、スクリプトをそのままにしておくことができます。次のセクションでは、この ETL ジョブの実行を自動化します。
ETL ジョブの実行を自動化する
データの取り込み頻度が増えるにつれて、ETL ジョブを自動化してデータを変換することをお勧めします。このプロセスを自動化することで、運用上のオーバーヘッドを削減し、データエンジニアリングチームがより重要なタスクに集中できるようになります。
AWS Glue は、データをバッチで処理するように最適化されていて、設定した時間間隔でデータをバッチで処理するように設定できます。どのくらいの頻度でジョブを実行するかは、エンドユーザーがどれほど最新のデータを期待するかと処理コストによって決まります。さまざまな方法について詳しくは、AWS Glue 開発者ガイドの「AWS Glue でのジョブのトリガー」を参照してください。
まず、Lambda 関数と CloudWatch Events ルールで ETL ジョブ名を一度だけ変更して設定する必要があります。コンソールで、AWS CloudFormation スタックを使用して作成した ETLJobLambda Lambda 関数を開きます。
表示された Lambda 関数のリンクを選択して、コードを調べます。JobName 値を前のステップで作成した ETL ジョブ名に変更してから、[保存] を選択します。
次のスクリーンショットに示すように、AWS Lambda 関数に関連付けられている AWS CloudWatch Events ルール CrawlerEventRule が表示されます。CloudWatch Events ルールが成功ステータスを受け取ると、ETLJobLambda Lambda 関数がトリガーされます。
これで、生の S3 バケットにファイルをアップロードするとすぐに、AWS Glue ETL ジョブをトリガーするように設定されました。データパイプラインをテストする前に、監視と警告を設定します。
Amazon CloudWatch Events による監視と通知
AWS Glue ETL ジョブが完了したときに E メールで通知を受け取りたいとします。これを実現するために、CloudWatch Events ルール OpsEventRule がデータパイプラインのデプロイセクションの AWS CloudFormation テンプレートからデプロイされました。この CloudWatch Events ルールは AWS Glue ETL ジョブのステータスを監視し、ジョブが正常に完了すると SNS トピックを使用して E メール通知を送信します。
次の図に示すように、CloudWatch のイベントパターンセクションで AWS Glue ジョブ名を設定します。AWS Glue ジョブの状態が SUCCEEDED に変わると、イベントはターゲットとして設定された SNS トピックをトリガーします。この SNS トピックでは、デプロイセクションで指定した E メールアドレスに E メール通知が送信され、通知を受け取ります。
AWS Glue ETL ジョブのステータスを取得するために、CloudWatch Event ルール OpsEventRule で設定を 1 回だけ変更しましょう。
- CloudWatch コンソールを開きます。
- ナビゲーションウィンドウの [イベント] の下で、[ルール] を選択します。以下に示すように、OpsEventRule を含むルール名を選択します。
- 右上隅で、[アクション]、[編集] を選択します。
- Your-ETL-jobName を前の手順で作成した ETL ジョブ名に置き換えます。
- 下にスクロールして、[詳細設定] を選択します。次に、[ルールの更新] を選択します。
適切な通知と警告を使用してデータパイプライン全体を自動的に設定したので、次にパイプラインをテストします。新しい Amazon S3 バケットに毎月新しいデータをアップロードすると (たとえば、2018 年 2 月のニューヨークのグリーンタクシーデータをアップロードすると)、GlueTriggerLambda AWS Lambda 関数がトリガーされます。AWS Glue コンソールに移動して、AWS Glue クローラが実行されていることを確認できます。
クローラが完了すると、CloudWatch Events ルール CrawlerEventRule が ETLJobLambda Lambda 関数をトリガーします。これで AWS Glue ETL ジョブが実行されていることがわかります。
ETL ジョブが成功すると、以下に示すように、CloudWatch Events ルール OpsEventRule から Amazon SNS トピックを使用して E メール通知が送信され、自動化サイクルが完了します。
処理済みの Amazon S3 バケットを必ず確認してください。ここで、自動化された ETL パイプラインによって処理された変換済みデータが見つかります。処理されたデータが Amazon S3 で準備ができたので、この Amazon S3 の場所で AWS Glue クローラを実行する必要があります。クローラは、AWS Glue Data Catalog の関連スキーマを使用してメタデータテーブルを作成します。
データカタログテーブルが作成されたら、Amazon Athena を使用して標準の SQL クエリを実行し、Amazon QuickSight を使用してデータを可視化できます。詳細については、ブログ記事「AWS Glue、Amazon Athena、および Amazon QuickSight を使用してさまざまなプロバイダーからのデータを調整、クエリ、および可視化する」を参照してください。
結論
自動化されたサーバーレスデータレイクアーキテクチャを使用することで、発見、監査、監視、データ品質など、送信元から送信先までのデータ管理の負担が軽減されます。組織間の自動化されたデータパイプラインを使用すると、関連するデータセットを識別し、以前よりもはるかに早く価値を抽出できます。分析時間を短縮することの利点は、データがリアルタイムで利用可能になったときに企業がデータを分析できることです。BI ツールから、クエリは複数のデータベースよりも単一のデータセットの方がはるかに速く結果を返します。
ビジネスアナリストは仕事をより早く完了できるようになり、データエンジニアリングチームは繰り返しの作業から解放されます。データを Amazon Redshift のようなデータウェアハウスにロードするか、Amazon SageMaker を介して機械学習で利用できるようにすることで、データをさらに拡張できます。
その他のリソース
詳細については、以下のリソースを参照してください。
- AWS IoT とサーバーレスデータレイクを使用したフロントライン脳震盪モニタリングシステムの構築方法
- AWS Step Functions と AWS Lambda を使って複数の ETL ジョブの統合を行う
著者について
Saurabh Shrivastava は、世界各国のシステムインテグレーターと連携するパートナーソリューションアーキテクトおよびビッグデータスペシャリストです。Saurabh は AWS のパートナーおよびお客様と連携して、ハイブリッド環境と AWS 環境でスケーラブルアーキテクチャを構築するためのアーキテクチャ面でのガイダンスを提供しています。彼は家族とアウトドアで過ごしたり、新しい場所に旅して未知の文化を発見したりすることを楽しんでいます。
Luis Lopez Soria は、世界各国のシステムインテグレーターと連携するパートナーソリューションアーキテクトおよびサーバーレススペシャリストです。彼は AWS のパートナーやお客様と協力して、クラウドオペレーティングモデルの大規模な採用を支援しています。彼は世界中を旅して新しい食べ物や文化を探ることに加えてスポーツを楽しんでいます。
Chirag Oswal は、世界各国のシステムインテグレーターと連携するパートナーソリューションアーキテクトおよび AR/VR スペシャリストです。彼は AWS のパートナーやお客様と協力して、クラウドオペレーティングモデルの大規模な採用を支援しています。彼の趣味はビデオゲームと旅行です。