Snowball Edgeが自宅に届いてからS3にインポートするまでの記録（2020年11月）


## はじめに
Snowballといえば、AWSソリューションアーキテクト・アソシエイトを受験されたことのある方なら「テラバイト級のデータをS3のバケットにインポートする、ときたらSnowball一択」でおなじみかと思います。マイナーなサービスでありながらアソシエイト試験の常連なのは、やはり宣伝の意味なのでしょうか。

本記事は、Snowball Edgeデバイス（以下「デバイス」）が自宅に到着後、データをデバイスにコピー、S3のバケットにデータのインポートが完了するまでの手順を記録したものです。そもそもSnowballとは何か？は、以下のドキュメントをご覧なさい。本記事では、公式ドキュメントには載ってない気づきを積極的に記録してみました。

[AWS Snowball Edge 開発者ガイド](https://docs.aws.amazon.com/ja_jp/snowball/latest/developer-guide/)

なお、本記事でSnowballEdgeクライアントやAWS CLIをインストールしたOSはWindows 10です。

## Snowball Edge利用時の全体の流れ

1. AWSマネージメントコンソールからジョブの作成
2. AWSからデバイスの発送
3. デバイスの受取り
4. 事前準備
    1. デバイスのIPアドレス設定とLANへの接続
    2. Snowballのジョブダッシュボードからアンロックコードとマニフェストファイルの取得
    3. SnowballEdgeクライアントのセットアップ
    4. デバイスのロック解除
    5. （S3 Adapter利用時）ローカルのAmazon S3認証情報（AWS署名バージョン4）の取得
    6. （ファイルインタフェース利用時）仮想ネットワークインタフェースの作成
    7. （ファイルインタフェース利用時）PCからデバイス内のバケットにマウント
5. デバイスへファイル転送
6. 西濃運輸さんのWebサイトで集荷依頼の申込み
6. AWSへデバイスの返送
7. AWSにてデバイス内のファイルをS3へインポート

## ジョブ作成からS3へのインポートまでのタイムライン

Snowballジョブでは、ジョブのステータスが更新される度にAmazon SNS経由でメールが送信されますが、このメールのタイムスタンプをもとに、各イベントのタイムラインをまとめてみました。

### 1. AWSから自宅へのデバイスの配送

今回は、ジョブ作成から約26時間後にデバイスが到着しました（土日祝日は挟まず）。受取日時の指定はできないため、例えばオンプレのデータセンターでデバイスを受取る場合、データセンターの入館証の発行申請とタイミングを合わせることは難しいため、代理人にデバイスの受取りを依頼するなど、そこら辺の手配がちょっと面倒かと思います。

|日時|ステータス|
|:--:|:--|
|11/05 10:09|ジョブ作成完了|
|11/05 11:09|AWSにてデバイスの手配開始|
|11/05 12:27|配送開始|
|11/06 12:20|運送会社からデバイスを受取り（自宅に到着）|

### 2. 自宅からAWSへのデバイスの返送

デバイス返送後は、運送会社がデバイスを集荷してから、約1日18時間後にインポート完了しました（土日祝日は挟まず）。今回は、インポートしたデータ量が少なかったのでこの時間です。

集荷依頼時に集荷日時の指定はできますが、昨今のご時世もあり、指定時刻通りに集荷してもらうことはなかなか難しいようです（今回は集荷を10時に指定しましたが、実際には当日の18時頃に集荷していただけました）。

|日時|ステータス|
|:--:|:--|
|11/16 18:16|運送会社にデバイスを引渡し（自宅に集荷）|
|11/17 17:09|仕分け施設に到着|
|11/18 11:20|デバイスがAWSに到着|
|11/18 11:30|インポート開始|
|11/18 11:40|インポート完了|

## ジョブの作成

まず、Snowballダッシュボードから、ジョブを作成します。ジョブとは、デバイスの配送からS3へのインポートまでの１回のフローを表す概念です。

* 今回は、デバイスは`Snowball Edge Storage Optimized (100TB)`を選択しました。

* 現在では、デバイスにSnowball（Snowball Edgeでない）は選択できないようです。また、ストレージサイズの小さいSnowconeというデバイスもありますが、Snowconeは東京リージョンでは提供されていません（2020年11月現在）。

* ジョブ作成画面で、S3のバケットへのアクセスを許可するためのロールを作成または選択します。IAMコンソールから作成したロールやポリシーを指定することも可能です。なお、指定可能なポリシーはインラインポリシーのみです。参考として、以下はロールとポリシーのJSONです。


```:ロールの信頼関係
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "importexport.amazonaws.com"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "sts:ExternalId": "AWSIE"
        }
      }
    }
  ]
}
```

```:ポリシー（インラインポリシー）
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketPolicy",
                "s3:GetBucketLocation",
                "s3:ListBucketMultipartUploads"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:AbortMultipartUpload",
                "s3:ListMultipartUploadParts",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::*"
        }
    ]
}
```

* デバイスにファイルを読み書きするのに、S3 Adapterとファイルインタフェースを使用する場合、それぞれで使用するバケットを個別に作成することをおすすめします。同一バケットに、S3 Adapterとファイルインタフェースの両方で読み書きした場合の動作は保証されません。

* ジョブ作成時、選択するKMSの暗号化キー（CMK）を選択できます（デフォルトは`aws/importexport`）。これは、デバイスへのファイル格納時の暗号化に使用されるものではなく、**デバイス内に保存するアンロックコードの暗号化**に使用されるものです。

* [開発者ガイド](https://docs.aws.amazon.com/ja_jp/snowball/latest/developer-guide/encryption.html)には、SnowballEdgeはSSE-S3には対応しているがSSE-Cには対応していない、という説明がありますが、**SSE-KMSはどうなの？？**…と思いましたが、SSE-KMSには対応していないものの、暗号化はされずにデバイス内のバケットにファイルが格納されます（デバイスにKMSがインストールされてるわけではないだろうし、デバイスへのデータ転送時にエラーになったりしないだろうか…と不安でしたが、杞憂でした）。インポート先のバケットに**KMSキーによるサーバ側デフォルト暗号化（SSE-KMS）が設定されている場合でも、デバイスへのデータ転送は可能です**。

* なお、SSE-S3なら暗号化されてデバイスに格納されるようです。

## デバイスの配送

今回はジョブ作成後、約26時間後にデバイスが自宅に到着しました。ただし、AWSや運送業者さん（西濃シェンカー）の配送業務が平日のみの対応となる場合もありますので、配送が土日祝日に重なる場合はご注意ください。

## デバイスが届いてから

### 1. 返送用伝票の確認
デバイスの側面に、デバイス返送時の手順が書かれたお知らせと、返送用伝票の入ったビニール袋が貼付されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51871/e4c6b135-e834-1838-02de-54ee68f56bb8.png)

デバイス返送時の配送用伝票です。「ご依頼人」（発送主）の住所・氏名・電話番号は（画像ではマスキングしましたが）印字済みのため、自分で記入する項目は特になさそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51871/59fbca5f-d163-ab4d-e583-092b93bb97e8.png)

