Aspera Transfer SDKを使ってIBM Cloud Object Storage (ICOS) へ高速転送を実現する


# はじめに

この記事では、Aspera Transfer SDKを使ってIBM Cloud Object Storage (ICOS) へサイズの大きなファイルを高速に転送する方法を説明します。


# Why Aspera?

ICOSへファイルをアップロードする際に、一番簡単のやり方はIBM Cloud Portalの画面で**Upload**ボタンをクリックして、**Standard transfer**を使うことです。そうすると、裏でHttp/TCPのPUT operationが行われています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/3771d18c-9abe-9b2f-669a-c4254051ef5f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/e8854c20-d891-c163-7f49-3a262a8fab01.png)

ただし、数GBや数十GBほど大きなファイルを転送する際に、IBM CloudはAsperaのお使いをお勧めします。

Asperaは高速でセキュアなファイル転送ソリューションです。 Asperaの最も重要な技術的な要素であるFASPは、TCPをベースにした独自のプロトコルであり、最適化されたデータ転送アルゴリズムを使用しています。これにより、ネットワークの帯域幅や遅延に影響を受けにくくなり、大容量のファイルを高速かつ安定して転送できます。

IBM Cloud Portalの画面で、**Aspera High-speed transfer**を選択したら、簡単にAsperaでファイアをアップロードすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/6213d0cc-c3f4-b043-52c5-b75f481148fb.png)

**注：**　初めて利用する際に、Browserに出る提示に従って、Client Software**IBM Aspera Client**をInstallする必要があります。詳細の手順はこちらの記事でご参照ください：[IBM Cloud : SafariブラウザにCOSへのアップロード用のAspera機能拡張を追加](https://qiita.com/c_u/items/4922989da8c603642237)。

# Why Aspera Transfer SDK?
 
IBM Cloud Portalで簡単にAspera利用できますが、Program CodeやScriptでデータ転送するニーズも存在しています。特に、毎日定時にICOSへデータ格納しようなどのユースケースには、PortalでのGUI操作を自動化することが難しいです。その場合には、Aspera Transfer SDKやAspera CLIの登場が必要です。

本記事は、Aspera Transfer SDKの使い方を説明します。
Aspera CLIの使い方はこちらの記事（[Aspera CLIを使ってIBM Cloud Object Storage (ICOS) へ高速転送を実現する](https://qiita.com/xiaojinse/items/0328515d5b09e4bca58b)）にご参照ください。

# Let's try Aspera Transfer SDK

全体の流れは、次の通りになります：

1. PCでAspera Transfer SDKをInstall
2. IBM CloudでICOS BucketとAsperaの情報を確認
3. PCでFileをUpload
4. IBM CloudでUploadしたFileを確認


## 1. 　PCでAspera Transfer SDKをInstall

Aspera Transfer SDKはIBM WebsiteでDownloadします。[Aspera Download](https://www.ibm.com/products/aspera/downloads)のページで**IBM Aspera Transfer SDK**のブロックをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/a30c84a8-825d-110e-f82a-6d023235746a.png)

次の画面で、左側の**Download**メニューをクリックして、右側にPCのOSに応じてInstall FileをDownloadします。
私のPCはWindowsなので、**windows-amd64-52a85ef.zip**をDownloadしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/7820291f-5142-f60b-4e37-81f3a9f2e0d1.png)

Aspera Transfer SDKの仕組みはかなり簡単です。下記の図のように、PCでTransfer SDKのProcessを起動したら、Program CodeはSDK Processを経由で転送することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/24e9f77e-2cfb-3a21-8fe1-1deffcffa779.png)

Windows PCなら、まずはDownloadした.zip Fileを解凍して、**\bin** subfolderに見える**asperatransferd.exe** fileはTransfer SDKであります。

```ctr:Windows CMD
C:\temp\windows-amd64\bin>dir
 Volume in drive C is Windows
 Volume Serial Number is 94E2-EDBC

 Directory of C:\temp\windows-amd64\bin

06/30/2023  10:28 PM    <DIR>          .
06/30/2023  10:28 PM    <DIR>          ..
05/15/2023  05:20 PM        17,496,064 asperatransferd.exe
               1 File(s)     17,496,064 bytes
               2 Dir(s)  33,628,905,472 bytes free

C:\temp\windows-amd64\bin>
```
このasperatransferd.exeはWindowsのInstall Procedureがないまま、すぐに起動できます。

```ctr:Windows CMD
C:\temp\windows-amd64\bin>start asperatransferd.exe
```
`start asperatransferd.exe`が実行すると、次のようなTransfer SDK Process画面がpopupします。特に、Processが利用しているPort Noにご留意ください。私の画面でDefaultのPort No 55002を利用しました。この画面をそのままでしてください。画面をCloseすると、Processが停止します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/f62ffcf6-d745-a4b0-e77a-24c28c88d013.png)

