

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS Glue を使用して Amazon S3 から Amazon Redshift にデータを段階的にロードする ETL サービスパイプラインを構築
<a name="build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue"></a>

*Rohan Jamadagni、Arunabha Datta (Amazon Web Services)*

## 概要
<a name="build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue-summary"></a>

このパターンは、Amazon Simple Storage Service (Amazon S3) を設定してデータレイクのパフォーマンスを最適化し、AWS Glue を使用して差分データ変更を Amazon S3 から Amazon Redshift に読み込み、抽出、変換、ロード (ETL) オペレーションを実行する方法に関するガイダンスを提供します。 

Amazon S3 のソースファイルには、カンマ区切り値 (CSV)、XML、JSON ファイルなど、さまざまな形式を使用できます。このパターンは、AWS Glue を使用してソースファイルを Apache Parquet のようなコストとパフォーマンスが最適化された形式に変換する方法を示しています。Amazon Athena と Amazon Redshift Spectrum からパーケットファイルを直接クエリできます。Parquet ファイルを Amazon Redshift にロードしたり、集約したり、集約されたデータをコンシューマーと共有したり、Amazon Quick Sight を使用してデータを視覚化したりすることもできます。

## 前提条件と制限
<a name="build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue-prereqs"></a>

**前提条件**
+ アクティブな AWS アカウント。
+ 適切な権限を持ち、CSV、XML、または JSON ファイルを含む S3 ソースバケット。

前提
+ CSV、XML、または JSON ソースファイルはすでに Amazon S3 に読み込まれており、AWS Glue と Amazon Redshift が設定されているアカウントからアクセスできます。
+ 「[Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/t_Loading-data-from-S3.html)」のドキュメントで説明されているように、ファイルのロード、ファイルの分割、圧縮、マニフェストの使用に関するベストプラクティスに従います。
+ ソースファイル構造は変更されません。
+ ソースシステムは、Amazon S3 で定義されたフォルダ構造に従って Amazon S3 にデータを取り込むことができます。
+ Amazon Redshift クラスターは 1 つのアベイラビリティーゾーンにまたがっています。(AWS Lambda、AWS Glue、Amazon Athena はサーバーレスであるため、このアーキテクチャは適切です)。高可用性を実現するため、クラスターのスナップショットは定期的に作成されます。

**制限事項**
+ ファイル形式は、「[現在 AWS Glue でサポートされている形式に限定されています](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-format.html)」。
+ リアルタイムのダウンストリームレポートはサポートされていません。

## アーキテクチャ
<a name="build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue-architecture"></a>

**ソーステクノロジースタック**
+ CSV、XML、または JSON ファイルを含む S3 バケット

**ターゲットテクノロジースタック**
+ S3 データレイク (パーティション分割された Parquet ファイルストレージを使用)
+ Amazon Redshift

**ターゲットアーキテクチャ**

![AWS Glue を使用して Amazon S3 から Amazon Redshift に増分変更をロードするためのアーキテクチャ。](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/105b58ec-56c1-464a-8e69-f625360caa14/images/626aa365-e6e6-4874-a873-1c71adbe5306.png)


 

データフロー

![AWS Glue を使用して Amazon S3 から Amazon Redshift に増分変更をロードするためのデータフロー。](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/105b58ec-56c1-464a-8e69-f625360caa14/images/29569e48-9f2d-4f48-bc59-1f33949d01ca.png)