### 2. カバーの開け方
カバーの開け方ですが、丸い金属ボタンを押したまま、金具をボタン方向にスライドすると、カバーが開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51871/2a7ec47f-3122-6b15-79a2-489982795cdf.png)

上面には、電源ケーブルが収納されています。ケーブル長は約1.8mです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51871/5ec16ad7-b3db-ed66-f8d8-e3e1a20c84f3.png)

前面・背面のカバーは、90度開いた状態で奥にスライドすると収納できます（前面パネルの上部のオレンジの丸いボタンが電源ボタンです）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51871/3bb1a6ed-aca5-7475-865f-55f00f206e9e.png)

### 3. ケーブルの接続
背面に電源ケーブルとLANケーブルを差します。左上にUSB3.1ポートx 2も見えますが、拡張用でしょうか。また、RJ45ポートの右側に怪しいポートがありますが、フタをスライドしてみたところ穴が塞がれていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51871/4765f7ca-d2b1-edf9-b574-82f5844ac632.png)

### 4. デバイスの起動

電源ケーブルを差した瞬間、デバイスが起動を開始し、前面のLCDパネルに起動画面が流れます。起動音がけっこうな轟音なので最初はビビりますが、2分ぐらいで静かになります。

<iframe width="560" height="315" src="https://www.youtube.com/embed/X0g151NyNA4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