**注：**　asperatransferd.exeはWindows CMDより起動することが必須です。
Window GUIでasperatransferd.exeをクリックして実行してみたら、下記のようなエラーが出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/2b463228-7ddc-c9d0-887c-2d050838f011.png)

では、続きましてProgram Codeを準備しましょう。Aspera Transfer SDK は、Java、Python、Ruby、Node.js、Go、C++、C#をサポートしています。今回はPythonのやり方を試しました。

PythonのSample CodeはAspera Transfer SDKのDownload Siteで提供されてます。こちらの[リンク先](https://developer.ibm.com/apis/catalog/aspera--aspera-transfer-sdk/Quick%20Start%20for%20Sample%20Code:%20Python)にご参照までに。

また、ICOSのDocにもSample Codeが記載された。こちらの[リンク先](https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-aspera#aspera-transfer-sdk)にご参照までに。

私は両方とも参考しながら、最後に下記のようなCodeを用意しました。

```ctr:Jupyter Notebook  / Python 3
import grpc
import json
import os.path
import transfer_pb2 as transfer_manager
import transfer_pb2_grpc as transfer_manager_grpc

def run():
    # create a connection to the transfer manager daemon
    client = transfer_manager_grpc.TransferServiceStub(grpc.insecure_channel('localhost:xxxxxx'))

    file_path = "xxxxxx"

    # create transfer spec
    transfer_spec = {
        "session_initiation": {
            "icos": {
                "api_key": "xxxxxx",
                "bucket": "xxxxxx",
                "ibm_service_instance_id": "xxxxxx",
                "ibm_service_endpoint": "xxxxxx"         
            }
        },
        "direction": "send",
        "remote_host": "xxxxxx",
        "title": "strategic",
        "assets": {
            "destination_root": "xxxxxx",
            "paths": [
                {
                    "source": file_path
                }
            ]
        }
    }
    transfer_spec = json.dumps(transfer_spec)

    # create a transfer request
    transfer_request = transfer_manager.TransferRequest(
        transferType=transfer_manager.FILE_REGULAR,
        config=transfer_manager.TransferConfig(),
        transferSpec=transfer_spec)

    # send start transfer request to transfer manager daemon
    transfer_response = client.StartTransfer(transfer_request)
    transfer_id = transfer_response.transferId
    print("transfer started with id {0}".format(transfer_id))

    # monitor transfer status
    for transfer_info in client.MonitorTransfers(
            transfer_manager.RegistrationRequest(
                filters=[transfer_manager.RegistrationFilter(
                    transferId=[transfer_id]
                )])):
        print("transfer info {0}".format(transfer_info))

        # check transfer status in response, and exit if it's done
        status = transfer_info.status
        if status == transfer_manager.FAILED or status == transfer_manager.COMPLETED:
            print("finished {0}".format(status))
            break

if __name__ == '__main__':
    run()

```
少し長いCodeになりますが、８つの**xxxxxx**に表示されたVariableは自分の環境に応じて設定する必要があります。

## 2.　IBM CloudでICOS BucketとAsperaの情報を確認

このステップでは、Program Codeに**xxxxxx**に表示されたVariableの正しいValueを確認しておきましょう。

‐　    client = transfer_manager_grpc.TransferServiceStub(grpc.insecure_channel('localhost:**xxxxxx**'))：　Transfer SDK ProcessのPort Noです。前に説明した通り、私の環境にはPort 55002を使ってます。
```ctr:Jupyter Notebook  / Python 3
 client = transfer_manager_grpc.TransferServiceStub(grpc.insecure_channel('localhost:55002'))
```

‐　   "ibm_service_endpoint": "**xxxxxx**" 　：本IBM Cloud RegionのICOS Service Public Endpointです。先頭に**Https://**が必要ということをご注意ください。  
‐　   "ibm_service_instance_id": "**xxxxxx**"　：ICOS Service InstanceのCRNです。
‐　   "bucket": "**xxxxxx**"　：ICOS BucketのFull nameです。
‐　   "api_key": "**xxxxxx**"　：ICOS Accessために、API Keyが必要です。
以上の４つのVariableは、IBM Cloud Portalで確認できます。
情報保護のため、下記のSampleでapi_keyの一部はxxxにしました。

```ctr:Jupyter Notebook  / Python 3
                "api_key": "BwGr1FSwTtiTvtdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
                "bucket": "testbucket-qitta",
                "ibm_service_instance_id": "crn:v1:bluemix:public:cloud-object-storage:global:a/039dbe6794084c7cb514a276dd2345da:73ac0d0d-6c81-4e26-9645-50e988329b95::",
                "ibm_service_endpoint": "https://s3.jp-tok.cloud-object-storage.appdomain.cloud"
```

‐　   "remote_host": "**xxxxxx**"　　：本IBM Cloud RegionのICOS用Aspera ServerのHost Infoです。

```ctr:Jupyter Notebook  / Python 3
        "remote_host": "https://ats-sl-tok.aspera.io:443",
```

‐　      file_path = "**xxxxxx**"　　：転送FileのOS Full Pathです。
‐　      "destination_root": "**xxxxxx**"　　：ICOS側で転送下Fileの保存Folder Pathです。
情報保護のため、下記のSampleでfile_pathの一部はxxxにしました。
```ctr:Jupyter Notebook  / Python 3
    file_path = "C:/Users/xxx/xxx/00_Jupyter/AsperaTesting/99.jpg"
....
            "destination_root": "/testfolder/98.jpg",
```
その以外のVariableは変更しなくて、Defaultのままにします。

## 3.　PCでFileをUpload

Step 2の設定で、Python Codeを実行します。私の環境には、Jupyterの**Run**ボタンをクリックすることになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/48074166-6dc9-63a3-466a-b02713fd0a90.png)

すぐにJupyterの画面で実行結果を見えます。結構長いです、全部をここで表示することが必要ないと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/a44a0ba0-ef9f-c542-f20e-34e4c237dcd4.png)

