はじめに
MNTSQでSREチームに所属している中岡です。
昨今ではコンテナ技術を使用してアプリケーションを稼働させることが一般的になっています。 コンテナが稼働する環境であれば、理論上はAWSなどのクラウド上でも、オンプレでも、自分の端末でも同じように動作するはずです。
そのため、開発者が自身の端末内に開発環境を構築し、そこで開発を進めた上でAWS上の環境にデプロイするというケースも多いかと思います。
その際、アプリケーションで使用するデータ保持のため、RDBやオブジェクトストレージが必要になります。 RDBであれば、MySQLやPostgreSQLをコンテナで稼働させれば問題ありません。ではオブジェクトストレージはどうすれば良いでしょうか?
AWSではS3(Simple Storage Service)というオブジェクトストレージのマネージドサービスがあります。 ローカル上でAWSと同じ構成を模して開発するには、同じようにストレージを扱う必要があります。
MinIOについて
弊社では、MinIOというS3互換ストレージのOSSを使用しています。
MinIOは、GNU Affero General Public License v3.0 に基づいてリリースされた高性能オブジェクト ストレージです。 Amazon S3 と API 互換性があります。
MinIO Object Storage for Container — MinIO Object Storage for Container
実際にMinIOをコンテナ環境で稼働させた印象として、安定しており、非常に使いやすいと感じています。 ※本稿では、MinIOの具体的な設定方法などには触れません
データ移行の要件
さて、ここからが本題となります。 弊社では以下のような要件が発生しました
- ローカル環境やオンプレ環境で使用したデータを、そのままAWSのS3上に移行したい
- 移行したデータに破損や漏れがないかをチェックしたい
- ローカルからAWS上にデータを移行する時、ネットワークの帯域を使い切ってしまい、他の通信に悪影響を与えてしまう事を避けたい
検討の結果、MinIOのcommand line toolとして提供されているmc
が優秀で、上記の問題は全てこのツールで対処できました。
MinIO Client — MinIO Object Storage for Linux
なお、弊社にて動作実績のある環境は、CentOS7及びRHEL8.9となります。
データ移行手順
- mc(minio client)のインストール
以下の手順でインストールします。
$ wget https://dl.min.io/client/mc/release/linux-amd64/mc -- https://dl.min.io/client/mc/release/linux-amd64/mc dl.min.io (dl.min.io) をDNSに問いあわせています... 138.68.11.125, 178.128.69.202 dl.min.io (dl.min.io)|138.68.11.125|:443 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 27496600 (26M) [application/octet-stream] `mc' に保存中 100%[==============================================================================================>] 27,496,600 4.83MB/s 時間 5.9s YYYY-MM-DD HH:MM:SS (4.47 MB/s) - `mc' へ保存完了 [27496600/27496600] $ sudo chmod +x mc $ sudo mv mc /usr/local/bin/mc $ mc --version mc version RELEASE.2024-10-08T09-37-26Z (commit-id=cf128de2cf42e763e7bd30c6df8b749fa94e0c10) Runtime: go1.22.8 linux/amd64 Copyright (c) 2015-2024 MinIO, Inc. License GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
これでmcがインストールできました。
mcの基本的な使用方法は、データ操作をしたい対象にエイリアスの設定をすることです。 以下は初期状態です。
$ mc alias ls mc: Configuration written to `/home/mntsq/.mc/config.json`. Please update your access credentials. mc: Successfully created `/home/mntsq/.mc/share`. mc: Initialized share uploads `/home/mntsq/.mc/share/uploads.json` file. mc: Initialized share downloads `/home/mntsq/.mc/share/downloads.json` file. gcs URL : https://storage.googleapis.com AccessKey : YOUR-ACCESS-KEY-HERE SecretKey : YOUR-SECRET-KEY-HERE API : S3v2 Path : dns local URL : http://localhost:9000 AccessKey : SecretKey : API : Path : auto play URL : https://play.min.io AccessKey : Q3AM3UQ867SPQQA43P2F SecretKey : zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG API : S3v4 Path : auto s3 URL : https://s3.amazonaws.com AccessKey : YOUR-ACCESS-KEY-HERE SecretKey : YOUR-SECRET-KEY-HERE API : S3v4 Path : dns
このサンプルを見て分かる通り、MinIOで管理しているストレージだけでなく、AWSのS3やGoogle Cloud Storage(以下GCS)もalias設定の対象にすることができます。その際、AccessKeyおよびSecretKeyを使ってアクセスしますが、aliasコマンドでkeyが表示されてしまうため、移行作業に限定したkeyを発行し、対象のS3Bucketを限定するなど、AWS側のアクセスキー設定には十分留意してください。 そして、データ移行が終わったら、速やかにkeyを削除しましょう。
では実際にエイリアスの設定をしていきます。MinIOはローカル上にDockerコンテナで起動している前提です。 また、S3は東京リージョンを使用しているため、URLも東京リージョン指定にしています。
- 移行元:MinIO(ローカルストレージ)
- 移行先:AWSのS3
mc mirror — MinIO Object Storage for Linux
# エイリアスの登録 $ mc alias set mntsq-test-minio http://127.0.0.1:7100 <MINIO_ROOT_USER> <MINIO_ROOT_PASSWORD> Added `mntsq-test-minio` successfully. $ mc alias set mntsq-aws https://<S3BUCKET NAME>.s3.ap-northeast-1.amazonaws.com/ <ACCESS KEY> <SECRET KEY> Added `mntsq-aws` successfully. # エイリアスが登録されているかを確認 $ mc alias ls mntsq-aws URL : https://<S3BUCKET NAME>.s3.ap-northeast-1.amazonaws.com AccessKey : **************************** SecretKey : **************************** API : s3v4 Path : auto Src : /home/mntsq/.mc/config.json mntsq-test-minio URL : http://127.0.0.1:7100 AccessKey : ******** SecretKey : ******** API : s3v4 Path : auto Src : /home/mntsq/.mc/config.json
これでデータ移行の準備ができました。 MinIOからS3にデータ移行をするには、mcのミラーリング機能を使います。 この例では、test配下のデータをミラーリングします。
# ミラーコマンド実行 # 送信元、送信先の順番でエイリアス設定したバケットを指定 $ mc mirror mntsq-minio/test mntsq-aws/test 0 B / ? xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaax ...xxxxxxxx.pdf: 1.02 GiB / 1.02 GiB xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaax 10.31 MiB/s 1m41s $
ミラーリングが完了し、プロンプトが帰ってきたら完了です。 もし何かエラーが発生した場合は、その内容が標準出力されます。 また、途中でミラーリングを停止した場合は、再度同じコマンドを実行すれば問題ありません。
最後に、データの移行がもれなく完了したかを確認します。
$ mc diff mntsq-minio/test mntsq-aws/test # 差分がない場合は、何も出力されずにプロンプトが返ってくる # diffの実行には時間がかかるため、sshでサーバに接続している場合などは途中でセッションが切れてしまう場合がある # データ量が多い場合は、以下のようにバックグランドで実行することを推奨 $ nohup mc diff mntsq-minio/test mntsq-aws/test > YYYYMMDD_mc_diff_log.txt 2>&1 &
帯域制御の方法
ここまででデータ移行は完了です。 ただし、この手順ではデータ移行でインターネット回線の帯域を占有し、他の通信に影響を及ぼす可能性があります。 mcにはアップロード、ダウンロードの帯域を制限するオプションもあり、これを併用することでその心配もなくなります。
mc mirror — MinIO Object Storage for Linux
# ミラーコマンドにアップロードの帯域制限を指定 # この場合、30Mbpsの帯域制限をしてアップロードする $ mc mirror --limit-upload 3.57MiB mntsq-minio/test mntsq-aws/test
ローカルからAWSへのアップロードになるため、上記のオプションとなります。方向が逆の場合は"--limit-download"を指定します。
おわりに
ローカルでテストしたデータを使いたい、オンプレ環境のデータをクラウド上に単純移行したいなど、オブジェクトストレージを扱う色々なケースがあるかと思います。そうした時に本稿の内容が参考になれば幸いです。