CP4DのWatson StudioのJupyterからICOSを操作する

CP4DのWatson StudioのJupyterからICOSを操作します。
CP4Dの接続オブジェクトからICOSへの接続情報を取得して、ibm_boto3で接続します。

- テスト環境
    - CP4D 4.0.4
    - ibm-watson-studio-lib 3.0.6
    - boto3                       1.17.46
    - botocore                    1.20.88
  
#1 接続オブジェクトのリストを取得
Watson StudioのプロジェクトにICOSのバケットへの接続オブジェクト（例：200322icosbucket）を登録しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/85d83501-90f3-8817-6665-cdb25dba3eb1.png)

接続オブジェクトにはICOSのバケットに接続するための情報が記録されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e748879b-ebee-779c-a8e1-b697b9b942ed.png)




ibm_watson_studio_libでPythonコードから接続オブジェクトにアクセスが可能です。
なお、資格情報としてJSON形式のまま入力すると、ibm_watson_studio_libでアクセスしにくいので、リソース・インスタンス ID、API 鍵、アクセス・キー、秘密鍵などを各入力欄に入力しておいてください。

https://www.ibm.com/docs/ja/cloud-paks/cp-data/4.0?topic=lib-watson-studio-python#get-conn-info

list_connectionsで接続オブジェクトのリストを得ることができます。

```python:接続オブジェクトのリスト
from ibm_watson_studio_lib import access_project_or_space
wslib = access_project_or_space()
#接続オブジェクトのリスト
assets=wslib.list_connections()
wslib.show(assets)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c58c5825-be48-69b5-f0f4-b518b6bcf7b3.png)

get_connectionで接続オブジェクトの設定を取得できます。api_key、resource_instance_id、bucketなどの情報が取れます。

```python:接続オブジェクトの情報を取得
connection_config=wslib.get_connection('200322icosbucket')
connection_config
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/bfa824a3-411f-7b9a-1d9b-9251d7d2de78.png)

#2 ICOSへの接続
ibm_boto3をAPIをつかってICOSへ接続します。

https://ibm.github.io/ibm-cos-sdk-python/reference/services/s3.html#client

```python:ICOS接続
from botocore.client import Config
import ibm_boto3

cosclient = ibm_boto3.client("s3",
    ibm_api_key_id=connection_config['api_key'],
    ibm_service_instance_id=connection_config['resource_instance_id'],
    ibm_auth_endpoint=connection_config['iam_url'],
    config=Config(signature_version="oauth"),
    endpoint_url='https://'+connection_config['url']
)
```

200322icosbucketの中には以下のようなオブジェクトが入っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/67605176-4761-40c0-99fe-e52e6caecbe6.png)

これをAPIで取得してみます。

```python:バケットのオブジェクトリストを取得
listobject=cosclient.list_objects(Bucket=connection_config['bucket'])
listobject['Contents']
```

```ouput:ouput
[{'Key': 'Cond4n_e.csv',
  'LastModified': datetime.datetime(2020, 4, 22, 6, 9, 45, 212000, tzinfo=tzlocal()),
  'ETag': '"a2f6827a0f9433a1d91520607747276b"',
  'Size': 134617,
  'StorageClass': 'STANDARD',
  'Owner': {'DisplayName': '52aa9e0c-0aa7-45e5-b231-1a65d1a57a1a',
   'ID': '52aa9e0c-0aa7-45e5-b231-1a65d1a57a1a'}},
 {'Key': 'Cond4n_e104.csv',
  'LastModified': datetime.datetime(2020, 4, 22, 6, 9, 43, 413000, tzinfo=tzlocal()),
  'ETag': '"fdb3803425be82d35c6ed178a14c4305"',
  'Size': 146,
  'StorageClass': 'STANDARD',
  'Owner': {'DisplayName': '52aa9e0c-0aa7-45e5-b231-1a65d1a57a1a',
   'ID': '52aa9e0c-0aa7-45e5-b231-1a65d1a57a1a'}},
-----以下略-----------
```

#3 ICOSからCSVのダウンロード

Cond4n_e104.csvをpandasに読み込んで、CSVとして出力します。

```python:csvのダウンロード
import pandas as pd
from io import StringIO
body=cosclient.get_object(Bucket=connection_config['bucket'],Key='Cond4n_e104.csv')['Body']
df=pd.read_csv(StringIO(body.read().decode('utf-8')))
df.to_csv('Cond4new.csv', index=False)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7d5e278e-4384-fbe4-3171-3a8c13fdd59e.png)

#4 ICOSへのCSVのアップロード
Cond4new.csvをICOSのBucketにアップロードします。

```python:csvのアップロード
cosclient.put_object(Bucket=connection_config['bucket'],
                     Key='Cond4new.csv', Body='Cond4new.csv')
```

ICOSのbucketにアップロードされました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e28ca812-af25-b13d-075e-b281a730344d.png)

# サンプルコード

https://github.com/hkwd/220201watsonstudio/blob/master/220201icostest/icostest.ipynb

# 参考
Watson Studio (Notebook)からICOSにアクセスする 

https://qiita.com/hirokuda/items/0ee5ab9de44d0ba7aa32