AzCopyがAmazon S3→Azure Blobに対応したので試してみる

AzCopy v10(Preview)がリリースされて、Amazon S3からAzure Blobへのデータコピーができるようになったので実際に使ってみたいと思います。

# 前提
* Amazon S3バケットが作成されていること
* Azure Blob Storage コンテナーが作成されていること
* S3バケットへのRead権限を持ったIAMユーザが作成されていること

# 環境
* Microsoft Windows 1o Pro
* AzCopy 10.0.9-Preview

# AzCopyダウンロード
以下の公式ページよりダウンロードします。
[Download and install AzCopy](https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-v10#download-and-install-azcopy)

# 解凍＆配置
ダウンロードしてきたzipファイルを解凍し、azcopy.exeをPATHの通ったフォルダに配置します。
v10からはインストールが不要になってますね。

# AWSアクセスキー＆シークレットキー設定

* IAMユーザのアクセスキー、シークレットキーを設定します。

```
set AWS_ACCESS_KEY_ID=<your AWS access key>
set AWS_SECRET_ACCESS_KEY=<AWS secret access key>
```

# S3 to Blob (SASトークン使用)

* Azureポータルから転送先のBlobストレージを選び、[Shared Access Signature]を選択します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/e966f656-4251-4ee2-d713-4af6f8c1a461.png)

* 付与する権限を設定して、トークンを発行します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/ddf3bac4-c4b8-cb22-67a9-dcd4084429eb.png)

* SASトークンが発行されるのでメモしておく。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/10bfedf3-eb5f-a770-dd4a-0a8d43b63bcd.png)

* コマンドプロンプトより以下コマンドを実行します。  

```
azcopy cp "https://s3-ap-northeast-1.amazonaws.com/[バケット名]/[フォルダ名]/[オブジェクト名]" "https://[ストレージアカウント名].blob.core.windows.net/[コンテナー名][SASトークン]"
```

* Blobストレージに転送されていればOKです。

# S3 to Blob (OAuth認証使用)

* AzureポータルからBlobストレージのコンテナーにアクセスし、[アクセス制御(IAM)]を選択します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/dfb98e17-a142-4d14-eb09-48d395755069.png)

* [追加]を選択します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/93dc86a1-3548-1e22-b34f-a4d1638dd189.png)

* [ロールの割り当ての追加]を選択します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/c9f2c55c-bbee-d975-8492-7a39cbdd9830.png)

* 役割に[ストレージBLOBデータ共同作成者]を選び、Azure ADユーザに権限を与えます。サービスプリンシパルは対応していないので、ADユーザを選択するようにしてください。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/8bbb3073-850c-a690-7590-ed21061d729a.png)

* 次にAzure ADのディレクトリIDを調べます。AzureポータルからAzure ADを選択します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/425fc006-1c21-f696-aaf4-493700706883.png)

* [プロパティ]を選択し、[ディレクトリID]をメモします。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/8f9684a4-7d58-0a05-2d81-88efc18f5d85.png)

* AzCopyログインコマンドを実行します。

```
azcopy login --tenant-id=[テナントID]
```

* 以下のようなメッセージが出力されるので、ブラウザで```https://microsoft.com/devicelogin```を開き、コードを入力してAzureユーザでログインします。

```
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code ABCDEFGHR to authenticate.
```

* コマンドプロンプトより以下コマンドを実行します。今回はSASトークンは不要です。

```
azcopy cp "https://s3-ap-northeast-1.amazonaws.com/[バケット名]/[フォルダ名]/[オブジェクト名]" "https://[ストレージアカウント名].blob.core.windows.net/[コンテナー名]"
```

* Blobストレージに転送されていればOKです。

# S3バケット丸ごと転送

* S3バケットを指定することで、バケット丸ごと転送することもできます。  

```
azcopy cp "https://s3-ap-northeast-1.amazonaws.com/[バケット名]" "https://[ストレージアカウント名].blob.core.windows.net/[コンテナー名][SASトークン]" --recursive=true
```

# Blob to S3

* 残念ながら現時点では利用できないようです。エラーになりました。

```
failed to parse user input due to error: the inferred source/destination combination is currently not supported. Please post an issue on Github if support for this scenario is desired
```

# まとめ

まだプレビューですが、コマンドはシンプルで分かりやすいですね。
認証にストレージアカウントキーが使えないのと、OAuth認証は対話型のみ対応で、サービスプリンシパルを使った認証はできないという点に注意が必要です。