### 5. IPアドレスの設定

前面のLCDパネルから、Snowball EdgeにIPアドレス等を設定します。固定IPでも、DHCPでの設定でも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51871/d59adb88-53a8-8cce-3b15-ba1b415b5abd.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51871/49b1f8af-a0f8-28ff-7636-8f2358fcc5a7.png)

### 6. Snowball Edgeクライアントの入手

Snowballに関連するツールとして、以下の3つが登場します。

* Snowball Edgeクライアント　…　デバイスのロック解除など、デバイスの設定周りを行うCLIです。あくまでデバイスを制御するためのツールなので、このCLIでSnowball Edgeにファイル転送するわけではありません。
* AWS OpsHub　…　Snowball EdgeクライアントのGUI版です。
* S3 Adapter　…　デバイスにファイルをコピーをするツールです。といっても「S3 Adapter」という名前のツールがあるわけではなく、実体としてAWS CLIのS3コマンドやS3 APIを指します。ただし、開発者ガイドで「APIオペレーションのサブセットがサポート」と表現されているように、Snowball EdgeではAWS CLIやS3 APIの使用可能なパラメータは制限されています。また、開発者ガイドで指定されているように、Snowball Edgeでは**AWS CLIバージョン1.16.14**を使用します。

このうち、Snowball Edgeクライアント（CLI）とAWS OpsHub（GUI）は用途が同じツールなので、いずれか一方をインストールすればよいです。EC2インスタンスをホスティングするなら、AWS OpsHubのほうが使い勝手が良いですかね。今回は、Snowball Edgeクライアントを使用しました。

後述しますが、ファイル転送はS3 Adapterだけでなく、ファイルインタフェース（NFS）でも可能です。

以下から、Snowball Edgeクライアントをダウンロードし、インストールします。

[AWS Snowball のリソース](https://aws.amazon.com/jp/snowball/resources/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51871/f885dd28-8b7c-88e8-9b2b-87726c21f769.png)

### 7. Snowball Edgeクライアントの設定

Snowball Edgeクライアントのインストールが完了したら、プロフィールを設定します。
プロフィールの設定には、以下の情報が必要となります。

* マニフェストファイル　…　マネージメントコンソールのSnowballのジョブダッシュボードの、ジョブの詳細からダウンロードできます。`Snowball Edge Manifest Path`に絶対パスを指定します。
* アンロックコード　…　ジョブの詳細の「クライアント解除コード」に表示される、ハイフン区切りのコードです。`Unlock Code`に指定します。
* デフォルトエンドポイント　…　デバイス内のS3のURL（`https://IPアドレス`）です。IPアドレスは、前面のLCDパネルで設定したIPアドレスです。`Default Endpoint`に指定します。

```:（初回のみ）SnowballEdgeクライアント用のプロフィールの設定
>snowballEdge configure
Configuration will stored at C:\Users\yz2cm\.aws\snowball\config\snowball-edge.config
Snowball Edge Manifest Path: G:\local\aws\snowball\JIDxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx_manifest.bin
Unlock Code: xxxxx-xxxxx-xxxxx-xxxxx-xxxxx
Default Endpoint: https://192.168.179.4
```

### 8. デバイスのロック解除

ロックの解除は、デバイスを起動する毎に行います。

事前にデバイスの状態を確認します。
ロック解除前は、`State`が`LOCKED`となっていることが分かります。

```:デバイスのステータス表示

>snowballEdge describe-device
{
  "DeviceId" : "JIDa462ddf6-68a4-496d-a8f4-b6ead73396ad",
  "UnlockStatus" : {
    "State" : "LOCKED"
  },
```

以下コマンドで、ロックを解除します。

```:デバイスのロック解除
>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.
```

`UnlockStatus`が`LOCKED`→`UNLOCKING`→`UNLOCKED`に遷移します。`UNLOCKED`になった時点でアクセス可能となります。

```:デバイスのステータス表示
>snowballEdge describe-device
{
  "DeviceId" : "JIDa462ddf6-68a4-496d-a8f4-b6ead73396ad",
  "UnlockStatus" : {
    "State" : "UNLOCKED"
  },
```
## S3 Adapterを使用したファイル転送

### 1. ローカルのAmazon S3認証情報（アクセスキーID、シークレットアクセスキー）の取得

S3 Adapterを使用したファイル転送には、ローカルのAmazon S3認証情報（AWS署名バージョン4）（アクセスキーIDとシークレットアクセスキー）が必要です。この認証情報は、AWSクラウドのIAMユーザのアクセスキーIDとシークレットアクセスキーとは異なるものです。

以下のコマンドを実行して、認証情報を取得します。

```:アクセスキーIDの表示
>snowballEdge list-access-keys
{
  "AccessKeyIds" : [ "AKIAIOSFODNN7EXAMPLE" ]
}
```

```:シークレットアクセスキーの表示
>snowballEdge get-secret-access-key --access-key-id AKIAIOSFODNN7EXAMPLE
[snowballEdge]
aws_access_key_id = AKIAIOSFODNN7EXAMPLE
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
```

以上で得られた認証情報を、`aws configure`でコンフィグファイルに設定します。
Snowballダッシュボードの画面上部の注意書き（以下）にもあるように、リージョン名には`snow`を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51871/f7132ef1-e78e-d931-4cf5-aa1ce5a60e2f.png)


