2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Lambda関数によるRedshiftからHubDBへのデータインサート時のタイムアウトの解決策

2
Last updated at Posted at 2026-01-21

1. はじめに

Redshiftで集計したデータをHubDBに反映する処理をLambdaで実装しました。
最初はシンプルに「HubDBのAPIを1行ずつ叩いて更新すればよい」と考えていました。

しかし実装を進める中で、**Lambdaの最大実行時間が15分(900秒)**という制約が大きな問題となりました。

本記事では、

  • HubDBへ1行ずつAPI更新する方法
  • CSVファイルを作成して一括インポートする方法

この2つを実際に実装した経験をもとに、
それぞれのメリット・デメリットと使い分けについて紹介します。

2. システム構成概要

  • EventBridge をトリガーに Lambda を起動
  • Lambda から Redshift に接続し、集計データを取得
  • 集計データのテーブルが2つ、①20行のデータ②900行のデータ
  • 取得したデータを HubDB に反映

定期バッチとして動作する想定です。

3. 前提:HubDBのデータ更新方法

HubDBのデータ更新には主に以下の2つの方法があります。

  1. Rows API を使った1行ずつの更新
  2. CSV Import API を使った一括更新
方法 更新単位 特徴
Rows API 1行 実装がシンプル、細かい制御が可能
CSV Import API 複数行 実装が複雑、大量データ向き、処理が高速

4. シンプルな処理で、HubDBを1行ずつ更新する実装

4.1 実装イメージ

  • RedshiftからデータをSELECT
  • forループで1行ずつ処理
  • HubDB Rows API を呼び出して更新

4.2 この方法を選んだ理由

  • 実装が直感的で分かりやすい
  • ログを追いやすくデバッグしやすい
  • 行単位でエラー処理ができる

実装が比較的簡単で、コードも動くので、この方法で処理を実施した。

実施後、、、

計2つの集計テーブル①②の処理がスタート

①20行のテーブル:済
②900行のテーブル:タイムアウトエラーのため停止

5. 発生した問題:Lambdaの15分制限

5.1 Lambdaの制約

  • Lambdaの最大実行時間:15分(900秒)
  • HubDB APIの呼び出し:1回あたり約1秒(私の環境では)

5.2 実測ベースでの限界

内容 数値
1行更新にかかる時間 約1秒
Lambda最大実行時間 900秒
更新可能な最大行数 約900行

データ件数が増えると、Lambdaがタイムアウトすることが分かりました。

6. CSVを作成して一括インポートする実装

6.1 方針転換の背景

1行ずつAPIを叩く方法では、

  • API呼び出し回数が増える
  • Lambdaの制限に引っかかる

という問題がありました。

そこで、API呼び出し回数を減らす方法として、
CSVを作成して一括でインポートする方式を採用しました。

6.2 実装の流れ

  1. Lambda関数にて、Redshiftからデータを取得
  2. 取得したデータをHubDBのテーブル定義に合わせて変換
  3. Lambdaの /tmp ディレクトリにCSVファイルを作成
  4. HubDB CSV Import APIを呼び出し、CSVファイルをHubDBへ一括インポート

7. Lambdaの /tmp を使ったCSV作成について

  • /tmp はLambda実行中のみ使える一時領域
  • 最大512MBまで利用可能
  • CSV作成 → インポート → 不要になったら削除

S3を使わずに、最小限の構成で完結できる点がメリットです。

8. 処理時間の比較結果

実行結果の具体例

実運用を想定し、2つの集計テーブルを同一のLambda関数内で順に処理する構成で実行しました。

・集計テーブル①:20行程度の小規模データ
 → 1行ずつのAPI更新方式で問題なく処理が完了

・集計テーブル②:約900行のデータ
 → CSVファイルのインポート方式で問題なく処理が完了

集計テーブル①②あわせて処理時間が1分程度で無事終了

この結果から、

・少量データでは1行ずつAPI更新でも問題ない

・一定以上のデータ量になると、Lambdaの実行時間制限がボトルネックになる

ことが明確になりました。

一部、CSV一括インポート方式に切り替えたことで、
両方の集計テーブルを安定して最後まで処理できるようになりました。

9. 更新方式によるメリット・デメリット整理

ここで、1つの疑問が出てきました。

両方とも、CSVファイルの一括インポートの方が、シンプルな構造で楽なんじゃないか?

それぞれの方式を理解し、判断実装が大切だと感じたので、整理したいと思います。

9.1 1行ずつAPI更新

メリット

  • 実装がシンプル
  • 行単位でエラー処理、更新が可能

デメリット

  • Lambdaの実行時間制限に弱い
  • データ件数が増えるとスケールしない

9.2 CSVインポート方式

メリット

  • 大量データでも安定して処理できる
  • 実行時間が短い

デメリット

  • 実装がやや複雑
  • CSVフォーマットの管理が必要
  • 行単位の更新が不可能

10. 実運用での使い分け

  • 少量データ・検証用途:1行ずつAPI更新
  • 本番バッチ・大量データ:CSVインポート

両方を実装した上で、データ量によって、使い分ける構成が必須と感じました。

また、

テーブルの一部の更新をしない、一括のインポートができればいい。

という場合であれば、行数が少なくとも、CSVファイル経由のインポートも運用可能です。

11. まとめ

  • LambdaでHubDBへインサート時、タイムアウトの問題が発生する
  • HubDBはデータ量に応じて更新方法を選ぶ必要がある
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?