boto3を使用したSPSS Modeler上でのS3への出力方法について

## 目的
SPSS ModelerではAthena経由での読み取りのみがサポートされています。
https://www.ibm.com/docs/ja/spss-modeler/18.4.0?topic=guide-whats-new-in-version-1840
ここでは拡張の出力ノード内でboto3ライブラリを使用して、SPSS ModelerからS3へ書き込みを行う方法をまとめました。

## boto3とは
boto3とはAWSのサービスをPythonから操作するための公式ライブラリです。
このライブラリを使うことで、AWSのクラウドサービスをプログラムで制御・管理できます。
https://aws.amazon.com/jp/sdk-for-python/

## 対象読者
・普段の業務でSPSS Modeler 18.5を使用しているデータ分析初級者～中級者の方
・データ加工をSPSS Modeler 18.5で行っていて、今後ファイルの保存先にAWS環境を検討されている方
・今後SPSS Modeler 18.5の導入を検討されている方

## 目次
- [1章 AWS環境の設定内容について](#1章-aws環境の設定内容について)
- [2章 SPSS Modeler環境の設定内容について](#2章-spss-modeler環境の設定内容について)
- [3章 S3への出力方法について](#3章-s3への出力方法について)
- [4章 セキュリティ面の向上について](#4章-セキュリティ面の向上について)

### 1章 AWS環境の設定内容について

#### アカウントの作成

ここでは以下のポリシーを割り当てたIAMユーザーを作成します。
・AmazonAthenaFullAccess
・AmazonS3FullAccess

次にセキュリティ認証情報タブからアクセスキーとシークレットキーを取得します。
始めて作成される際には以下の記事が参考になると思います。
https://qiita.com/raimu_hosoda/items/24b587fe44ced5262722

＊セキュリティリスクにつながりますので、アクセスキーとシークレットキーの管理は適切に行う必要があります。

#### S3バケットの作成
今回の出力バケットとフォルダを作成しましょう。
ここではspsstos3バケットとspsstos3test1フォルダを作成しています。
名前については任意で構いません。

![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971791/0ab7422e-880f-3518-ef04-f95e9c0f6474.png)

### 2章 SPSS Modeler環境の設定内容について

#### 各種ライブラリのインストール
ライブラリをインストールするPythonのパスはoptions.cfgに記載されています。
options.cfgは以下のディレクトリにあります。
C:\Program Files\IBM\SPSS\Modeler\18.5\config

options.cfg内のeas_pyspark_python_pathのパスを指定して、ライブラリをインストールしていきましょう。
```
# Set to the full path to the python executable (including the executable name) to enable use of PySpark.
eas_pyspark_python_path, "C:/Program Files/IBM/SPSS/Modeler/18.5/python_venv/Scripts/python.exe"
```

ここでは冒頭でご紹介したboto3とPythonアプリケーションで環境変数を管理するためのpython-dotenvをインストールしましょう。

```bash
"C:/Program Files/IBM/SPSS/Modeler/18.5/python_venv/Scripts/python.exe" -m pip install boto3
```

```bash
"C:/Program Files/IBM/SPSS/Modeler/18.5/python_venv/Scripts/python.exe" -m pip install python-dotenv
```

### 3章 S3への出力方法について
SPSS Modelerで読み込んだcsvファイルをS3へ出力してみましょう。

ここではSPSS Modelerをインストールした際に付属されている健康状態に関する「DRUG1n」というファイルを使用します。
パスは"C:\Program Files\IBM\SPSS\Modeler\18.5\Demos\DRUG1n"です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971791/9c45b716-259a-1cf5-a320-a1de82642938.png)

次に、出力パレットにある拡張の出力ノードをキャンバスに追加してリンクしてください。
ここではストリームを実行した際の出力を確認するために拡張のエクスポートノードではなく、出力ノードを使用しています。
python syntax内にスクリプトを記述していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971791/1d8164be-fbc9-205a-5999-050c19192882.png)

#### boto3でのアップロードについて
以下がboto3を使用してS3へアップロードする方法の例です。

aws_access_key_idとaws_secret_access_keyにはそれぞれ1章で作成したアクセスキーとシークレットキーを指定し、region_nameにはバケットを作成したリージョンを指定します。
```py
import boto3

client = boto3.client(
's3',
aws_access_key_id='○○',
aws_secret_access_key='○○',
region_name='○○'
)

client.upload_file(FileName, Bucket, Key)
```
下記が公式ドキュメントになります。
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/client/upload_file.html

#### Python Syntax内のスクリプトについて

SPSS Modeler内でpythonを実行するためにmodelerpyというライブラリが準備されています。
詳しくはこちらを参照してください。
https://www.ibm.com/docs/ja/spss-modeler/18.5.0?topic=spark-native-python-apis

ここではSPSS Modelerで読み込んでいるcsvファイルを一時ファイルに変換してから、s3へ出力する流れを想定します。
```py
import modelerpy
import boto3
import os
#モデラーのデータ取得
modelerData = modelerpy.readPandasDataframe()

#一時ファイルへの書き出し
temp_file = "tempfile.csv"
modelerData.to_csv(temp_file, index=False)

#s3へのアップロード情報について
client = boto3.client(
's3',
aws_access_key_id='○○',
aws_secret_access_key='○○',
region_name='○○'
)

#s3へのアップロード
try:
    client.upload_file(temp_file, 'spsstos3', 'spsstos3test1/DRUG1n.csv')
    print("File successfully uploaded")
except Exception as e:
    print(f"File upload failed: {e}")
finally:
#一時ファイルを削除
    os.remove(temp_file)
```

ノードを実行し、「File successfully uploaded」と出力されれば成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971791/6fec0107-663f-1db6-d7d2-65ed74d9da76.png)

1章で作成したS3内のフォルダへアップロードされていることも確認します。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971791/0d242326-f05d-00bb-39a5-185f3fb53cca.png)

