(第1回)AWS Snowballを使ってみた

はじめまして。私は当社でWeb系のシステム開発のエンジニアをしております、サトシと申します。これまで私はオンプレミスでの開発しか経験して来なかったのですが、担当しているシステムがEoLを迎えるにあたり、クラウド(AWS)へ移行することになりました。

前提(課題)

  • 1ペタバイト超のデータ(レプリケーション含む)を保有しているシステムであり、この大量データをどうやってクラウド移行したらよいか?
  • このデータはオンプレミスのストレージシステムに格納されているのだが、Webのユーザーインターフェースを持つシステムであり、ストレージシステム部分が奥に隠蔽されているので、ネットワーク経由で引き抜くことが難しい。
  • 仮にネットワーク経由で転送できたとしても3~4ヶ月かかる試算である。

解決の方向性

上記のようなケースには「AWS Snowball」というAWSのサービスが最適ではないかと考え、実際に使ってみたので、今回は、ファイル転送までの基本動作をレポートしたいと思う。

AWS Snowballとは

AWS公式別ウィンドウで開きますによると

AWS Snowball サービスでは、物理ストレージデバイスを使用して、Amazon Simple Storage Service (Amazon S3) とオンサイトのデータストレージロケーション間で、インターネットよりも高速に大量のデータを転送します。AWS Snowball を使用すると、時間と費用を節約できます。(中略)
Snowball デバイスは、AWS Key Management Service (AWS KMS) で保護された、物理的に頑丈なデバイスです。転送中のデータを安全に保ち、保護します。

とのこと。
要はAWSが大容量のストレージが搭載された高性能PCを貸し出してくれて、それに移行対象のデータ(ファイル)を入れ込み、送り返すとAWSがAmazon S3上に移してくれる。AWS Snowball(以下、Snowballとする)内のデータは暗号化されるのでセキュリティ面でも安心というもの。2016年にはSnowballの高機能版AWS Snowball Edge(以下、Snowball Edgeとする)がリリースされたので、今回はSnowball Edgeを使ってみることにした。
Snowball Edgeの主な仕様は以下の通り。

ストレージ容量 100TB(テラバイト)
ネットワークIF 10GBase-T RJ45
25GB SFP+
40GB QSFP+
サイズ(前面から見てHxWxD) 386x269x671mm
重量 22.45Kg
データ転送(プロトコル) ファイルインターフェース(NFS)
Amazon S3 Adapter(S3)

AWS Snowball Edgeへのデータ転送(プロトコル)は「ファイルインターフェース(NFS)」と「AWS S3 Adapter(S3)」がある。データ転送速度の面ではファイルインターフェースは概して25~40MB/s(メガバイト毎秒)であるのに対し、AWS S3 Adapterでは250~400MB/sと高速である。なお、これら二方式は読み書きの衝突を避けるため同時には使わない方が良いとのこと。

Snowball Edgeの貸し出し依頼

まずは実機に触って実際のデータ移行に使えるのかどうか検証すべく、早速AWSにSnowball Edgeの貸し出しを依頼。これはAWSマネジメントコンソールからサービス「Snowball」を選択し、ジョブを作成して行う。ここからの手順については基本的に AWS Snowball Edge の使用開始:最初のジョブ別ウィンドウで開きますにしたがって進めればよい。下表のようなジョブを作成した。

ジョブの計画(ジョブタイプ) Amazon S3 へのインポート
デバイスタイプ Snowball Edge Storage Optimized(ストレージ100TB)
バケット名 インポート先のs3バケットを指定(複数指定可能)
EC2でコンピューティングを有効にする チェックしない
Lambda 関数 指定しない
アクセス権限 「IAMロールの作成/選択」からデフォルトのまま「許可」
暗号化 KMSキー (デフォルト)aws/importexport
通知の設定 「新しいSNSトピックの作成」でトピック、メールアドレスを指定。

ジョブ作成が完了すると3~7稼動日で配送との表示がある。配達状況はジョブステータス画面で確認することができ、「発送準備完了」、「お客様へ発送済み」などのステータスを経て配達完了となる。実際には約1週間でSnowball Edgeが届いた。

タワー型PCを一回り大きくしたようなサイズ。前面、上面、背面と各所に扉がついていてLCDディスプレイやインターフェースには直接アクセスできないようになっている。次にAWS Snowball Edgeにデータ転送できるようにセットアップをしていく。

電源オンとローカルネットワークへの接続

ネットワークケーブルについて、今回は簡易な検証のためノートPC(OSはUbuntu 16.04 LTS)を直接接続するのでLANケーブルを背面のRJ45ポートに接続。