```:アクセスキーとシークレットアクセスキーをコンフィグファイルへ保存
>aws configure --profile snowballEdge
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: snow
Default output format [None]: json
```

以上で、AWS CLIでデバイスにファイル転送する準備ができました。

S3 AdapterはAWS CLIやS3 APIのサブセットです。AWS CLIのサポートされているコマンド、サポートされているS3 APIは、開発者ガイドを参照してください。

```:S3_Adapterでのファイル転送
aws s3 cp sample.txt s3://sample-bucket/sample.txt --profile snowballEdge --endpoint http://192.168.179.4:8080 --region snow
aws s3 ls s3://sample-bucket --recursive --profile snowballEdge --endpoint http://192.168.179.4:8080 --region snow
```

## ファイルインタフェースを使用したファイル転送

AWS CLIを使用するほかに、デバイス内のバケットをマウントして、ファイルインタフェース経由でファイル転送もすることも可能です。分かりやすく言うと、デバイス内のストレージをPCにマウントして、NFS経由でファイルコピーすることです。

ファイルインタフェースはデフォルト設定では使用できませんので、事前準備として以下の手順を実施します。

1. 仮想ネットワークインタフェースの作成（`snowballEdge create-virtual-network-interface`）
2. 作成した仮想ネットワークインタフェースのARNの確認（`snowballEdge describe-virtual-network-interfaces`）
3. ファイルインタフェースサービスの起動（`snowballEdge start-service`）
4. NFSクライアントの有効化（Windowsの設定変更）
5. バケットをマウント（`mount`）

### 1.仮想ネットワークインタフェースの作成
まず、以下コマンドで、物理ネットワークインタフェース（本記事ではRJ45）の物理ネットワークインタフェースIDを確認します。
`PhysicalConnectorType`が`RJ45`であるところの`PhysicalNetworkInterfaceId`の値（例：`s.ni-8409e6b33247333d6`）をメモします。

```
>snowballEdge describe-device
{
  "DeviceId" : "JIDa462ddf6-68a4-496d-a8f4-b6ead73396ad",
  "UnlockStatus" : {
    "State" : "UNLOCKED"
  },
  "ActiveNetworkInterface" : {
    "IpAddress" : "192.168.179.4"
  },
  "PhysicalNetworkInterfaces" : [ {
    "PhysicalNetworkInterfaceId" : "s.ni-89b8db4ee981cdf40",
    "PhysicalConnectorType" : "QSFP",
    "IpAddressAssignment" : "STATIC",
    "IpAddress" : "0.0.0.0",
    "Netmask" : "0.0.0.0",
    "DefaultGateway" : "192.168.179.1",
    "MacAddress" : "00:00:5E:00:53:fc"
  }, {
    "PhysicalNetworkInterfaceId" : "s.ni-89053899faa1a9aa5",
    "PhysicalConnectorType" : "SFP_PLUS",
    "IpAddressAssignment" : "STATIC",
    "IpAddress" : "0.0.0.0",
    "Netmask" : "0.0.0.0",
    "DefaultGateway" : "192.168.179.1",
    "MacAddress" : "00:00:5E:00:53:fd"
  }, {
    "PhysicalNetworkInterfaceId" : "s.ni-8409e6b33247333d6",
    "PhysicalConnectorType" : "RJ45",
    "IpAddressAssignment" : "STATIC",
    "IpAddress" : "192.168.179.4",
    "Netmask" : "255.255.255.0",
    "DefaultGateway" : "192.168.179.1",
    "MacAddress" : "00:00:5E:00:53:fb"
  } ],
...
```