### 4章 セキュリティ面の向上について

2章でインストールしたpython-dotenvを活用して、セキュリティ面の向上を図ります。
python-dotenvは.envファイルを作成することでアプリケーションに必要な設定を環境変数として管理することができます。
ここでは3章で直接スクリプト内に書き込んでいた、アクセスキー、シークレットキー、リージョンの情報を外部ファイルへ分離させることでセキュリティリスクの軽減を図ります。
下記のような形のファイルを作成し、.envという名前で任意の場所へ保存してください。
ここでは"C:\Program Files\IBM\SPSS\Modeler\18.5"に保存しています。



```tex
AWS_ACCESS_KEY_ID='○○'
AWS_SECRET_ACCESS_KEY='○○'
AWS_REGION='○○'
```
作成した.envファイルを使用してPython Syntax内のコードを改善してみましょう。
load_dotenv()を追加し、先ほど作成した.envファイルを読み込むことでアップロード情報として記載する引数をS3のみにすることが出来ます。

```py
import modelerpy
import boto3
import os
from dotenv import load_dotenv

#モデラーのデータ取得
modelerData = modelerpy.readPandasDataframe()

#一時ファイルへの書き出し
temp_file = "tempfile.csv"
modelerData.to_csv(temp_file, index=False)

load_dotenv()

#s3へのアップロード情報について
client = boto3.client('s3')

#s3へのアップロード
try:
    client.upload_file(temp_file, 'spsstos3', 'spsstos3test1/Drung1n2.csv')
    print("File successfully uploaded")
except Exception as e:
    print(f"File upload failed: {e}")
finally:
#一時ファイルを削除
    os.remove(temp_file)
```
先ほどと同様にノードを実行するとS3へ出力されます。

![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971791/e1d9cb28-f96c-ca15-f42f-cd59fd5d9115.png)


## あとがき
拡張の出力ノード内boto3を使用することでSPSS ModelerからS3へ書き込みを行うことが確認できました。
次回は今回の設定を生かした上で、S3へparquetファイルを出力し、Athenaのバージョニング機能を使用した上でSPSS Modelerにデータを読み込む方法をご紹介します。