Transfer SDK Processの画面でも長い出力が見えます。ほぼ同じな内容で、ここでスクショを割愛しました。



## 4.　IBM CloudでUploadしたFileを確認

IBM Cloud PortalでICOS BucketをCheckすると、次のようにUploadしたFileが見えました。
File NameはPC側の99.jpgではなく、destination_rootに設定された98.jpgになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/e55ddd64-0e82-ea07-e387-988e49c44610.png)



# 料金については
- まずは、Aspera Softwareは有料なのか、無料なのか

Aspera のソリューションは多くの機能を提供していて、各機能に対して複数のコンポーネントがあります。

今回検討したICOSへ転送するためのコンポーネント（IBM Aspera Connect, IBM Aspera Transfer SDK, IBM Aspera CLI）は、すべでは無料で利用できます。

- Asperaを使ったらICOSの料金は増えますか

Asperaを使ってICOSへアップロードする際に、特に料金が発生しません。
Asperaを使ってICOSからダウンロードする際に、ダウンロードしたファイルのStorage Classおよびデータ量に応じて料金が発生します。詳細料金はIBM Cloud Portalの[Object Storageの作成画面](ICOShttps://cloud.ibm.com/objectstorage/create#pricing)で確認できます。

ICOSを利用して現場のログ管理や監視映像を保存するなどのユースケースでは、データのアップロードの需要は大きく、データのダウンロードの需要は比較的に小さいです。この課金体制はとてもフレンドリーと思います。


# まとめに

以上は、Aspera Transfer SDKの使う方法を解説しました。
私の経験というと、ICOS関連のVariableの設定には一番時間がかかってしまいました。何度もテストを繰り返して、ようやく正しいパラメータの形式がわかりました。
本記事はご参考になれば幸いです。
ごコメントとご質問、大歓迎です。