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コンソールの右上「人マーク」をクリックしてください。
左下にある「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より
以下入力し作成します。
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より
以下入力し作成します。
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でObject Storage操作)
・Oracle FunctionsでEmail Deliveryと連携しメール送信
・Fn Project - Fn Server構築 (Oracle Linux7.6)
・Oracle FunctionsでOCI Go SDKを使いインスタンス操作