前面の扉を開け、LCDディスプレイの上にある電源ボタンを押して、電源オン。LCDディスプレイにアニメーションが表示され10分ほど待つと「Ready」と表示される。ネットワーク設定についてはDHCPであれば起動後IPアドレスが自動的に割り振られるが、今回は手動で設定する。LCD ディスプレイで、[CONNECTION] をタップし設定していく。
今回は以下を設定した。

IPアドレス:172.16.1.100
ネットマスク:255.255.0.0

Snowball Edgeのアドレス設定が終わったら、ノートPC(Ubuntu)のIPアドレスも同じネットワークに所属するように設定。

IPアドレス:172.16.1.1
ネットマスク:255.255.0.0

ターミナルを開き、pingを打ってSnowball Edgeへの疎通を確認しておく。

$ ping 172.16.1.100
PING 172.16.1.100 (172.16.1.100) 56(84) bytes of data.
64 bytes from 172.16.1.100: icmp_seq=1 ttl=128 time=11.2 ms
64 bytes from 172.16.1.100: icmp_seq=2 ttl=128 time=12.1 ms
64 bytes from 172.16.1.100: icmp_seq=3 ttl=128 time=18.7 ms
^C

ロック解除用の認証情報の取得

AWS マネジメントコンソールにアクセスし、Snowball Edgeの要求時に作成したジョブのジョブステータスを開く。「ジョブの詳細を表示」ボタンを押し、認証情報の項目を展開して解除コード(ハイフン含む)を書き留め、マニフェストファイルをダウンロードする。ダウンロードしたファイルはノートPCに転送しておく。(あらかじめノートPC上でダウンロードしておいてもよい)

Snowball Edgeクライアントのインストール、設定

SnowballクライアントはAWS Snowball Edgeリソース別ウィンドウで開きますのページからダウンロードし、任意のディレクトリに「snowball-client-linux-1.0.1-327.tar.gz」を配置し、解凍するだけで利用できるようになる。
ターミナルから以下を実行する。

$ mkdir ~/work
$ cd ~/work
$ wget http://snowball-client.s3-website-us-west-2.amazonaws.com/snowball-client-linux.tar.gz
$ tar xvzf snowball-client-linux-1.0.1-327.tar.gz
 (解凍されたファイル一覧が表示される)

解凍先のbinディレクトリ配下に「snowball」「snowballEdge」コマンドが配置されている。

$ cd snowball-client-linux-1.0.1-327
$ cd bin
$ ls
snowball  snowballEdge

初期設定としてマニフェストファイルの場所、解除コード、エンドポイントを指定する。

$ ./snowballEdge configure
Configuration will stored at /home/hoge/.aws/snowball/config/snowball-edge.config
Snowball Edge Manifest Path: <マニフェストファイルのフルパス>
Unlock Code: <29桁の解除コード>
Default Endpoint: https://<snowballEdgeに設定したIPアドレス>

Snowball Edgeのロック解除

snowballEdge unlock-device コマンドを実行してSnowball Edge アプライアンスのロックを解除しアクセスできる状態にする。

$ ./snowballEdge unlock-device
Your Snowball Edge device is unlocking. You may determine the unlock
state of your device using the describe-device command. Your Snowball
Edge device will be available for use when it is in the UNLOCKED
state.

このコマンドでは前項で設定したマニフェストファイル、解除コード、エンドポイントの情報が使用される。正しく設定できていれば上のメッセージが表示される。
メッセージどおりStateがUNLOCKEDになっていることを確認する。

