0
0

More than 1 year has passed since last update.

Oracle Analytics CloudとFunctionsの連携 - OACからデータセットを定期的にObject Storageに書き出す方法

Posted at

資料の紹介

OACでは、セキュリティ上の懸念とファイル・システムへのアクセスの制限により、カスタム関数を直接実行することはできません。 OCI Functions統合により、OACのデータフローからカスタム・スクリプトを実行することが可能になります。

この記事では、OACにFunctionsを登録します。データ・フローで定期的にFunctionsを呼び出し、OACのデータ・セットをObject Storageに書き出す方法を紹介します。
現在では、保存するデータ・セットはCSVフォーマットしかサポートしておりません。

ソースコードの紹介

Functionsには以下の3つのファイルがあります。

  • func.yaml
    名前、バージョン、エントリポイント、メモリなどのFunctionsに必要なパラメータを定義します。このファイルはFunctionsを作成するとき、自動的に生成されます。特に修正する必要がありません。
  • requirements.txt
    Functionsで使用されるライブラリのリストを含めます。
  • func.py
    関数ロジックは、func.pyのハンドラー関数で記述されています。

func.pyの一部(functionsの定義)

func.py
funcDefinition = {
    "status": {
        "returnCode": 0,
        "errorMessage": ""
    },
    "funcDescription": {
        "outputs": [  //OACの出力結果を定義、保存が成功であることを出力結果とする
            {"name": "save_result", "dataType": "varchar(100)"}
        ],
        "parameters": [ //入力パラメータの指定、保存するデータ・セットの名前を入力
            {"name": "title", "displayName": "Title Column",
             "description": "Specify Title for Dataset", "required": True,
             "value": {"type": "string"}}
        ],
        "bucketName": "bucket-ivy-FAAS",  //入力と出力ファイルを格納するバケットの指定
        "isOutputJoinableWithInput": False  //処理結果を入力データと結合しないことを指定
    }
}

func.pyの一部(ファイルの読み込み、処理、出力)

func.py
//データフローが実行されると、OACは、カスタム・スクリプトノードの適用の前に入力CSVファイルを作成、バケット・ストレージにアップロード
//ここで、入力CSVファイルを読み込む
input_csv_path = read_from_objectstore(bucketName, fileName)
dat = pd.read_csv(input_csv_path, sep=",", quotechar="\"", encoding="utf-8", parse_dates=True, infer_datetime_format=True)

//保存先のバケットを指定
//入力CSVファイルのrow_id列を削除
//入力CSVファイルを指定したバケット・ストレージに格納
bucketName1 = "bucket-ivy01-FAAS"
dt = datetime.datetime.now()
s = dt.strftime("%Y-%m-%d %H:%M:%S")
output_dat1 = dat.drop(["row_id"], axis=1)
outputFile1 = body.get("output").get("fileName") + body.get("output").get("fileExtension")
output_csv_path1 = "/tmp/" + outputFile1
output_dat1.to_csv(output_csv_path1, index=False )
dstitle = args.get("title")
tt_outputFile = dstitle+s+ ".csv"
write_to_objectstore(bucketName1, tt_outputFile, output_csv_path1)

//出力CSVファイルを作成し、バケット・パケットにアップロード
dat2 = dat.head(1)
output_dat = pd.DataFrame(np.vectorize(save_result)(dat2["row_id"]), columns =['save_result'])
outputFile = body.get("output").get("fileName") + body.get("output").get("fileExtension")
output_csv_path  = "/tmp/"+outputFile
output_dat.to_csv(output_csv_path, index=False)
write_to_objectstore(bucketName, outputFile, output_csv_path)

バケットの作成

Functionsが必要とするバケットを作成します。

  • OCIコンソールのバケット作成画面で、「バケットの作成」をクリック
  • Functions用のバケット名を指定し、「作成」をクリック
    01.png

OACデータセットを保存するバケットを作成します。OACのデータセットは、Functionsの入力として使用するために、バケット・ストレージにアップロードされます。 また、Functionsによって処理された出力CSVファイルもバケット・ストレージにアップロードされます。

  • OCIコンソールのバケット作成画面で、「バケットの作成」をクリック
  • OACデータセット用のバケット名を指定し、「作成」をクリック
    02.png

リポジトリの作成

Functionsのソースコードを格納するリポジトリを作成します。

  • OCIコンソールで「開発者サービス」→「コンテナ・レジストリ」をクリック
    03.png

  • 一覧画面で「リポジトリの作成」をクリック
    4.png

  • リポジトリ名を入力し、「リポジトリの作成」をクリック
    リポジトリ名は「アプリケーション名/ファンクション名」で作成してください。
    5.png

認証トークンの作成

後ほど、Cloud Shellに登録し、Functionsをデプロイします。ここで、Cloud Shellに登録するユーザーの認証トークンを生成します。

  • OCIコンソールの右上の「プロファイル」メニューを開き、「ユーザー設定」をクリック
    6.png
  • ユーザーの詳細画面で、「認証トークン」→「トークンの生成」をクリック
    7.png
  • 説明を入力、「トークンの生成」をクリック
    8.png
  • 生成したトークンをコピーし、「閉じる」をクリック
    9.png

