DEA / ドメイン1 データの取り込みと変換
データ API (公開と利用)
データ は、データをプログラムから取得・登録するための入り口です。データエンジニアは、外部の API からデータを取り込む (利用する) 側にも、整えたデータを他のシステムへ渡すために API を作る (公開する) 側にも立ちます。また、 や を接続ドライバーなしで操作する Data API も、パイプラインの自動化でよく使います。
Point
- API = Application Programming Interface は、プログラム同士がやり取りする約束ごとです。
- ページング (pagination) は、大きな結果を複数のページに分けて少しずつ受け取る方式です。
- 非同期 (asynchronous) の API は、依頼を受け付けた時点で応答を返し、結果は後で取りに行く方式です。
- 和訳
- Pagination: ページ付け
- Weblio英和辞書「pagination」
概要
| 立場 | 内容 | 主なサービス |
|---|---|---|
| を利用する (取り込み) | 外部の API を呼んでデータを集める | 、、、 Scheduler |
| AWS のデータ API を使う | 接続を持たずに を投げる | Data API、 の API |
| API を公開する | データを他のシステムから使えるようにする | + Lambda / / Athena |
主要技術
①外部の API からの取り込み ⚠️ 頻出
| 課題 | 対処 |
|---|---|
| 認証 | キーや OAuth のトークンを に保管し、実行時に取り出す。コードや環境変数に平文で書かない |
| ページング | 応答に含まれる次のページのトークン (または URL) をたどり、最後まで取得する |
| レート制限 | 429 が返ったら待つべき時間に従い、で再試行する。呼び出しの速さを制御する |
| 増分の取得 | 更新日時の条件などで、前回からの変更だけを取る。前回の位置を や Parameter Store に記録する |
| 定期実行 | Scheduler で を起動。長くかかるなら でページごとに分けて処理 |
| 送信元 の許可を求められる | 内の Lambda から ゲートウェイの で出る |
対応する なら、コードを書かずに で取り込めます。自分でコードを書く場合も、生の応答 () をまず に保存しておくと、後で変換を作り直せます。
②Redshift Data API ⚠️ 頻出
Data は、/ODBC のドライバーや接続の管理なしに、 の API で Redshift へ を実行する仕組みです。
| 特徴 | 内容 |
|---|---|
| 非同期 | ExecuteStatement で SQL を投げると ID が返る。DescribeStatement で状態を確かめ、GetStatementResult で結果を取る |
| 認証 | のシークレット、または ()。パスワードを API の呼び出しに含めない |
| 上限 | クエリの最大時間は 24 時間、結果は 24 時間保持、結果の最大サイズは 500 MB (圧縮後) |
| 複数の SQL | BatchExecuteStatement で順に実行し、既定 (ExecutionMode が TRANSACTION) では1つのトランザクションにまとめ、1つでも失敗するとすべてロールバックする。AUTO_COMMIT にすると SQL ごとに確定する |
| 完了の通知 | ExecuteStatement で WithEvent を指定すると、SQL の実行が終わったときに へイベントを送れる |
| ClientToken を指定すると、再試行で同じ SQL が二重に実行されない | |
| セッション | 既定では呼び出しごとにセッションが閉じ、一時テーブルは次の呼び出しから見えない。SessionKeepAliveSeconds で残したセッションを SessionId で指定して再利用するか、BatchExecuteStatement で同じ実行にまとめる |
や から Redshift を操作するとき、ドライバーをパッケージに入れたり、 の接続を管理したりする必要がなくなります。Step Functions は Redshift Data API を直接呼べます。結果の取得には大きさの上限 (圧縮後 500 MB) があるため、大きな抽出は Data API で を実行し、Redshift から へ直接書き出します。
⚠️ 頻出: 「Lambda から Redshift へ SQL を実行したい。接続の管理やドライバーの同梱を避けたい。長いクエリで Lambda を待たせたくない」は Redshift Data API です。
③Athena の API
| 役割 | |
|---|---|
| StartQueryExecution | クエリを開始し、実行 ID を返す (非同期)。ワークグループと結果の出力先を指定 |
| GetQueryExecution | 状態 (QUEUED、RUNNING、SUCCEEDED、FAILED) を確かめる |
| GetQueryResults | 結果をページ単位で取得する (NextToken で続きを取る) |
結果は の出力先にも CSV で保存されます。大きな結果は API でページをたどるより、S3 のファイルを直接読む方が効率的です。 は の StartQueryExecution を .sync で呼び、完了まで待てます。
GetQueryResults は1回の呼び出しで最大 1,000 行までしか返さないため、数百万行の結果を API で取ると呼び出しが数千回になります。
④API Gateway でデータを公開する ⚠️ 頻出
| 機能 | 内容 |
|---|---|
| の種類 | API (使用量プラン、API キー、、リクエストの検証など機能が豊富)、 API (低コスト・低遅延で機能は絞られている。使用量プラン、API キー、キャッシュ、リクエストの検証はない) |
| 統合 | Lambda がデータストアを読んで結果を返す |
| AWS サービス統合 | Lambda を挟まずに、 から の PutRecord や の操作を直接呼ぶ (REST API) |
| 認証・認可 | 認証、 のユーザープール、Lambda オーソライザー |
| アカウントで既定毎秒 10,000 リクエスト (バースト 5,000)。ステージやメソッドごとにも設定 | |
| 使用量プランと API キー | 利用者ごとに上限 (毎秒のリクエスト数、1日や1か月の回数) を決める |
| キャッシュ | 同じ問い合わせへの応答を一定時間返し、裏側の負荷を減らす (REST API) |
API Gateway の統合にはタイムアウトがあるため、時間のかかる分析クエリをそのまま同期で返すのは向きません。クエリを受け付けて ID を返し、結果は後で取りに来てもらう非同期の設計にするか、事前に集計した結果を DynamoDB に置いて素早く返します。
⚠️ 頻出: 「外部から送られるデータを、サーバーを管理せずに受け付けて Kinesis へ入れたい」は、API Gateway の Kinesis へのサービス統合 (または Lambda 経由) です。
⑤公開したデータ API の管理
| 管理の観点 | 方法 |
|---|---|
| バージョン | ステージ (dev、prod) とパスのバージョン (/v1/) で互換性を保つ |
| 監視 | の (Count、4XXError、5XXError、Latency)、アクセスログ |
| 保護 | で不正なリクエストを防ぐ (概要は D4 の章) |
| 大きな結果 | ページングを実装し、1回の応答を小さく保つ。大きなファイルは の署名付き URL で渡す |
| デプロイ | (、) で と関数をまとめて管理 |
試験対策
①判断マトリクス
| 問題文のキーワード | 選ぶ方法 |
|---|---|
| 外部 の認証情報を安全に保管 | |
| 外部 API の結果が複数ページ | 次のページのトークンをたどる |
| 外部 API の 429 エラー | 、呼び出しの速さの制御 |
| 対応 からノーコードで取り込み | |
| から へ 、接続管理なし | Redshift Data API |
| SQL の完了で次の処理 | Redshift Data API の 通知、 の .sync |
| のデータを API から SQL で問い合わせ | の StartQueryExecution / GetQueryResults |
| データを他のシステムへ で公開 | + Lambda |
| Lambda なしで API から / へ | API Gateway の AWS サービス統合 |
| 利用者ごとにリクエスト数の上限 | 使用量プランと API キー |
| 同じ問い合わせが多く裏側の負荷が高い | API Gateway の |
| 時間のかかる分析を API で提供 | 非同期 (ID を返して後で結果を取る)、事前集計 |
②よくある誤答
- キーやトークンをコードや環境変数に平文で書くこと。
- から へ で接続し、長いクエリの完了を Lambda で待ち続けること。Data API で非同期にします。
- 数 GB の結果を API の1回の応答で返そうとすること。ページングか の署名付き URL を使います。
- 外部 API のページングを無視して最初のページだけを取り込むこと。