以下コマンドで、仮想ネットワークインタフェースを作成します。
メモした`PhysicalNetworkInterfaceId`の値を、`--physical-network-interface-id`に指定して以下コマンドを実行します。

仮想ネットワークインタフェースはSnowballEdgeを再起動しても消滅しませんので、以下コマンドは初回設定時のみ実行します。

```:（初回のみ）仮想ネットワークインタフェースの作成
>snowballEdge create-virtual-network-interface ^
--physical-network-interface-id s.ni-8409e6b33247333d6 ^
--ip-address-assignment STATIC ^
--static-ip-address-configuration IpAddress=192.168.179.10,Netmask=255.255.255.0

{
  "VirtualNetworkInterface" : {
    "VirtualNetworkInterfaceArn" : "arn:aws:snowball-device:::interface/s.ni-8e9c511fe6515c86c",
    "PhysicalNetworkInterfaceId" : "s.ni-8409e6b33247333d6",
    "IpAddressAssignment" : "STATIC",
    "IpAddress" : "192.168.179.10",
    "Netmask" : "255.255.255.0",
    "DefaultGateway" : "192.168.179.1",
    "MacAddress" : "00:00:5E:00:53:89"
  }
}
```

### 2. 作成した仮想ネットワークインタフェースのARNの確認
仮想ネットワークインタフェースのARNはサービス起動毎に変化しますので、以下のコマンドでARNを確認します。

```:仮想ネットワークインタフェースのARNの表示
>snowballEdge describe-virtual-network-interfaces
{
  "VirtualNetworkInterfaces" : [ {
    "VirtualNetworkInterfaceArn" : "arn:aws:snowball-device:::interface/s.ni-8e9c511fe6515c86c",
    "PhysicalNetworkInterfaceId" : "s.ni-8409e6b33247333d6",
    "IpAddressAssignment" : "STATIC",
    "IpAddress" : "192.168.179.10",
    "Netmask" : "255.255.255.0",
    "DefaultGateway" : "192.168.179.1",
    "MacAddress" : "00:00:5E:00:53:45"
  } ]
}
```

### 3. ファイルインタフェースサービスの起動
上記コマンドの結果の`VirtualNetworkInterfaceArn`に表示された値（`arn:aws:snowball-device:::interface/s.ni-8e9c511fe6515c86c`）を指定して、以下コマンドでファイルインタフェースサービスを起動します。

```
>snowballEdge start-service ^
--service-id fileinterface ^
--virtual-network-interface-arns arn:aws:snowball-device:::interface/s.ni-8e9c511fe6515c86c

Starting the service on your Snowball Edge. You can determine the status of the service using the describe-service command.
```

以下コマンドで、ファイルインタフェースのステータスを確認します。
`State`が`ACTIVE`になればアクティベート完了です。1～2分で完了する時もあれば、10分以上かかる時もあります（開発者ガイドには「1時間以上かかる場合もある」とあります）。`State`は、`INACTIVE`→`ACTIVATING`→`ACTIVE`と変遷します。

```:ファイルインタフェース（アクティベート中）
>snowballEdge describe-service --service-id fileinterface

{
  "ServiceId" : "fileinterface",
  "Status" : {
    "State" : "ACTIVATING"
  },
  "ServiceCapacities" : [ {
    "Name" : "S3 Storage",
    "Unit" : "Byte",
    "Used" : 2919552,
    "Available" : 92451374477312
  } ]
}
```

