目次
やったこと
CloudFormationでDMS Endpoint Target S3を実装しました
Oracle DBからDMS taskのfull loadのみを実行し、S3にparquetファイルで出力するフローを構築しました
今回はDMS Endpoint Target S3、DMS Task周りでつまづいたポイントをざっくりですが紹介します
実装例
CloudFormationでDMS Endpoint Target S3の実装例だけ置いておきます!
Resources:
TargetEndpoint:
Type: AWS::DMS::Endpoint
Properties:
EndpointIdentifier: endpoint-target-s3
EndpointType: target
EngineName: S3
SslMode: none
S3Settings:
BucketName: target-bucket
BucketFolder: fullloaded
DataFormat: parquet
CompressionType: gzip
ServiceAccessRoleArn: !GetAtt DMSTargetEndpointServiceRole.Arn
ネットで検索してもCloudFormationでTarget Endpointの設定例がそれほど出てこなかったので、誰かの役に立てれば幸いです(特にややこしいことはやってないですが、、)
DMSのEndpointにすることでハマったこと、調査したこと
CDCを行わない場合supplemental_loggingの設定は不要
データソースはOrarcleを設定していました
CDCを行う場合はサプリメンタルロギングの有効化が必須ですが、今回やった「Full loadのみ(CDCは行わない)」ケースではこの設定は不要でした
DMS taskの設定ReplicationTaskSettings
(CFnで実装したとき)S3Settingsのjsonの記述がおかしいとマネージメントコンソールからEndpointの詳細画面へ遷移するとエラーが表示される
具体的なエラーメッセージは忘れましたが「原因不明のエラーが発生しました」のようなメッセージが表示されました
最終的にjsonを修正するとエラーは解消され正常に詳細画面が表示されました
データ型 FIXED_LEN_BYTE_ARRAY
コマンドラインツールparquet-cliを使ってparquetの中身を除くと、小数を含めることができるデータ型FIXED[16]
で出力されていました
apatch-parquetのドキュメントを読んでみるとFIXED_LEN_BYTE_ARRAYを指しているようで、OracleのNUMBER型(presicion=null, scale=null)のデータ型はFIXED[n]
で出力される
「Oracle DBのどのデータ型がparquetのどのデータ型に変換されるか?」はAWSのドキュメントに大体記載されている
しかしApatch parquetのデータ型名称と違うので混乱した
正確に調べる場合は、AWSのドキュメントとApatch parquetの公式ドキュメントを合わせて読む必要がある
ReplicationTaskSettingsのTargetTablePrepMode
DO_NOTHING, DROP_AND_CREATEで保存時の挙動が違う
DROP_AND_CREATEの場合、S3でもちゃんとファイルを消してくれる
この場合 IAM policyに書き込み権限に加えS3の削除権限も必要になる
出力先pathの設定でpartitionを切るのは不可
通常の出力pathは下記のようになる
/SchemaName/TableName/xxxxx.parquet
下記のようにテーブル名の配下でpartitionを切りたかったけど、既存の設定だけでは実現できそうになかった
#これはボツ
/SchemaName/TableName/year={yyyy}/month={mm}/day={day}/xxxxx.parquet
まとめ
他に色々つまずいた記憶がありますが、今日は一旦ここまで
DMSは全体的に設定箇所は多いですが、「何をしてくれるための設定か」がわかりやすく感じました
また時間があればFull loadの速度の結果を載せたいなあ
確定申告しないとなあ