Closed7

Amazon RDS or AuroraにあるデータをBigQueryで分析する方法

ツルオカツルオカ

要件

  • Amazon RDS or AuroraにあるデータをBigQueryで分析したい
  • データベース内にある情報のうち分析に必要ないデータ(メールアドレスなど個人情報)は持ち出しせずAWS内にとどめたい

案1. RDSの標準エクスポート機能を使ってS3の米国リージョンにエクスポートしBigQuery Omniで参照

案2. AWS DMSで一部データをマスキング後にS3へエクスポートしBigQueryへ定時Transfer

  • RDSの標準エクスポート機能ではデータ加工ができないのでDMSを間に挟み実現する方法
  • マスキングだけではなく列ごと削除するなど柔軟な加工が可能
    • S3にエクスポートする際に不要なデータを削っているので安心(リージョンも東京で良い)
  • BigQueryへデータ移行しないといけないので、BigQueryストレージ側へデータが蓄積されれる(ストレージコストもかかる)

主な流れ

  1. RDSからDMSで個人情報などをマスクしてS3にエクスポート
  2. Google Cloud側でBigQuery Transferを設定しS3 ReadonlyのIAMを指定してバッチ取得

DMSを使う理由

RDS→S3へ直接スナップショットExportが最も楽だが、データ分析に不要な個人情報などは転送したくないため一部加工(間引く)目的で利用する。DMSは任意の列をマスキングすることが可能。
https://aws.amazon.com/jp/dms/

全カラム転送してよい場合は普通にスナップショットをエクスポートすれば良い:
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_ExportSnapshot.html

ツルオカツルオカ

DMS(Database Migration Service)とは

名前の通りデータベースのマイグレーションツール

  • 簡単に、データベースのデータをAWSへ移行するマネージドサービス
  • 同種類のデータベースエンジンに加え、異なる種類間のデータ移行にも対応
  • 移行元はRDBMSだけでなく、NoSQLデータベースも利用可能

DMSのマスキングについて

https://dev.classmethod.jp/articles/dms-data-masking/
https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Masking.htm

例)C6BGJ566669Kという値をマスキングする場合

種類 変換例
Digits Mask(例: 数値を#に変換) C#BGJ######K
Digits Randomize(例: 数値をランダムに変換) C1BGJ842170K
Hashing Mask(値全体をハッシュ化) 7CB06784764C9030CCC41E25C15339FEB293FFE9B329A72B5FED564E99900C75

逆に言うとマスキング対象は数字(numeric value)か全体ハッシュ化の2パターンしかないのでそれで要件が満たせるか確認するべき。ハッシュは「ソルトなしSHA256」で推測できなくはないので、漏洩リスクが致命傷なデータあるいはそもそも分析で一切使わないのであれば削除したほうが良い。

例1)SHA256の推測(一般用語"hello"で正しい)

例2)SHA256の推測("foo@gmail.com"が正しい)

特定列の削除

上記マスキングでも十分かもしれないが列ごと削除してしまうこともできる。
https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.html

ツルオカツルオカ

AWS DMS におけるレプリケーション

AWS DMS では、「データベースレプリケーション」の仕組みを使ってデータを移行します。
DMSのレプリケーションプロセスは、フルロード + 変更データキャプチャ(CDC) の2つの方式がありま.す。

レプリケーション方式 説明
フルロード 一括で全データをコピー(初回のみ)
CDC(変更データキャプチャ) 変更されたデータのみをリアルタイムで同期

ツルオカツルオカ

dms-vpc-roleの作成

すでに作成済みでも以下のエラーが出る場合は、一度削除し再作成するとうまく行った。

Trust Relationship

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AWSDMSVPCPolicyTemplate",
      "Effect": "Allow",
      "Principal": {
        "Service": "dms.amazonaws.com"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "072651350417"
        }
      }
    }
  ]
}

Permission Policy

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "CreateNetworkInterface",
      "Effect": "Allow",
      "Action": [
        "ec2:CreateNetworkInterface",
        "ec2:DeleteNetworkInterface",
        "ec2:ModifyNetworkInterfaceAttribute"
      ],
      "Resource": [
        "arn:aws:ec2:*:072651350417:network-interface/*",
        "arn:aws:ec2:*:072651350417:instance/*",
        "arn:aws:ec2:*:072651350417:subnet/*",
        "arn:aws:ec2:*:072651350417:security-group/*"
      ]
    },
    {
      "Sid": "DescribeVPC",
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeAvailabilityZones",
        "ec2:DescribeInternetGateways",
        "ec2:DescribeSubnets",
        "ec2:DescribeVpcs",
        "ec2:DescribeSecurityGroups",
        "ec2:DescribeDhcpOptions",
        "ec2:DescribeNetworkInterfaces"
      ],
      "Resource": "*"
    }
  ]
}
ツルオカツルオカ

dms-cloudwatch-logs-roleの作成

Trust Relationship

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AWSDMSCloudWatchPolicyTemplate",
      "Effect": "Allow",
      "Principal": {
        "Service": "dms.amazonaws.com"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "072651350417"
        }
      }
    }
  ]
}

Permission Policy

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowDescribeOnAllLogGroups",
      "Effect": "Allow",
      "Action": [
        "logs:DescribeLogGroups"
      ],
      "Resource": [
        "arn:aws:logs:*:072651350417:log-group:*"
      ]
    },
    {
      "Sid": "AllowDescribeOfAllLogStreamsOnDmsTasksLogGroup",
      "Effect": "Allow",
      "Action": [
        "logs:DescribeLogStreams"
      ],
      "Resource": [
        "arn:aws:logs:*:072651350417:log-group:dms-tasks-*",
        "arn:aws:logs:*:072651350417:log-group:dms-serverless-replication-*"
      ]
    },
    {
      "Sid": "AllowCreationOfDmsLogGroups",
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup"
      ],
      "Resource": [
        "arn:aws:logs:*:072651350417:log-group:dms-tasks-*",
        "arn:aws:logs:*:072651350417:log-group:dms-serverless-replication-*:log-stream:"
      ]
    },
    {
      "Sid": "AllowCreationOfDmsLogStream",
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogStream"
      ],
      "Resource": [
        "arn:aws:logs:*:072651350417:log-group:dms-tasks-*:log-stream:dms-task-*",
        "arn:aws:logs:*:072651350417:log-group:dms-serverless-replication-*:log-stream:dms-serverless-*"
      ]
    },
    {
      "Sid": "AllowUploadOfLogEventsToDmsLogStream",
      "Effect": "Allow",
      "Action": [
        "logs:PutLogEvents"
      ],
      "Resource": [
        "arn:aws:logs:*:072651350417:log-group:dms-tasks-*:log-stream:dms-task-*",
        "arn:aws:logs:*:072651350417:log-group:dms-serverless-replication-*:log-stream:dms-serverless-*"
      ]
    }
  ]
}
ツルオカツルオカ

費用

シングルAZのt2.microであれば無料枠で結構使える

AWS DMS では、AWS 無料利用枠の一部として、Single-AZ dms.t2.micro インスタンスを月あたり最大 750 時間利用できます。機能によって、使用量に応じたコストがかかります。AWS DMS Fleet Advisor と AWS DMS SC については、使用したストレージの分のみお支払いいただきます。AWS DMS 移行オプションでは、レプリケーションインスタンスを使用するかサーバーレスオプションを使用するかにかかわらず、使用した容量に対して時間単位でお支払いいただきます。

https://aws.amazon.com/jp/dms/pricing/

このスクラップは2025/02/14にクローズされました