Redshiftクラスタの暗号化をやってみた 〜準備編〜

投稿者: | 2018/07/23

最近までずっとAWSサービスストレージの暗号化しかやっていなかったのでネタは暗号化一本ですw
今回はRedshiftクラスタのストレージ暗号化です。

今回は長いので、準備編と移行編に分けたいと思います。

Redshiftクラスタの暗号化方法

Redshiftクラスタは暗号化は対応しているのですが、RDSのようにスナップショットから復元しても暗号化設定ができません。
ドキュメント を読むと、暗号化済のRedshiftクラスタを新規作成し、データ移行するしかないようです。

クラスターを起動するときに暗号化を有効にします。暗号化されていないクラスターから暗号化されたクラスターに移行するには、まず既存のソースクラスターからデータをアンロードします。次に、選択した暗号化設定を使用して、新しいターゲットクラスター内のデータを再ロードします。

どうやってデータを移行するか

データの移行(データのアンロード&コピー)をどうやるかですが、AWS Database Migration Service(DMS) を使いたいところですが、ソースにRedshiftを選択できません。

Amazon RDS instance databases, and Amazon S3
* Oracle versions 11g (versions 11.2.0.3.v1 and later) and 12c, for the Enterprise, Standard, Standard One, and Standard Two editions.
* Microsoft SQL Server versions 2008R2, 2012, 2014, and 2016 for the Enterprise, Standard, Workgroup, and Developer editions. The Web and Express editions are not supported.
* MySQL versions 5.5, 5.6, and 5.7.
* MariaDB (supported as a MySQL-compatible data source).
* PostgreSQL 9.4 and later. Change data capture (CDC) is only supported for versions 9.4.9 and higher and 9.5.4 and higher. The rds.logical_replication parameter, which is required for CDC, is supported only in these versions and later.
* Amazon Aurora (supported as a MySQL-compatible data source).
* Amazon S3.

https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Introduction.Sources.html

先程のドキュメントを見ますと、Amazon Redshift アンロード/コピーユーティリティ(UnloadCopyUtility)が紹介されているので、今回はそれを使用します。

UnloadCopyUtility

Amazon Redshift Unload/Copy Utility

AWSが開発しているRedshiftユーティリティツールの中にあります。

この図を見ると、RedshiftクラスタからデータをアンロードしたものをS3に一時的に保管し、移行先のRedshiftクラスタにCOPYコマンドでロードしているといった、シンプルな動作になります。

RedshiftUnloadCopy

https://github.com/awslabs/amazon-redshift-utils/blob/master/src/UnloadCopyUtility/RedshiftUnloadCopy.png

準備

ここから本記事の本題に入りますが、UnloadCopyUtilityを使えるように準備していきましょう。

実行環境はAmazon Linuxです。

パッケージインストールなど

必要なパッケージをインストールします。すでにpipがインストールされているとしてすすめていますが、もしインストールしていない場合は先にpipを入れてください。

Redshiftユーティリティツールをgit cloneしてきます。

RedshiftクラスタのIAMロール作成

Redshiftクラスタ自身がS3にアクセスする必要があるため、s3:GetObject 及び s3:PutObject の権限を付与したIAMロールを作成し、移行元のRedshiftクラスタにアタッチしてください。

移行用のS3バケットを作成

データを一時的に保管するS3バケットを作成します。
今回は copy-redshift-cluster としていますが、適宜変更してください。

KMSマスターキーの作成

暗号化Redshiftクラスタで指定するKMSマスターキーを作成します。
デフォルトキーも指定可能ですが、アカウント間のスナップショット共有ができなかったり不便なのでできるだけ専用のKMSキーを作成しておいた方が良いです。
幸いにもスクリプトはUnloadCopyUtilityに同梱されていたのでそれを使いましょう。

パスワードの暗号化

後で出てくる設定ファイルにRedshiftクラスタの接続情報を記載するので、パスワードを暗号化しておきます。
これもスクリプトが用意されているのでそれを使います。実行すると長い文字列が出るのでそれを控えておいてください。

設定ファイルの作成

UnloadCopyUtility/example/config.json に設定ファイルの見本があるのでそれをコピーして設定ファイルを作成します。一つのテーブルにつき、一つの設定ファイルが必要になります。

こんな感じで設定します。これを mytable_a.json として保存します。

作成した設定ファイルをS3にアップロードします。

実行

試しにこのテーブル mytable_a に対してデータを移行してみます。
検証を行う際は、移行元のRedshiftクラスタでクエリが実行されていないことを確認してください。もし停止が難しい場合は、スナップショットから検証用としてクラスタを復元して試してください。
--destination-table-auto-create は移行先のRedshiftクラスタにテーブルが無ければ作成するオプションです。

移行先Redshiftクラスタで select "table", tbl_rows from svv_table_info; を実行しテーブルが作成されていること、データ件数が移行元と同じであればOKです。

最後に

Redshiftクラスタの暗号化を行うための準備を整えました。
実際に移行しているとわかりますが、データ量が多いテーブルだと途中でコケてしまいます。その対処方法については次回の記事で解説します。

参考URL

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください