2
2

More than 5 years have passed since last update.

Oracle FunctionsでObject Storage操作(テキストを格納・取得+テキストをPDFに変換)

Last updated at Posted at 2019-07-25

Oracle Functionsを使ってObject Storageのオブジェクトをバケットに入れたり、オブジェクトをリストしたり、
特定のオブジェクトの内容を取得する操作を実行します。
その後バケットに入れたテキストファイルをPDFに変換する方法も記載します。

OracleFunctionsって?という方はこちら

Oracle FunctionsでObject Storage操作

設定方法について

設定方法は2通りあります。
1.クレデンシャル情報(ユーザOCIDや公開鍵のフィンガープリントなど)を設定して、Object Storageを操作。
2.Dynamic Groupやポリシーを設定し、Object Storageの特定のバケットに操作権限を与える。

現在はセキュリティ面も考え、2の方法が推奨されているようなので、そちらで設定したほうがよいです。
今回はObject Storage内のテキスト操作は2の方法、テキストをPDF変換は1の方法でやります。

前提

特定のコンパートメントにバケットが作成されていること(作成方法については割愛します)。
Oracle Functions開発、実行環境が構築されていること。
 ⇒・Oracle Functionsセットアップ

ソースコードを用意

今回はこちらを使用します。
https://github.com/abhirockzz/oracle-functions-oci-object-store

クローン
git clone https://github.com/abhirockzz/oracle-functions-oci-object-store.git
移動
cd oracle-functions-oci-object-store

アプリケーション作成

fn create app --annotation oracle.com/oci/subnetIds='["Oracle Functions用に作成したサブネットOCID"]' --config NAMESPACE=ネームスペース fn-object-store-app

※ネームスペースの確認方法
ネームスペースの説明についてはこちらをご確認ください。
確認方法は、OCIコンソールの右上「人マーク」をクリックしてください。
Inkedキャプチャ_LI.jpg
左下にある「Object Storage Namespace」に記載されているのがObject Storageのネームスペースです。

デプロイ

fn -v deploy --app fn-object-store-app --all
※一度にまとめて関数をデプロイしたい場合は、--allを使用します。

Object Storage操作に必要なポリシーの設定

リスト機能の設定 (list)

まず開発環境で以下コマンドを実行します。

fn inspect fn fn-object-store-app listobjects id

するとファンクションIDといわれるものが表示されます。

Dynamic Groupの作成

Identity > Dynamic Groups > Create Dynamic Groupより
以下入力し作成します。
キャプチャ.PNG
NAMEとDESCRIPTION: fn-obj-store-list-dg (任意)
RULE1: ALL {resource.id = '先ほど表示されたファンクションID'}
例) ALL {resource.id = 'ocid1.fnfunc.oc1.phx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'}
入力後、Create Dynamic Groupをクリックします。

ポリシー作成

Identity > Dynamic Groups > Create Dynamic Groupより
以下入力し作成します。
キャプチャ2.PNG
NAMEとDESCRIPTION: fn-policy (任意)
STATEMENT:
Allow dynamic-group fn-obj-store-list-dg to read objects in compartment コンパートメント名 where all{target.bucket.name='バケット名'}
※今回のために作成したバケット名と、そのバケットが存在するコンパートメント名を入力します。
入力後、Createをクリックします。

オブジェクト取得(get)と、オブジェクト配置(put)もこれと全く同じ要領で設定します。
2つは簡単に入力項目だけ記載します。

オブジェクト取得機能の設定 (get)

ファンクションID確認

fn inspect fn fn-object-store-app getobject id

Dynamic Groupの作成

Identity > Dynamic Groups > Create Dynamic Groupより
NAMEとDESCRIPTION:: fn-obj-store-get-dg
RULE1: ALL {resource.id = 'getobject id で表示されたファンクションID'}

ポリシー作成

ポリシーの一覧からfn-policy > Add Policy Statementより
以下2つを追加します。

allow dynamic-group fn-obj-store-get-dg to read buckets in compartment コンパートメント名
allow dynamic-group fn-obj-store-get-dg to read objects in compartment コンパートメント名 where all{target.bucket.name='バケット名'}

オブジェクト取得機能の設定 (get)

ファンクションID確認

fn inspect fn fn-object-store-app getobject id

Dynamic Groupの作成

Identity > Dynamic Groups > Create Dynamic Groupより
Dynamic Group名: fn-obj-store-get-dg
RULE1: ALL {resource.id = 'getobject id で表示されたファンクションID'}

ポリシー作成

ポリシーの一覧からfn-policy > Add Policy Statementより
以下2つを追加します。

allow dynamic-group fn-obj-store-get-dg to read buckets in compartment コンパートメント名
allow dynamic-group fn-obj-store-get-dg to read objects in compartment コンパートメント名 where all{target.bucket.name='バケット名'}

オブジェクト配置機能の設定 (put)

ファンクションID確認

fn inspect fn fn-object-store-app putobject id

Dynamic Groupの作成

Identity > Dynamic Groups > Create Dynamic Groupより
NAMEとDESCRIPTION:: fn-obj-store-put-dg
RULE1: ALL {resource.id = 'putobject id で表示されたファンクションID'}