## ツール
<a name="build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue-tools"></a>
+ 「[Amazon S3](https://aws.amazon.com/s3/)」 – Amazon Simple Storage Service (Amazon S3) では、拡張性の高いオブジェクトストレージサービスです。Amazon S3 は、ウェブサイト、モバイルアプリケーション、バックアップ、データレイクなど、幅広いストレージソリューションに使用できます。
+ 「[AWS Lambda](https://aws.amazon.com/lambda/)」 – AWS Lambda を使用して、サーバーをプロビジョニングまたは管理しなくてもコードを実行できます。AWS Lambda はイベント駆動型サービスです。他の AWS サービスから自動的に開始するようにコードを設定できます。
+ 「[Amazon Redshift](https://aws.amazon.com/redshift/)」 – Amazon Redshift はフルマネージド型で、ペタバイト規模のデータウェアハウスサービスです。Amazon Redshift では、標準 SQL を使用して、データウェアハウスとデータレイク全体でペタバイトの構造化データおよび半構造化データをクエリできます。
+ 「[AWS Glue](https://aws.amazon.com/glue/)」 — AWS Glue は、分析のためにデータを簡単に準備してロードできるフルマネージドのETLサービスです。AWS Glue がデータを検出し、関連するメタデータ (テーブル定義やスキーマなど) を AWS Glue データカタログに保存します。カタログ化されたデータは、すぐに検索およびクエリが可能になり、ETL で使用できるようになります。
+ 「[AWS Secrets Manager](https://aws.amazon.com/secrets-manager/)」 — AWS Secrets Manager は、アプリケーションやサービスへのアクセスに必要なシークレットの保護と一元管理を容易にします。このサービスでは、データベース認証情報、API キー、その他のシークレットが保存され、機密情報をプレーンテキスト形式でハードコーディングする必要がなくなります。Secrets Manager は、セキュリティとコンプライアンスのニーズを満たすためのキーローテーションも提供しています。Amazon Redshift、Amazon Relational Database Service (Amazon RDS)、および Amazon DocumentDB の統合が組み込まれています。Secrets Manager コンソール、コマンドラインインターフェイス (CLI)、または Secrets Manager API と SDK を使用して、シークレットを保存して一元管理できます。
+ 「[Amazon Athena](https://aws.amazon.com/athena/)」 – Amazon Athena は、Amazon S3 に保存されたデータを簡単に分析できるインタラクティブなクエリサービスです。Athena はサーバーレスで AWS Glue と統合されているため、AWS Glue を使用してカタログ化されたデータを直接クエリできます。Athena は、インタラクティブなクエリパフォーマンスを実現するように伸縮自在にスケールされています。

## エピック
<a name="build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue-epics"></a>

### S3 バケットとフォルダ構造を作成します。
<a name="create-the-s3-buckets-and-folder-structure"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| ソースシステムのデータ構造と属性を分析する。 | Amazon S3 データレイクに寄与する各データソースに対してこのタスクを実行します。 | データエンジニア | 
| パーティションとアクセス戦略を定義します。 | この戦略は、データキャプチャの頻度、差分処理、消費ニーズに基づいて策定する必要があります。S3 バケットが一般に公開されていないこと、アクセスが特定のサービスロールベースのポリシーのみによって制御されていることを確認してください。詳細については、[Amazon S3 ドキュメント](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/using-folders.html)を参照してください。 | データエンジニア | 
| データソースタイプごとに個別の S3 バケットを作成し、処理された (Parquet) データ用にソースごとに個別の S3 バケットを作成します。 | ソースごとに個別のバケットを作成し、ソースシステムのデータインジェスト頻度に基づいたフォルダ構造を作成します (例:`s3://source-system-name/date/hour`)。処理された (Parquet 形式に変換された) ファイルについては、同様の構造 (例:`s3://source-processed-bucket/date/hour`) を作成します。S3 バケットの作成について詳しくは、「[Amazon S3 ドキュメント](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-bucket.html)」 を参照してください。 | データエンジニア | 

### Amazon Redshift でデータウェアハウスを作成
<a name="create-a-data-warehouse-in-amazon-redshift"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| 適切なパラメータグループとメンテナンスおよびバックアップ戦略を使用して Amazon Redshift クラスターを起動します。 | Amazon Redshift クラスターを作成するときに、Secrets Manager のデータベースシークレットを管理者ユーザーの認証情報に使用します。Amazon Redshift クラスターの作成とサイジングについては、「[Amazon Redshift ドキュメント](https://docs.aws.amazon.com/ses/latest/DeveloperGuide/event-publishing-redshift-cluster.html)」とクラウドデータウェアハウスの「[サイジング](https://d1.awsstatic.com/whitepapers/Size-Cloud-Data-Warehouse-on-AWS.pdf)」ホワイトペーパーを参照してください。 | データエンジニア | 
| IAM サービスロールを作成して Amazon Redshift クラスターにアタッチします。 | AWS Identity and Access Management (IAM) サービスロールは、Secrets Manager とソース S3 バケットへのアクセスを保証します。詳細については、「[承認](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html)」と「[ロールの追加](https://docs.aws.amazon.com/redshift/latest/dg/c-getting-started-using-spectrum-add-role.html)」に関するAWS ドキュメントを参照してください。 | データエンジニア | 
| データベーススキーマを作成します。 | テーブル設計の Amazon Redshift ベストプラクティス ユースケースに基づいて、適切なソートキーと分散キー、および可能な限り最適な圧縮エンコーディングを選択します。ベストプラクティスについては、「[AWS のドキュメンテーション](https://docs.aws.amazon.com/redshift/latest/dg/c_designing-tables-best-practices.html)」を参照ください。 | データエンジニア | 
| ワークロード管理の設定 | 要件に応じて、ワークロード管理 (WLM) キュー、ショートクエリアクセラレーション (SQA)、または同時実行スケーリングを設定します。詳細については、Amazon Redshift ドキュメントの「[ワークロード管理の実装](https://docs.aws.amazon.com/redshift/latest/dg/cm-c-implementing-workload-management.html)」を参照してください。 | データエンジニア | 

### Secrets Manager でのシークレットの作成
<a name="create-a-secret-in-secrets-manager"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Amazon Redshift サインイン認証情報をSecrets Manager に保存するための新しいシークレットを作成します。 | このシークレットには、管理者ユーザーだけでなく、個々のデータベースサービスユーザーの認証情報も保存されます。手順については、「[Secrets Manager のドキュメント](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html)」を参照してください。シークレットタイプとして **[Amazon Redshift クラスター]** を選択します。さらに、**シークレットローテーション**ページでローテーションを有効にします。これにより、Amazon Redshift クラスターに適切なユーザーが作成され、定義された間隔でキーシークレットがローテーションされます。 | データエンジニア | 
| Secrets Manager へのアクセスを制限する IAM ポリシーを作成します。 | Secrets Manager へのアクセスを Amazon Redshift 管理者と AWS Glue のみに制限します。 | データエンジニア | 

### AWS Glue の設定
<a name="configure-aws-glue"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| AWS Glue データカタログで、Amazon Redshift への接続を追加します。 | 手順については、「[AWS Glue のドキュメント](https://docs.aws.amazon.com/glue/latest/dg/console-connections.html)」を参照してください。 | データエンジニア | 
| Secrets Manager、Amazon Redshift、S3 バケットにアクセスするための AWS Glue の IAM サービスロールを作成してアタッチします。 | 詳細については、「[AWS Glue のドキュメント](https://docs.aws.amazon.com/glue/latest/dg/create-service-policy.html)」を参照してください。 | データエンジニア | 
| ソースの AWS Glue データカタログを定義します。 | このステップでは、AWS Glue データカタログにデータベースと必要なテーブルを作成します。クローラーを使用して AWS Glue データベースのテーブルをカタログ化することも、Amazon Athena 外部テーブルとして定義することもできます。AWS Glue データカタログから Athena で定義されている外部テーブルにアクセスすることもできます。Athena での「[データカタログの定義](https://docs.aws.amazon.com/glue/latest/dg/populate-data-catalog.html)」と「[外部テーブルの作成の詳細](https://docs.aws.amazon.com/athena/latest/ug/creating-tables.html)」については、AWS ドキュメントを参照してください。 | データエンジニア | 
| ソースデータを処理する AWS Glue ジョブを作成します。 | AWS Glue ジョブは Python シェルでも PySpark でもかまいません。これにより、ソースデータファイルを標準化、重複排除、およびクレンジングできます。パフォーマンスを最適化し、S3 ソースバケット全体をクエリする必要がないようにするには、AWS Glue ジョブのプッシュダウン述語として S3 バケットを日付別にパーティション化し、年、月、日、時間ごとに分割します。詳細については、「[AWS Glue のドキュメント](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-partitions.html)」を参照してください。処理され変換されたデータを、処理済みの S3 バケットパーティションに Parquet 形式でロードします。Athena からパーケットファイルをクエリできます。 | データエンジニア | 
| Amazon Redshift にデータをロードする AWS Glue ジョブを作成します。 | AWS Glue ジョブは Python シェルでも、データを更新して完全に更新することでデータをロードする PySpark でもかまいません。詳細については、[AWS Glue のドキュメント](https://docs.aws.amazon.com/glue/latest/dg/author-job.html)と「*追加情報*」セクションを参照してください。 | データエンジニア | 
| (オプション) 必要に応じてトリガーを使用して AWS Glue ジョブをスケジュールします。 | 増分データロードは主に、AWS Lambda 関数が AWS Glue ジョブを呼び出す Amazon S3 イベントによって駆動されます。イベントベースのスケジューリングではなく、時間ベースを必要とするデータロードには、AWS Glue のトリガーベースのスケジューリングを使用してください。 | データエンジニア | 

### Lambda 関数を作成する
<a name="create-a-lambda-function"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| S3 バケットと AWS Glue ジョブにアクセスするための AWS Lambda 用の IAM サービスにリンクされたロールを作成してアタッチします。 | Amazon S3 オブジェクトとバケットを読み取るポリシーと、AWS Glue API にアクセスして AWS Glue ジョブを開始するポリシーを含む AWS Lambda 用の IAM サービスにリンクされたロールを作成します。詳細については、「[ナレッジセンター](https://aws.amazon.com/premiumsupport/knowledge-center/lambda-execution-role-s3-bucket/)」 を参照してください。 | データエンジニア | 
| 定義された Amazon S3 イベントに基づいて AWS Glue ジョブを実行する Lambda 関数を作成します。 | Lambda 関数は Amazon S3 マニフェストファイルの作成によって開始する必要があります。Lambda 関数は Amazon S3 フォルダの場所 (例えば、ソース\_バケット/年/月/日付/時間) をパラメータとして AWS Glue ジョブに渡す必要があります。AWS Glue ジョブは、このパラメータをプッシュダウン述語として使用して、ファイルアクセスとジョブ処理パフォーマンスを最適化します。詳細については、「[AWS Glue のドキュメント](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-python-calling.html)」を参照してください。 | データエンジニア | 
| Amazon S3 PUT オブジェクトイベントを作成してオブジェクトの作成を検出し、それぞれの Lambda 関数を呼び出します。 | Amazon S3 PUT オブジェクトイベントは、マニフェストファイルの作成によってのみ開始する必要があります。マニフェストファイルは Lambda 関数と AWS Glue ジョブの同時実行を制御し、S3 ソースバケットの特定のパーティションに到着する個々のファイルを処理する代わりに、ロードをバッチとして処理します。詳細については、「[Lambda ドキュメント](https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html)」を参照してください。 | データエンジニア | 

## 関連リソース
<a name="build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue-resources"></a>
+ 「[Amazon S3 ドキュメント](https://docs.aws.amazon.com/AmazonS3/latest/gsg/GetStartedWithS3.html)」
+ 「[AWS Glue ドキュメンテーション](https://docs.aws.amazon.com/glue/latest/dg/what-is-glue.html)」
+ [Amazon Redshift ドキュメント](https://docs.aws.amazon.com/redshift/latest/gsg/getting-started.html)
+ [AWS Lambda](https://aws.amazon.com/lambda/)
+ [Amazon Athena](https://aws.amazon.com/athena/)
+ [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/)

## 追加情報
<a name="build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue-additional"></a>

アップサートと完全更新の詳細なアプローチ

**アップサート**: ビジネスユースケースによっては、履歴の集計が必要なデータセットを対象としています。ビジネスニーズに基づいて、「[新しいデータの更新と挿入](https://docs.aws.amazon.com/redshift/latest/dg/t_updating-inserting-using-staging-tables-.html)」(Amazon Redshift ドキュメント)で説明されているアプローチのいずれかに従ってください。

**完全更新**: これは、履歴集計を必要としない小規模なデータセットを対象としています。以下のいずれかの方法に従ってください。

1. Amazon Redshift テーブルを切り捨てます。

1. ステージングエリアから現在のパーティションをロードします。

または

1. 現在のパーティションデータを含む一時テーブルを作成します。

1. ターゲットのAmazon Redshift テーブルをドロップします。

1. テンポラリテーブルの名前をターゲットテーブルに変更します。