Oracle Cloud Infrastructure Data Scienceを使って、AWS Redshiftのデータにアクセスしてみる

#本記事の狙い
2020/2に、Oracle Cloud Infrastructure Data Science(OCI-Data Science)がリリースされました。
前回、OCI-Data ScienceからAWS S3上のファイルのデータにクエリしてみたので（[Qiita記事：Oracle Cloud Infrastructure Data Scienceを使って、OCI Object StorageとAWS S3のファイルデータにアクセスしてみる](https://qiita.com/maato/items/691452be9e4a5d63e4f9)）、本記事では、OCI-Data Scienceから、Pythonを使ってAWS Redshift上のデータにアクセスしてデータ取得する手順を、実施してみたいと思います。

#参考文献
###実施に参考になるリンク
- [Oracle Cloud Infrastructure Data Science（OCI-Data Science）を使ってみよう](https://community.oracle.com/docs/DOC-1036110)
- [OCI-Data Science 公式ドキュメント](https://docs.cloud.oracle.com/en-us/iaas/data-science/using/overview.htm)
- [Oracle Accelerated Data Science SDK (ADS) 公式ドキュメント](https://docs.cloud.oracle.com/en-us/iaas/tools/ads-sdk/latest/index.html)
- [Qiita記事：Redshiftをはじめて触ってみた！](https://qiita.com/macaroniSalad0141/items/c44509ead71d039d13a7)
- [Amazon Redshiftって何ができるの？AWSのデータウェアハウスサービスを解説](https://techblog.nhn-techorus.com/archives/8232)
- [Redshiftからデータ読み込んでpandasのデータフレームに入れる](http://exotic-manifold.hatenablog.com/entry/2017/12/22/185336)
- [Qiita記事：リモートのpython3(psycopg2)からubuntu16.04@AWSのpostgresqlに接続](https://qiita.com/rokusyou/items/b051d5f1382b76b39f64)


#手順
以下のような手順で実施します。
1.OCI-Data Scienceの設定
2.Redshiftを起動し、テーブル作成、データを登録
　2-1.Redshiftのクラスタ作成、起動
　2-2.Redshiftにテーブル作成、S3にファイルから、テーブルにデータを登録
3.OCI-Data ScienceからRedshiftのテーブルにアクセスする

###1.OCI-Data Scienceの設定
OCI-Data Scienceのノートブック環境を構築、初期設定をします。
上記参考文献の「Oracle Cloud Infrastructure Data Science（OCI-Data Science）を使ってみよう」を参考に下記を実施します。

・Oracle Cloudの基本的な設定の後に、ノートブック環境を構築します。
・**getting-started.ipynb**を使って、ノートブック環境（JupyerLab）の初期作業を行います。

###２.Redshiftを起動し、テーブル作成、データを登録
####2-1.Redshiftのクラスタ作成、起動
上記参考文献の「Qiita記事：Redshiftをはじめて触ってみた！」を参考にRedshiftクラスタを作成しました。

####2-2.Redshiftにテーブル作成、S3にファイルから、テーブルにデータを登録
今回は、上記参考文献の「Amazon Redshiftって何ができるの？AWSのデータウェアハウスサービスを解説」の” Amazon Redshiftを使ってみる”を参考に、**IAMロールの作成**、**Redshift上にテーブルを作成**、**S3上のcsvファイルからRedshift上のテーブルにデータを登録**、の手順でデータを登録しました。

今回は下記のテーブルを作成し、サンプルデータを登録しています。

```ｓｑｌ
CREATE TABLE PURCHASE_ITEM (
CUST_ID integer,
AGE integer,
MARRIED VARCHAR(4000),
ADDRESS VARCHAR(4000),
CHILD VARCHAR(4000),
OCCUPATION VARCHAR(4000),
LASTCONTACT VARCHAR(4000),
LASTCALL integer,
CONTACT integer,
CONTACT_BEFORE_CAMPAIGN integer,
Purchased VARCHAR(4000)
);
```

###3.OCI-Data ScienceからRedshiftのテーブルにアクセスする
では、実際に、OCI-Data ScienceからRedshiftのテーブルにアクセスしてみます。
今回は、上記参考文献の「Redshiftからデータ読み込んでpandasのデータフレームに入れる」のとおりに、`sqlalchemy-redshift`を利用します。

まず、モジュール**sqlalchemy-redshift**をインストールします。

```python
pip install sqlalchemy-redshift
```
次に必要なライブラリをインストールします。

```python
import redshift_sqlalchemy
from sqlalchemy import create_engine
```
Redshiftに接続します。

```python
engine = create_engine('{dialect}+{driver}://{user}:{pwd}@{url}:{port}/{db}'.format(
    dialect = 'redshift',
    driver = 'psycopg2',
    user='awsuser',　#Redshiftのユーザー名
    pwd ='XXXXXX',　#パスワード
    url='redshift-cluster-1.XXX.XXX.redshift.amazonaws.com', #Redshiftのクラスター画面のエンドポイント
    port=5439, #Redshiftのポート番号
    db='dev' #Redshiftのデータベース名
))
```
ここで下記のような**Connection timed out**エラーが発生しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/fd02ab64-61af-3fe3-7ed5-ccbd9e5fe5d2.png)

調べたところ、上記参考資料「リモートのpython3(psycopg2)からubuntu16.04@AWSのpostgresqlに接続」と同じようにみえるので、Redshiftの**VNCセキュリティグループのインバウンドルール**を下記のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/5ce68830-3f1e-aaee-29ab-42765eef0323.png)

＊今回は「0.0.0.0/0」を設定しましたが、実際の設定に関しては適切な値を設定してください。
＊ここらへん、あまり自信ないので間違っていたらご指摘ください。。

セキュリティグループを設定後は、正常に接続できました。

Redshift上のデータを読み込み、データフレームに入れます。

```python
import pandas as pd
redshift_data = pd.read_sql_query('SELECT * FROM PURCHASE_ITEM limit 100;', engine)
```
結果を確認してみます。

```python
redshift_data.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/9e07ab1e-2362-9374-b8cc-4c6cfab09ac9.png)

確かに、無事取得できました。

#終わりに
今回は、OCI-Data Scienceから、**sqlalchemy-redshift** を使って、AWS Redshift上のデータにアクセスしてみました。

これ以外にもう少しいい接続方法があるかもしれませんので、ぜひ試してみてください。（そして教えてください。。）

OCI-Data Scienceは、最大30日間300$分の無償クレジットが使える[Oracle Free Trial](https://www.oracle.com/jp/cloud/free/#free-cloud-trial)の、対象サービスですので、ぜひ実際に使ってみることをおすすめします。

#### Let's Enjoy Data Science!