Upgrade to Pro — share decks privately, control downloads, hide ads and more …

データファイルをAWSのDWHサービスに格納する / 20251115jawsug-tochigi

データファイルをAWSのDWHサービスに格納する / 20251115jawsug-tochigi

2025/11/15 (土) JAWS-UG栃木 オフライン #5 で発表した資料。

イベントページ:
https://jawsug-tochigi.connpass.com/event/370897/

Avatar for kasacchiful

kasacchiful

November 15, 2025
Tweet

More Decks by kasacchiful

Other Decks in Programming

Transcript

  1. 笠原 宏 (@kasacchiful) クラスメソッド株式会社 データ事業本部 ビジネスソリューション部 ソリューションアーキテク ト 新潟県新潟市在住 JAWS-UG新潟

    / Python機械学習勉強会 in 新潟 / JaSST Niigata / ASTER / SWANII / Cloudflare Meetup Niigata / AI CRAFT Hacks Niigata / KomeKaigi AWS Community Builder (Serverless) 2025 Japan AWS Top Engineer / 2025 Japan All AWS Certifications Engineer 自己紹介 2
  2. 今回は以下の内容を想定 データファイル: CSV なんだかんだ、いろんなシステムが出力するデータファイル AWSの各種サービスでよく対応しているデータファイル 区切り文字: , / クォート文字: "

    の標準的な書式を想定 DWHサービス: DynamoDBからエクスポートしたデータファイルを、以下2つにインポートする想定 Redshift S3 Tables RDSやAurora周りは、みなさんよく使っているだろうし、DBMSに依存する部分も多いの で、今回は省略。 おさらいの部分もあるかと思いますが、今改めてデータ連携方法をまとめてみました。 データファイルをAWSのDWHサービスに格納する 5
  3. KomeKaigi等で利用した、ランチ情報をWeb で掲載したアプリ 元は「PHPカンファレンス新潟2025」前夜 祭のLTのネタ向けに、Amazon Q Developer for CLI使って作成したもの そのため、PHPで書かれたバックエンドコ ードをLambdaコンテナ

    (Lambda Web Adapter利用)で動かしてる バックエンドのデータベースにDynamoDBを 使っていたので、このデータを検証に利用 元データ: 新潟グルメマップ (自作) 7
  4. aws dynamodb scan --table-name niigata_gourmet_spots | \ jq -r '.Items[]

    | [.id.S, .address.S, .business_hour.S, .image_url.S, .latitude.N, .longitude.N, .name.S, .website_url.S] | @csv' \ > spots.csv ちょっと工夫して、タグも文字列連結して出力 aws dynamodb scan --table-name niigata_gourmet_spots | \ jq -r '.Items[] | [.id.S, .address.S, .business_hour.S, .image_url.S, .latitude.N, .longitude.N, .name.S, ([.tags.L[].S] | join(",")), .website_url.S] | @csv' \ > spots.csv ヘッダ行が必要な場合は、ヘッダ用の配列を追加しておく。 aws dynamodb scan --table-name niigata_gourmet_spots | \ jq -r '["id","address","business_hour","image_url","latitude","longitude","name","tags","website_url"], (.Items[] | [.id.S, .address.S, .business_hour.S, .image_url.S, .latitude.N, .longitude.N, .name.S, ([.tags.L[].S] | join(",")), .website_url.S]) | @csv' \ > spots.csv jqで応用は効くが、面倒ではある AWS CLIでCSV出力 13
  5. Rust製のCLIツール Import / Export可能 # import dy import --table spots

    --format csv --input-file spots-input.csv # export dy export --table spots --format csv --output-file spots-output.csv awslabs/dynein の利用 https://github.com/awslabs/dynein 14
  6. データソースにDynamoDBを設定して、UNLOADクエリでS3バケットにCSV出力 (gzip圧縮済) UNLOAD ( select id, address, business_hours, image_url, CAST(latitude

    AS VARCHAR) AS latitude, CAST(longitude AS VARCHAR) AS longitude, name, ARRAY_JOIN(tags, ',') AS tags, website_url from niigata_gourmet_spots ) TO 's3://test-datastore-kas/spots/' WITH (format = 'CSV') 出力対象のパスが空でないと出力できない Athena Federated Query の利用 https://dev.classmethod.jp/articles/connecting-from-amazon-athena-to-dynamodb/ 15
  7. DynamoDB → Redshiftへのデータ連携 最小レイテンシ15分毎に増分更新 DynamoDBのパフォーマンスや可用性にほと んど影響を与えず、Read Capacity Unitも消 費しない Redshiftが持つ高性能SQL、機械学習、Spark

    統合、マテリアライズドビュー等の機能を活用 できる Zero-ETLの追加費用なし 連携分のストレージとデータ転送量のみ DynamoDBからなら Zero-ETL統合がオススメ https://dev.classmethod.jp/articles/amazon-dynamodb-amazon-redshift-zero-etl/ 17
  8. Redshift側の考慮事項の例: ターゲットとなるRedshiftは、次の前提条件を満たす必要がある Redshift Serverless または RA3ノードタイプ 暗号化されている (プロビジョニングされたクラスターの場合) 大文字と小文字の区別が有効になっている DynamoDB

    Zero-ETL統合の場合の考慮事項の例 127文字を超えるテーブル名・パーティションキー列名・ソートキー列名はサポートされない DynamoDBからのZero-ETL統合は、1つのRedshiftデータベースのみマッピングできる DynamoDB項目内の個々の属性(名前と値で構成)が64KBを超えることはできない Zero-ETL統合が使えない場合は、データインポートの手段を検討 https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/zero-etl.reqs-lims.html 18
  9. DWHの場合は、COPY文で一気に反映する方が効率が良い COPY spots FROM 's3://test-datastore-kas/niigata_gourmet_spots/niigata_gourmet_spots.csv' IAM_ROLE 'arn:aws:iam::<AWS_ACCOUNT_ID>:role/<ROLE_NAME>' REGION 'ap-northeast-1' FORMAT

    AS CSV DELIMITER ',' IGNOREHEADER 1 Athena UNLOAD時のファイルをインポートする場合は、 GZIP も指定。ヘッダなしのため IGNOREHEADER は不要。 COPY spots FROM 's3://test-datastore-kas/spots/' IAM_ROLE 'arn:aws:iam::<AWS_ACCOUNT_ID>:role/<ROLE_NAME>' REGION 'ap-northeast-1' FORMAT AS CSV GZIP DELIMITER ',' 基本はCOPY 19
  10. DynamoDBテーブルから取得された項目の属性名と既存のRedshiftテーブル列名を照合してデータ ロードを行う COPY spots FROM 'dynamodb://niigata_gourmet_spots' IAM_ROLE 'arn:aws:iam::<AWS_ACCOUNT_ID>:role/<ROLE_NAME>' READRATIO 50;

    データ型がスカラーSTRINGとNUMBERのみサポート 実はDynamoDBから直接COPYできる https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/t_Loading-data-from-dynamodb.html 20
  11. -- Glue Databaseを外部スキーマとして登録 CREATE EXTERNAL SCHEMA glue_datastore_schema FROM DATA CATALOG

    DATABASE 'test-datastore-db' IAM_ROLE 'arn:aws:iam::<AWS_ACCOUNT_ID>:role/<ROLE_NAME>' CREATE EXTERNAL DATABASE IF NOT EXISTS; -- 外部スキーマを経由して外部テーブル (Glueテーブル) の作成 CREATE EXTERNAL TABLE glue_datastore_schema.niigata_gourmet_spots ( ... ) --- 内部のテーブルに格納したい場合は、INSERT INTO SELECTで INSERT INTO spots ( SELECT id, address, business_hours, image_url, CAST(latitude AS FLOAT8) AS latitude, CAST(longitude AS FLOAT8) AS longitude, name, tags, website_url FROM glue_datastore_schema.niigata_gourmet_spots ) 外部テーブルを使う方法 (Redshift Spectrum) 21
  12. 日時: 2025/12/27 (土) 14:00開始 (予定) 会場: <TBD> (調整中) JR新潟駅周辺での開催予定 オンライン参加可能

    (Zoom) 特別ゲスト: <TBD> (調整中) re:Inventでほぼ間違いなくアップデートがあるであろうAI周りのことや、サーバーレス周りの ことを中心にお話しいただく予定です。 他、参加者LTが中心の会なので、みなさま奮ってご参加 & 発表をお待ちしております! 会場内で情報交換会 (お酒あり) も予定してます 今年も主催(笠原)から「ふるまい寿司」 を提供する予定です JAWS-UG 新潟支部 AWS re:Invent re:Cap & 2025年ふりかえり 35