```:ファイルインタフェース（アクティベート完了）
>snowballEdge describe-service --service-id fileinterface

{
  "ServiceId" : "fileinterface",
  "Status" : {
    "State" : "ACTIVE"
  },
  "ServiceCapacities" : [ {
    "Name" : "S3 Storage",
    "Unit" : "Byte",
    "Used" : 2919552,
    "Available" : 92451374477312
  } ]
}
```

### 4. NFSクライアントの有効化（Windows 10）
「ファイル名を指定して実行」から`appwiz.cpl`を実行し「プログラムと機能」を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51871/9a76e702-48e6-6409-55d9-20100ce7e624.png)

「Windowsの機能の有効化または無効化」をクリックして、「NFS用サービス」の「NFSクライアント」のチェックをオンにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51871/e13d793c-984f-0274-5cae-1267bbd40318.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51871/b921be43-55c4-f8c0-bf1e-0a4ad591501a.png)

### 5. バケットをマウント

mountコマンドで、SnowballEdgeのバケットをマウントします。

```:バケットをマウント
>mount -o nolock 192.168.179.10:/sample-bucket Z:

Z: は 192.168.179.10:/sample-bucket に正常に接続しました

コマンドは正常に終了しました。
```

マウント完了後は、エクスプローラ経由でファイルをコピーすることができるようになります。

### 6. ファイルインタフェースサービスの停止

以下コマンドで、バッファの内容をファイルにフラッシュし、サービスを終了します。

```
>snowballEdge stop-service --service-id fileinterface
Stopping the service on your Snowball Edge. You can determine the status of the service using the describe-service command.
```

### 【補足1】ファイル名の文字コード
SnowballおよびS3は、ファイル名のエンコーディングはUTF8が推奨されています。

しかし、Windowsの`mount`ではマウントするドライブの文字コードにUTF8を指定できないようです。ですので、Windowsから日本語ファイル名のファイルをファイルインタフェースで転送するとファイル名をSJISで渡すことになるため、実質上、日本語のファイル名は使用できません。

例えば、ファイル名の「あああ」という文字列は、S3へインポート後「������」に文字化けしていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51871/3a873904-67a9-7ed6-b263-bd9f45aa8cd8.png)

余談ですが、サロゲートペア文字を含むファイル名（`𩸽.txt`）を転送し、エクスプローラの表示を更新したところ、ファイル名「??」でファイルを作成されてしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51871/ce800aa2-d290-6b83-3585-a2579b17ebdd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51871/ffbf7e7b-a780-95a2-ed05-cbc2c9b83f90.png)

そして、なぜか`??.txt`を削除できなくなりました。もう一度`𩸽.txt`をデバイスにコピーして、エクスプローラの表示を更新せずに`𩸽.txt`を削除すると、削除できなかった`??.txt`が削除されました（`𩸽.txt`も削除された）。

Windows（のNFSクライアント）では、ファイルインタフェース利用時に日本語のファイル名を使用できないのは注意点です。

### 【補足2】ETagのMD5ダイジェスト
ファイルインタフェースでファイルコピーしたファイルは属性値が付与されます。`ETag`にはMD5ダイジェストが付与されますが、一定サイズを超えるファイルの`ETag`の形式は、マルチパートアップロード時と同様に`MD5ダイジェスト-チャンク数`となります。

マルチパートアップロードが適用される閾値を二分木探索で探ってみたところ、`6,291,433`バイトでした。

```
        {
            "Key": "6291432B.bin",
            "LastModified": "2020-11-13T11:16:01.536Z",
            "ETag": "\"d5decd733aebd2c6d10e894b7820b30c\"",
            "Size": 6291432
        },
        {
            "Key": "6291433B.bin",
            "LastModified": "2020-11-13T11:16:01.645Z",
            "ETag": "\"776a1df683a4436d6271a74b42ea57d9-2\"",
            "Size": 6291433
        },
```

では、チャンクサイズはいくつか？ということで、ファイルサイズを変えて実験してみました。

|ファイルサイズ|チャンク数|チャンクサイズ|
|:--|:--|:--|
|1GB|171|約6MB|
|1.5GB|210|約7.3MB|
|2GB|220|約9.3MB|
|5GB|277|約18.5MB|
|10GB|371|約27.6MB|

…どうやらチャンクサイズは固定ではないようです。