アプリケーションの作成

Functionsのアプリケーションを作成します。

  • OCIコンソールで「開発者サービス」→「アプリケーション」をクリック
    10.png
  • アプリケーションの一覧画面で、「アプリケーションの作成」をクリック
    11.png
  • アプリケーション名を入力、VCNとサブネットを選択、「作成」をクリック
    12.png

アプリケーションのデプロイ

Cloud Shellでアプリケーションの環境を構築し、デプロイします。

  • アプリケーションの詳細画面で、「スタート・ガイド」を選択
    13.png
  • 「Cloud Shellの起動」をクリック
  • Step②、③のコマンドをコピーし、Cloud Shellウィンドウに貼り付けて、実行
    14.png
  • Step④の[repo-name-prefix]をFunctionsのアプリケーション名に変更して、Cloud Shellウィンドウに貼り付けて、実行
  • Step⑥のコマンドをコピーし、Cloud Shellウィンドウに貼り付けて、実行
    パスワードは前で生成したトークンを使用
  • Step⑦のコマンドをコピーし、Cloud Shellウィンドウに貼り付けて、実行
    15.png
  • Cloud Shellウィンドウで以下のコマンドを実行し、環境を設定
fn init --runtime python <Functions名>
  • 「アップロード」をクリック、ソースコードfunc.pyとrequirements.txtをアップロード
    func.pyのダウンロード
    requirements.txtのダウンロード
    16.png

  • Cloud Shellウィンドウでコマンドを実行し、ソースコードをFunctionsのフォルダに移動

  • Functionsのディレクトリに切り替え、アプリケーションをデプロイ

mv func.py requirements.txt ./<Functions名>
cd  <Functions名>
fn -v deploy --app <アプリケーション名>

OACタグの追加

FunctionsがOACで利用するために、OACタグを追加する必要があります。

  • Functions名をクリック、Functionsの詳細画面に移動
  • Functionsの詳細画面で「タグの追加」をクリック

17.png

  • タグ・ネームスペースで「なし(フリーフォーム・タグの追加)」を選択
  • タグ・キーに「oac-compatible」、タグ値に「true」を入力
  • 「タグの追加」をクリック
    18.png

OCIリソース接続の作成

OCI リソースへの接続情報を確認します。

  • OCIコンソールの右上のユーザーのプロファイル・メニューをクリック
  • 「テナンシ」をクリックし、テナンシOCIDをコピー
  • 「ユーザー設定」をクリックし、ユーザーのOCIDをコピー
    19.png
  • テナンシOCIDをコピー
    20.png
  • ユーザーのOCIDをコピー
    21.png

OACでOCI リソースへの接続を作成します。

  • OACコンソールで「作成」→「接続」をクリック
  • 接続タイプ「OCI Resource」を選択
    22.png
  • 接続名を入力
  • Functions所属のリージョンを選択
  • Functions所属のテナンシOCIDを入力
  • FunctionsにアクセスするユーザーのOCIDを入力
  • APIキーの「生成」をクリック、コピー
    24.png

OACで生成したAPIキーを追加します。

  • ユーザーのプロファイル・メニューをクリック、「ユーザー設定」をクリック
  • 「APIキー」を選択、「APIキーの追加」をクリック
    25.png
  • 「公開キーの貼り付け」を選択
  • OACで生成したAPIキーを貼り付け
  • 「追加」をクリック
    27.png

Functionsの登録

作成したFunctionsをスクリプトとして、OACに登録します。

  • OCIリソースへの接続作成画面で、「保存」をクリック
    28.png

  • メニュー・アイコン→「モデル/関数の登録」→「OCI関数」をクリック

  • 作成したOCIリソースへの接続を選択
    29.png

  • 作成したアプリケーションを選択
    31.png

  • 作成したFunctionsを選択
    32.png

  • Functionsの情報が右側に表示され、「登録」をクリック
    33.png

登録したFunctionsの詳細を確認します。

  • 「機械学習」→「スクリプト」を選択

  • 登録したFunctionsのアクション・メニューをクリック、「検査」を選択
    34.png

  • Functionsの詳細情報が正しいことを確認
    36.png

データ・フローの作成

Functionsを呼び出すOACデータ・フローを作成します。

  • OACの「作成」をクリック

  • 「データ・フロー」をクリック
    37.png

  • 保存するデータ・セットを追加

  • 「カスタム・スクリプトの適用」を追加
    38.png

  • 登録したFunctionsを選択

  • 「OK」をクリック
    39.png

  • 保存するデータ・セットの名前を入力
    40.png

  • 「データの保存」を追加

  • 結果データ・セットの名前を入力

  • 保存結果を確認
    41.png

  • データ・フローの「別名保存」をクリック

  • データ・フローの名前を入力、「OK」をクリック
    43.png

  • データ・フローのアクション・メニューをクリック、「新規スケジュール」を選択

  • 必要な情報を入力、「OK」をクリック
    44.png

保存結果の確認

Object Storageで格納したデータ・セットを確認します。
45.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0