チュートリアル「Amazon RDS for Oracle Database の Amazon Redshift への移行」を失敗してみた

8 min読了の目安(約7400字TECH技術記事

背景

表題の通りですが、AWSには豊富なチュートリアルが用意されており、何かしらのAWSリソースに関するチュートリアルが用意されています。
⇒ブログを書きながら、チュートリアルを進めていましたが、途中どうしても解決できない部分がありそこでチュートリアルが止まってしまったのでタイトルを変更して失敗談としてまとめました。
以下の文面はチュートリアルが最後までできたと想定して書いた部分が多分に含まれていますので、気にせず読み進めてください。

Amazon Redshiftは知識でしか知らず、一回自分の手で動かしてみようと思いAWSで提供しているチュートリアルを使って、DB移行のハンズオンを体験しました。

https://aws.amazon.com/jp/getting-started/hands-on/migrate-oracle-to-amazon-redshift/
ただし、こちらのチュートリアルの最終更新がドキュメント履歴を確認しますと、2017年8月30日と古く、当然チュートリアルに書いてあることをそのまま実行しても動かない部分が何箇所かありましたので、今回はそういった、チュートリアル通りしただけでは失敗する部分にフォーカスを当てたチュートリアル体験記を記していきたいと思います。

Amazon Redshiftについて

チュートリアルの前にAmazon Redshift(以下Redshift)について簡単に説明いたします。
Redshiftは大容量のデータを格納し、データ分析を行うのに最適なデータウェアハウス(DWH)と呼ばれるマネージドサービスです。
データベースはデータを取得し、保存するのには向いていますが大量のデータを分析するには不向きとなるケースがあります。データウェアハウスはビッグデータの分析やレポートといったユースケースに最適です。Redshiftは高速で完全マネージド型、ペタバイト規模のデータウェアハウスであり、多くの企業で利用されています。

https://aws.amazon.com/jp/redshift/?whats-new-cards.sort-by=item.additionalFields.postDateTime&whats-new-cards.sort-order=desc

チュートリアル内容

チュートリアルではRDS上で稼働しているOracleデータウェアハウスからRedshiftへ移行するためのハンズオンとなっております。AWSの説明によりますと、Redshiftはコストが下がり、クエリパフォーマンスを向上さえることから多くの企業で移行されているそうです。

https://aws.amazon.com/jp/getting-started/hands-on/migrate-oracle-to-amazon-redshift/faq/
チュートリアルが問題なく終われば2時間で終わり数百円程度で済むハンズオンですが、前述の通りそのままでは上手くいかない部分も多くあり、2時間では全然足りなかったので、注意するべきをまとめて文字に起こすようにしました。
ここからはチュートリアルの内容に沿ってデータ移行のハンズオンを体験してみたいと思います。
https://docs.aws.amazon.com/ja_jp/dms/latest/sbs/CHAP_RDSOracle2Redshift.html

Step1 CloudFormationテンプレートを使用してVPCでRDSインスタンスを起動する

まずは各種AWSリソースをプロビジョニングします。Step1のページからRDS OracleとRedshiftの構築を行うCloudFormationのテンプレートをダウンロードします。
ダウンロードしましたら、説明に従ってCloudFormationへテンプレートをアップロードして、パラメータを埋めていけばCloudFormationの設定が完了してRDSインスタンスが作成される予定でした。ところが作成途中でRDSの作成に失敗して、CloudFormationがロールバックされました。

内容を確認しますと、DBインスタンスタイプがdb.m3.mediumでこれは古いインスタンスタイプで現在は使われておりません。

Oracle_Redshift_For_DMSDemo.template
    "OracleRDSInstanceType": {
      "ap-northeast-1": {
        "inst": "db.m3.medium"
      }, 
      "ap-northeast-2": {
        "inst": "db.t2.medium"
      },

なので、ダウンロードしたテンプレート部分のインスタンスタイプを現行のタイプに変更します。(t2系も念のためt3系に変更しておきます。

Oracle_Redshift_For_DMSDemo.template
    "OracleRDSInstanceType": {
      "ap-northeast-1": {
        "inst": "db.m5.large"
      }, 
      }, 
      "ap-northeast-2": {
        "inst": "db.t3.medium"
      }, 

無事にCloudFormationのプロビジョニングが完了しましたので、出力ページからOracleJDBCConnectionStringRedshiftJDBCConnectionStringを控えておきます。

Step2 SQLツールとAWS Schema Conversion Toolをローカルコンピュータにインストールする

次にローカルマシン上からDBベースに接続するためにSQLクライアントツールをインストールします。チュートリアル内ではSQL Workbench/Jクライアントを使っていますので、Step内のリンクからSQL Workbench/Jクライアントのダウンロードページへ移動し、インストールします。
インストールしましたら、OracleとRedshiftのJDBCドライバーもダウンロードします。ダウンロードしたOracleとRedshiftのJDBCドライバーをSQL Workbench/Jクライアントに関連付けます。
完了しましたら次にAWS SCTをインストールします。AWS SCTは、ソースデータベーススキーマ、およびビュー、ストアドプロシージャ、関数といったデータベスコードオブジェクトの大部分を自動的にターゲットデータベース互換フォーマットへと変換することにより、異種データベース間の移行を計画的なものにします。引用↓

https://aws.amazon.com/jp/dms/schema-conversion-tool/
インストールが完了しましたら、Step内の説明に沿って初期設定を行います。

Step3 Oracle DB インスタンスへの接続をテストしてサンプルスキーマを作成する

次にOracleDBインスタンスに移行元となるデータを流し込みます。クライアントマシンからSQL接続するためにSQL Workbench/Jを起動し、接続画面からOracleDBのJDBCドライバとOracleJDBCConnectionStringで控えたURL、Step内に記載されている他パラメータをセットして、テスト接続を行います。テスト接続が完了しましたら、移行元データを流し込む作業へ入ります。
元データはCloudFormationのテンプレートが入っていたzipファイルの中にあるOraclesalesstarschema.sqlを使います。これをSQL Workbench/Jに張り付けてSQLを実行します。
流し込み終えましたら、Step内の確認SQLコマンドを実行して数を確かめます。チャネル別の販売数の数だけ例と比べるとぴったりと半分になっていますが、ここでは無視して先に進めます。

ステップ4 Amazon Redshiftデータベースへの接続をテストする

続いて、Redshiftの接続テストを行います。こちらも同じようにSQL Workbench/Jから接続画面を開き、RedshiftのJDBCドライバとRedshiftJDBCConnectionStringで控えたURL、Step内に記載されている他パラメータをセットし、テスト接続をします。すると接続失敗のポップアップがでました。
もう一度CloudFormationのテンプレート文を調べてみましたが、Step内で記載されているUsernameの値がデフォルトで設定したテンプレート部分と異なっていました。

Oracle_Redshift_For_DMSDemo.template
    "RedshiftDBUsername": {
      "AllowedPattern": "[a-zA-Z][a-zA-Z0-9]*", 
      "ConstraintDescription": "must begin with a letter and must be 1 - 128 alphanumeric characters", 
      "Default": "masteruser", 
      "Description": "Enter master user name for Redshift", 
      "MaxLength": "128", 
      "MinLength": "1", 
      "NoEcho": "false", 
      "Type": "String"
    }

なのでUsername箇所をmasteruserに変更してもう一度テスト接続をすることで、Redshiftに接続することに成功しました。これで試しにSQLコマンドを実行してクエリが発行されるか確かめたかったのですが、こんな結果が返ってきました。
テスト接続は問題なかったのですが、なぜかNo connectionとなっており、接続ができませんでした。原因がわからなかったので、回避策としてRedshiftのコンソールからクエリエディタを使ってSQLコマンドを実行しようとしましたが、dc1.largeではサポートされていなかったので、dc2.largeにサイズ変更してクエリエディタからSQLコマンドを実行しました。

ステップ5 AWS SCTを使用してOracleスキーマをAmazon Redshiftに変換する

OracleのデータをRedshiftに移行する前にスキーマの変換を行う必要があります。先ほどインストールしたAWS SCTを起動します。後はStep内に記載された手順に従って、OracleとRedshiftの接続設定を行っていきます。

Redshiftの接続失敗

チュートリアル内で使われているAWS SCTはバージョンが古いからなのかチュートリアル内のパラメータだけを設定してもOKボタンがアクティブ化されませんでした。
AWS GlueのタブをクリックしますとGlueの設定が有効になっているとGlueの設定も必須になるようです。
今回のチュートリアルでGlueを使う予定はないので、NoteにあるようにProject SettingからAmazon Glueの使用を無効化しようとしました。ところが、何回Project Settingを開いてもAWS SCTがフリーズしてしまうのです。
私が使っているPCは8GBのメモリを搭載したPCなのですが、これを会社で使っている16GBのメモリを積んでいるPCに変更して起動してもフリーズは解決しませんでした。

試した事

色々と調査をしてみましたが、SCTに標準で割り当てられたJVMのメモリ量は少ないみたいです。

https://aws.amazon.com/jp/blogs/database/configuring-the-aws-schema-conversion-tool/
上記のブログを参考にして、JVMのメモリサイズの変更を行いました。
[Application]
app.name=AWS Schema Conversion Tool
app.version=1.0.645
app.runtime=$ROOTDIR\runtime
app.identifier=com.amazon.sct
app.classpath=$ROOTDIR\app\AWSSchemaConversionTool.jar;$ROOTDIR\app\AWSSchemaConversionToolBatch.jar
app.mainjar=$ROOTDIR\app\AWSSchemaConversionTool.jar
app.mainclass=com.amazon.sct.App

[JavaOptions]
-Xss128M
-Dfile.encoding=UTF-8
-XX:+UseParallelGC
--add-opens=java.base/jdk.internal.loader=ALL-UNNAMED
--add-exports=java.base/jdk.internal.loader=ALL-UNNAMED
--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED

[JVMUserOptions] #追加項目
–Xmx4096m        #追加項目
–Xms2048m        #追加項目

[ArgOptions]

これで当初の想定では、JVMのメモリサイズは最大4GBまで割り当てられると思ったのですが、サイズ量に変更がありませんでした。

所感

残念ながらこれ以上私の方で何をすればよいのか分からず、チュートリアルは完全に止まってしまいました。
なるべく多くの人に見てもらおうと海外の有名なQ&Aサイトである、Stack Overflowにこの問題を解決する方法はないか質問してみました。(当然ながら英語なので質問作成するのに苦労しました)

https://stackoverflow.com/questions/65449294/i-would-like-migrate-oralce-db-to-amazon-redshift-with-aws-sct
チュートリアルもドキュメント履歴が古いと今のバージョンとは差異が出てきてチュートリアル通りの結果がいかない場合があります。何とか自分の手で解決したかったのですが、お手上げになってしましました。
Stack Overflowだけでなく、このブログからでもアドバイスできることがありましたら
コメント欄にてアドバイスお待ちしております。