$ ./snowballEdge describe-device
{
  "DeviceId" : "JID43fa2dd7-9bc7-425e-b0ca-bd2f1b66d73a",
  "UnlockStatus" : {
    "State" : "UNLOCKED"
  },
  "ActiveNetworkInterface" : {
    "IpAddress" : "172.16.1.100"
  },
 (以下省略)

これでSnowball Edgeのロックが解除され、Snowball Edgeへのファイル転送準備が整った。

AWS CLIのインストール、設定

ファイルをSnowball Edgeに転送するのに使用するawscliをセットアップしていく。すでにawscliがインストールされていれば設定のみ実施すればよい。
前準備としてawscliの動作に必要なパッケージソフトをインストールする。(環境によって必要なパッケージソフトは異なる)

$ sudo apt-get install python-setuptools python-dateutil python-urllib3

awscliをインストールする。

$ cd ~/work
$ wget https://github.com/aws/aws-cli/archive/1.16.14.zip
$ unzip 1.16.14.zip
$ cd aws-cli-1.16.14
$ sudo python setup.py install

インストールされたawscliのバージョンを確認する。

$ aws --version
aws-cli/1.16.14 Python/2.7.12 Linux/4.4.0-166-generic botocore/1.12.4

awscliのバージョンが1.16.14であることが分かる。
Amazon S3 Adapter の使用別ウィンドウで開きますでは「現在、Snowball Edge デバイスの使用は、AWS CLI のバージョン 1.16.14 以前でのみサポート」と記載があり、AWSに確認したところ、1.16.14より新しいバージョンだと一度のコピーが最大1,000件ずつとなる制限があるとのこと。

次にawscliに2つの設定を行う。
1つ目は、awscliがSnowball Edgeにアクセスするための認証情報(アクセスキー、シークレットアクセスキー)を設定する。
Snowball Edgeからアクセスキーを取得する。

$ ./snowballEdge list-access-keys
{
  "AccessKeyIds" : [ "ABCDEFGHIJKLMNOPQRST" ]
}

取得したアクセスキーをパラメータに指定して、さらにシークレットアクセスキーを取得する。

$ ./snowballEdge get-secret-access-key -–access-key-id ABCDEFGHIJKLMNOPQRST
[snowballEdge]
aws_access_key_id = ABCDEFGHIJKLMNOPQRST
aws_secret_access_key = abcdefghijklmnABCDEFGHIJKLMN/12345678890

シークレットアクセスキーが取得できることが確認できたらcredentialsファイルに書き込む。

$ ./snowballEdge get-secret-access-key -–access-key-id ABCDEFGHIJKLMNOPQRST >> ~/.aws/credentials

追加されたことを確認。

$ cat ~/.aws/credentials
 (中略)
[snowballEdge]
aws_access_key_id = ABCDEFGHIJKLMNOPQRST
aws_secret_access_key = abcdefghijklmnABCDEFGHIJKLMN/12345678890

2つ目は、awscliがSnowball Edgeにデータを転送する際に必要な証明書を設定する。
証明書はSnowball Edgeから取得する。証明書のAmazonリソースネーム(ARN)を表示。

$ ./snowballEdge list-certificates
{
  "Certificates" : [ {
    "CertificateArn" : "arn:aws:snowball-device:::certificate/0123456789abcdef0123456789abcdef",
    "SubjectAlternativeNames" : [ "172.16.1.100" ]
  } ]
}

取得したARN をパラメータに指定して証明書を取得する。

$ ./snowballEdge get-certificate --certificate-arn arn:aws:snowball-device:::certificate/0123456789abcdef0123456789abcdef > ~/work/ca-bundle.pem
$ cat ~/work/ca-bundle.pem
-----BEGIN CERTIFICATE-----
MIIC8DCCAdigAwIBAgIIb/Vlh66iencwDQYJKoZIhvcNAQENBQAwFzEVMBMGA1UE
(中略)
uVdnlCJJPwWqHmBsecySg7RwRKLQq1bp0Fi5uDorfzGTF6XH
-----END CERTIFICATE-----

保存した証明書ファイルca-bundle.pemをawscliが使うよう設定する。

$ aws configure set profile.snowballEdge.ca_bundle ${HOME}/work/ca-bundle.pem

Snowball Edgeへのファイル転送

awscliが正しく設定されているか確認するため、Snowball Edge内のバケット一覧を表示してみる。

$ aws s3 ls --profile snowballEdge --endpoint https://172.16.1.100:8443
2009-10-13 02:50:30 test-bucket01
2009-10-13 02:50:30 test-bucket02

設定が正しければSnowball Edgeのジョブ作成時に指定したバケット一覧が表示される。
ファイルを転送する。

$ aws s3 cp ~/work/test/ s3://test-bucket01/ --recursive --profile snowballEdge --endpoint https://172.16.1.100:8443
Upload: work/test/test1 to s3://test-bucket01/test1
Upload: work/test/test2 to s3://test-bucket01/test2
Upload: work/test/dir1/test1 to s3://test-bucket01/dir1/test1

転送されたファイルの一覧を確認する。

$ aws s3 ls s3://test-bucket01/ --profile snowballEdge --endpoint https://172.16.1.100:8443
                           PRE dir1/
2019-04-18 17:35:57         16 test1
2019-04-18 17:35:57         16 test2

ファイルの一覧が表示されれば成功!

まとめと次回予告

今回(第1回)は、AWS Snowballの概要と、ファイル転送までの基本動作をレポートしました。
次回(第2回)はファイルの転送速度や効率的な転送について書きたいと思います。

アマゾン ウェブ サービス、Amazon Web Services(AWS)、AWS Snowball、AWS Snowball Edgeは、⽶国その他の諸国における、Amazon.com, Inc.またはその関連会社の商標です。
Amazon Web Services(AWS)、Microsoft Azureの
導入支援サービスのご相談、お問い合わせをお待ちしております。

ページ上部へ戻る