しかも、S3へインポート後のETagの値を確認すると、デバイス内にある時の値とは異なっているケースがありました。ファイルコンテンツは全く同じなのに。

* デバイスでのETag　… `d5decd733aebd2c6d10e894b7820b30`
* S3のバケットへインポート後のETag　…　`828852475ee270da8a8a31e0f9809fc8-1`

デバイスからS3のバケットへのインポートではStrageGatewayが使われているようですが（根拠はバケット内のファイルのメタデータ）、StrageGatewayのマルチパートアップロードの閾値は、SnowballEdgeのファイルインタフェースでのマルチパートアップロードの閾値が違うなど、あるのかもしれません。

いずれにせよ、ファイルインタフェースで転送されたファイルのETagはあてにしてはいけないようです。

### 【補足3】ストレージの空き容量

開発者ガイドにもあるように、SnowballEdgeのストレージ容量超えないように注意する必要がありますが、ストレージの空きサイズをエクスプローラで確認しても、いつまでも0バイトのままです。デバイスのLCDパネルで確認するしかありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51871/c63014fa-411c-adb6-5be5-ef178c6781a1.png)


## デバイスの返送
西濃運輸さんのWebサイトの集荷依頼のページから配送を依頼します。
https://track.seino.co.jp/CallCenterPlusOpen/PickupOpen.do

注意点ですが、配送時と同様、配送業者さん（西濃シェンカー）の担当営業所が土日祝日の集荷に対応してない場合があります。ネット上では「日時指定の場合は土日祝日も対応してくれる」との情報がありましたが、私の担当営業所は日時指定の場合でも土日祝日は集荷業務をされていないようでした。ご注意下さい。

## S3へのインポート完了後

インポート完了後、Snowballジョブダッシュボードから、以下のファイルがダウンロードできるようになります。

* ジョブレポート
* 成功ログ、失敗ログ

### 1. ジョブレポート（PDF形式）

ジョブレポートには、インポートに成功した（または失敗した）ファイル数と合計サイズ、ジョブのタイムラインが記載されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51871/35c70ed6-1811-e787-093c-48a516d5b20e.png)

日時はUTCで表記されています（「EST」（米国東部標準時）と表記されてますが、おそらく誤りです。EST+14時間=JSTなので、UTCでないと辻褄が合いません）。

### 2. 成功ログ、失敗ログ（CSV形式）

成功ログ・失敗ログは、バケットへのインポートに成功したファイル、失敗したファイルが記録されたテキストファイルです（情報は、バケット名・オブジェクトキー名・バイトサイズ）。

* ファイルのエンコーディング方式は`UTF-8`（BOMなし）、改行コードは`LF`です。
* エントリが0件の場合、ヘッダ行もフッタ行も存在しない、0バイトの空ファイルとなります。

```:成功ログ・失敗ログ（サンプル）
"S3 Transfer Results Begin"
"Bucket Name","S3 Key","Size"
"yz2cm-tokyo-snowball","foo.txt","4"
"yz2cm-tokyo-snowball","bar/あああ.txt","9"
"yz2cm-tokyo-snowball","fizz.txt","6"
"yz2cm-tokyo-snowball","bazz.txt","0"
"S3 Transfer Results End"
```

### 3. メタデータ
ファイルインタフェースでデバイスにファイル転送したファイルについて、S3へインポート後のキーオブジェクトには以下のメタデータが付与されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51871/3b459474-4526-9c5a-053c-bd576d311271.png)

比較対象として、AWS CLIでデバイスにファイル転送したファイルについて、S3へインポートした後のメタデータを以下に示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51871/c0334498-2ebe-3a7d-b6f8-d3f039fc6e73.png)

## 利用料金（実績）
今回のSnowball利用のコストは、合計420ドル（送料込み）でした。

以下は、2020年11月時点の状況です。

* 東京リージョンでは、到着日と発送日を除く10日間のデバイス保有で300ドル（送料別）です。10日間を超えると、1日30ドルの追加料金が発生します。
* 上記に加えて、往復の配送料120ドルが請求されます（地域によって異なるかもしれません）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51871/caba3104-09bf-d44f-85ed-3019ff78303b.png)


## おわりに
これでおわりです。世界中のSnowballユーザーに幸あれ。