資料の紹介
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の定義)
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の一部(ファイルの読み込み、処理、出力)
//データフローが実行されると、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が必要とするバケットを作成します。
OACデータセットを保存するバケットを作成します。OACのデータセットは、Functionsの入力として使用するために、バケット・ストレージにアップロードされます。 また、Functionsによって処理された出力CSVファイルもバケット・ストレージにアップロードされます。
リポジトリの作成
Functionsのソースコードを格納するリポジトリを作成します。
認証トークンの作成
後ほど、Cloud Shellに登録し、Functionsをデプロイします。ここで、Cloud Shellに登録するユーザーの認証トークンを生成します。
- OCIコンソールの右上の「プロファイル」メニューを開き、「ユーザー設定」をクリック
- ユーザーの詳細画面で、「認証トークン」→「トークンの生成」をクリック
- 説明を入力、「トークンの生成」をクリック
- 生成したトークンをコピーし、「閉じる」をクリック
アプリケーションの作成
Functionsのアプリケーションを作成します。
- OCIコンソールで「開発者サービス」→「アプリケーション」をクリック
- アプリケーションの一覧画面で、「アプリケーションの作成」をクリック
- アプリケーション名を入力、VCNとサブネットを選択、「作成」をクリック
アプリケーションのデプロイ
Cloud Shellでアプリケーションの環境を構築し、デプロイします。
- アプリケーションの詳細画面で、「スタート・ガイド」を選択
- 「Cloud Shellの起動」をクリック
- Step②、③のコマンドをコピーし、Cloud Shellウィンドウに貼り付けて、実行
- Step④の[repo-name-prefix]をFunctionsのアプリケーション名に変更して、Cloud Shellウィンドウに貼り付けて、実行
- Step⑥のコマンドをコピーし、Cloud Shellウィンドウに貼り付けて、実行
パスワードは前で生成したトークンを使用 - Step⑦のコマンドをコピーし、Cloud Shellウィンドウに貼り付けて、実行
- Cloud Shellウィンドウで以下のコマンドを実行し、環境を設定
fn init --runtime python <Functions名>
-
「アップロード」をクリック、ソースコードfunc.pyとrequirements.txtをアップロード
func.pyのダウンロード
requirements.txtのダウンロード
-
Cloud Shellウィンドウでコマンドを実行し、ソースコードをFunctionsのフォルダに移動
-
Functionsのディレクトリに切り替え、アプリケーションをデプロイ
mv func.py requirements.txt ./<Functions名>
cd <Functions名>
fn -v deploy --app <アプリケーション名>
OACタグの追加
FunctionsがOACで利用するために、OACタグを追加する必要があります。
- Functions名をクリック、Functionsの詳細画面に移動
- Functionsの詳細画面で「タグの追加」をクリック
OCIリソース接続の作成
OCI リソースへの接続情報を確認します。
- OCIコンソールの右上のユーザーのプロファイル・メニューをクリック
- 「テナンシ」をクリックし、テナンシOCIDをコピー
- 「ユーザー設定」をクリックし、ユーザーのOCIDをコピー
- テナンシOCIDをコピー
- ユーザーのOCIDをコピー
OACでOCI リソースへの接続を作成します。
- OACコンソールで「作成」→「接続」をクリック
- 接続タイプ「OCI Resource」を選択
- 接続名を入力
- Functions所属のリージョンを選択
- Functions所属のテナンシOCIDを入力
- FunctionsにアクセスするユーザーのOCIDを入力
- APIキーの「生成」をクリック、コピー
OACで生成したAPIキーを追加します。
- ユーザーのプロファイル・メニューをクリック、「ユーザー設定」をクリック
- 「APIキー」を選択、「APIキーの追加」をクリック
- 「公開キーの貼り付け」を選択
- OACで生成したAPIキーを貼り付け
- 「追加」をクリック
Functionsの登録
作成したFunctionsをスクリプトとして、OACに登録します。
-
メニュー・アイコン→「モデル/関数の登録」→「OCI関数」をクリック
登録したFunctionsの詳細を確認します。
データ・フローの作成
Functionsを呼び出すOACデータ・フローを作成します。
-
OACの「作成」をクリック
-
保存するデータ・セットを追加
-
登録したFunctionsを選択
-
「データの保存」を追加
-
結果データ・セットの名前を入力
-
データ・フローの「別名保存」をクリック
-
データ・フローのアクション・メニューをクリック、「新規スケジュール」を選択