ポリシー作成

ポリシーの一覧からfn-policy > Add Policy Statementより
以下2つを追加します。

Allow dynamic-group fn-obj-store-put-dg to read buckets in compartment コンパートメント名
Allow dynamic-group fn-obj-store-put-dg to manage objects in compartment fn-compartment where any {request.permission='OBJECT_CREATE', request.permission='OBJECT_INSPECT'}```

ひとつのDynamic Groupに複数のルールも設定できるのですが、今回はわかりやすいように分けました。

Object Storage操作実行

オブジェクトを格納(put)

例)
echo -n '{"name": "<filename>", "bucketName":"<BUCKET_NAME>", "content": "<TEXT_CONTENT>"}' | fn invoke fn-object-store-app putobject

実際にやってみます(自分検証用にaraki-bucketというバケットを作成しています)。
echo -n '{"name": "test.txt", "bucketName":"araki-bucket", "content": "Ahex twin - Richard D. James Album"}' | fn invoke fn-object-store-app putobject
最初は結構時間がかかるのでトイレにでも行ってください。戻ってくるとSuccessfully と表示されています。

もうひとつやってみます。
echo -n '{"name": "test2.txt", "bucketName":"araki-bucket", "content": "Ahex twin - SELECTED AMBIENT WORKS 85-92"}' | fn invoke fn-object-store-app putobject
今回は割とすぐにSuccessfully と表示されます。

オブジェクトを取得(get)

例)
echo -n '{"name": "<filename>", "bucketName":"<BUCKET_NAME>"}' | fn invoke fn-object-store-app getobject

実際にやってみます。
echo -n '{"name": "test.txt", "bucketName":"araki-bucket"}' | fn invoke fn-object-store-app getobject

putしたテキストの内容が表示されます。
Ahex twin - SELECTED AMBIENT WORKS 85-92

オブジェクトの表示(list)

例)
echo -n '<BUCKET_NAME>' | fn invoke fn-object-store-app listobjects

echo -n 'araki-bucket' | fn invoke fn-object-store-app listobjects
以下のようにファイル名が表示されます。
["test.txt","test2.txt"]

何かをトリガーにObject Storageの操作を発動するという使い方が多いと思いますので、
他のファンクションと連携したり、ソースコードを編集して他の機能も追加するとよいでしょう。

Object Storage内のテキストをPDFに変換

次はバケット内に格納したテキストファイルをPDFに変換してみます(変換後も元のファイルは残ります)。

ソースコードを用意

今回はこちらを使用します。
https://github.com/abhirockzz/fn-text2pdf
実はこちらの手順通りやってもうまくいかないのですが、Oracle Functionsをずっとやってると大体わかります。

クローン
git clone https://github.com/abhirockzz/fn-text2pdf.git
移動
cd fn-text2pdf

OCI秘密鍵の用意

今回は関数を動かすためにクレデンシャルが必要なため、その方法でやってみます。

OCI秘密鍵をコピー ※鍵名がoci_api_key.pemの場合。
cp ~/.oci/oci_api_key.pem .
権限変更 ※しないとデプロイエラーになります。ただデプロイ後削除します。
chmod 644 oci_api_key.pem

アプリケーション作成

※< >はいれなくていいです。

fn create app --annotation oracle.com/oci/subnetIds='["<Oracle Functions用に作成したサブネットOCID>"]' --config TENANT_OCID=<テナントOCID> --config USER_OCID=<Oracle Functions用ユーザOCID> --config FINGERPRINT=<Oracle Functions用ユーザ 鍵のフィンガープリント> --config PASSPHRASE=<OCI秘密鍵のパスフレーズ> --config REGION=<リージョン 今回はus-phoenix-1> --config PRIVATE_KEY_NAME=<OCI秘密鍵 今回はoci_api_key.pem> --config NAMESPACE=<ネームスペース 本手順で使用したやつ> --config BUCKET_NAME=<対象のバケット名 今回はaraki-bucket> text2pdf 

デプロイ

fn -v deploy --app text2pdf --build-arg PRIVATE_KEY_NAME=<OCI秘密鍵名>
※今回は以下。
fn -v deploy --app text2pdf --build-arg PRIVATE_KEY_NAME=oci_api_key.pem

デプロイに成功したら消しておく
rm oci_api_key.pem

PDFに変換

echo -n 'test.txt' | fn invoke text2pdf convert
※以下表示される。
PDF test.pdf written to storage bucket - araki-bucket

確認

echo -n 'araki-bucket' | fn invoke fn-object-store-app listobjects
※以下表示される。
["test.pdf","test.txt","test2.txt"]

参考

https://github.com/abhirockzz/oracle-functions-oci-object-store
https://github.com/abhirockzz/fn-text2pdf

関連記事

・Oracle Functionsに関するメモ
・Oracle Functionsセットアップ
・Oracle FunctionsでAPEXのRestful Serviceと連携
・Oracle FunctionsでTensorFlowによる画像分類
・Oracle FunctionsでEmail Deliveryと連携しメール送信
・Fn Project - Fn Server構築 (Oracle Linux7.6)
・Oracle FunctionsでOCI Go SDKを使いインスタンス操作

2
2
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
2
2