[Oracle Cloud] Object Storage のリージョン間自動コピーを、Oracle Functions で実現


はじめに

Oracle Cloud Infrastructure(以下OCI) のオブジェクトストレージは、リージョン内に配置されたサービスです。
世界規模の可用性や、世界各地からのダウンロード速度を上げたい場合、複数のリージョンへオブジェクトを配置したいユースケースが考えられます。

現時点で、OCI には手動で複数リージョン間をまたいでコピーする機能はありますが、自動的にコピーをしてくれる機能ではありません。Oracle Functions と Events を活用して自動コピー機能を実現することができます。

今回の記事では、GitHub に上げているサンプルコードを使用して、使用する方法を紹介していきます。

※ サンプルコードなので、エラーハンドリングが考慮されていない箇所があります。
本番利用の際は、アルゴリズムの見直しや、指定したリージョンでコピーがされていない状況の検知を考慮する必要があります。ご留意ください。

概要図

Object Storage の設定

まずは、Object Storage の Bucket を、使用したいリージョンで作成をします。
サンプルコードの仕様上、全て同じ名前である必要があるため、multi_region という名前で作成します。

この記事の 手順例 では、以下の 3 リージョンを 対象にしています

  • 東京 (ap-tokyo-1)
  • アッシュバーン (us-ashburn-1)
  • フェニックス (us-phenix-1)

コピー先のリージョンは、自由に変更可能なので、好きなリージョンで作成頂いて構いません。

Function の 設定

Function Deploy

まず、Functions を動かす準備が出来ていない場合は、以下の Document や Quick Start Guide を参考にして、事前準備をします。
Preparing for Oracle Functions
https://docs.cloud.oracle.com/iaas/Content/Functions/Concepts/functionsprerequisites.htm

Quick Start Guide
https://www.oracle.com/webfolder/technetwork/tutorials/infographics/oci_faas_gettingstarted_quickview/functions_quickview_top/functions_quickview/index.html

Functions を動かす準備が出来たら、GitHub から Sample コードをclone します

# 作業用ディレクトリ作成
mkdir ~/fnwork/
cd ~/fnwork/

# GitHub から clone
git clone https://github.com/Sugi275/oci-objectstorage-multiregioner.git

Sample コードの中で実行している概要は、以下の通りです

  • generateAction 関数で、Events から受け取ったパラメータと環境変数をもとに、Object Storage のコピー機能のパラメータを 構造体(struct)として生成します
  • Object Storage に格納されたファイルが新規作成(create) と 更新(update) の場合には、tokyo region から、他のリージョンにコピー。他のリージョンでファイルが存在している場合は上書き
  • ファイルが削除(delete) された場合は、他リージョンのファイルを削除

clone したディレクトリへ移動します

cd ~/fnwork/oci-objectstorage-multiregioner/

go.mod を作成します

echo "module func" > go.mod

Functions へ multiregioner の function を Deploy します。--app に渡すアプリケーション名は環境によって書き換えてください

fn --verbose deploy --app susugiya

次に、Deploy した Functions の OCID をコピーします。
OCI コンソールのメニューから、Developer Services > Functions を選択します。
私の環境で、事前に作成していた Application の名前を選択します。

objectstorage_multiregioner の OCID を Copy します

例 : ocid1.fnfunc.oc1.ap-tokyo-1.aaaaaaaaacbqyf6ps7uxmpz3tevmvkmvbbsqqcgkf3xk62zvjryb4hhgo36a

Function の 環境変数設定

Functions に環境変数を設定します。3種類の環境変数が必要です。

  • OCI_BUCKETNAME : Object Storage のバケット名を指定します。今回の例では、multi_region としています。
  • OCI_SOURCE_REGION : Object Storage のコピー元のリージョン名を指定します。今回の例では、ap-tokyo-1 としています
  • OCI_DESTINATION_REGIONS : Object Storage のコピー先のリージョン名を指定します。複数存在する場合は、カンマで区切りで指定すればOKです。今回の例では、us-ashburn-1,us-phoenix-1 としています。
fn config func susugiya objectstorage_multiregioner OCI_BUCKETNAME "multi_region"
fn config func susugiya objectstorage_multiregioner OCI_SOURCE_REGION "ap-tokyo-1"
fn config func susugiya objectstorage_multiregioner OCI_DESTINATION_REGIONS "us-ashburn-1,us-phoenix-1"

Function の logging

Functions では、logging として現段階は2種類の方式がサポートされています

  • Object Storage へ出力
  • syslog

開発環境としては、syslog を使用するのが楽で良いです。Object Storage の場合は、出力されるのに約15分ほど待つ必要があるため、すばやい log 確認が出来ません。syslog の場合はすぐに確認できるのでお勧めです。

syslog を受け取るために syslog サーバを用意してもよいのですが、開発する時には 無償で使用可能な SaaS の Papertrail が簡単でお勧めです。

Papertrail の設定方法は、こちら の記事を参考にしてください。
なお、OCI コンソール上から Papertrail の送付先を設定・確認することが可能です。

Edit Application を選択

logging 先を設定変更

Dynamic Group

次に、Function 内で OCI SDK を使用するための権限を付与するために、Resource Principle を使用するための設定を行います。Resource Principle 自体の説明は こちら を参照してください

OCI のメニューから、Identity > Dynamic Groups へ移動し、 Create Dynamic Group を押します
以下のパラメータを入力し、Create を押します

  • NAME : susugiya_objectstorage_multiregional_group
  • DESCRIPTIN : susugiya_objectstorage_multiregional_group

Rule に以下の文字列を入力します。resource.id の部分は、作成した Function の OCID を指定します。

ALL {resource.type = 'fnfunc', resource.id = 'ocid1.fnfunc.oc1.ap-tokyo-1.aaaaaaaaacbqyf6ps7uxmpz3tevmvkmvbbsqqcgkf3xk62zvjryb4hhgo36a'}

Policy

2種類の Policy を設定する必要があります

  • リソースプリンシパル用
  • Object Storage のリージョン間コピー機能用

リソースプリンシパル用

Identity > Policies へ移動し、 Create Policy を押します
以下のパラメータを入力し、Create を押します

  • NAME : objectstorage_multiregional_policy
  • DESCRIPTION : objectstorage_multiregional_policy
  • STATEMENT : 以下の文字列で指定します。 Dynamic Group で作成した名前を指定して、object-family(Object Storage サービス) を manage(全操作可能) な権限を付与しています
Allow dynamic-group susugiya_objectstorage_multiregional_group to manage object-family in compartment susugiya

画面例

Object Storage のリージョン間コピー機能用

Create Policy を押します
以下のパラメータを入力し、Create を押します

  • NAME : objectstorage_multiregional_policy
  • DESCRIPTION : objectstorage_multiregional_policy
  • STATEMENT : 以下の文字列で指定。使用したいリージョン分を全て指定します。リージョン名は、OCI コンソール上で確認可能です
Allow service objectstorage-us-ashburn-1 to manage object-family in tenancy
Allow service objectstorage-ap-tokyo-1 to manage object-family in tenancy
Allow service objectstorage-us-phoenix-1 to manage object-family in tenancy

参考 Document : https://docs.cloud.oracle.com/iaas/Content/Object/Tasks/copyingobjects.htm#permissions

参考 リージョン名

Events の 設定

次に、Tokyo Region の Object Storage を起点にして Events を動かすために設定を行います。
OCI のメニューから、 Application Integration > Events Service を選択します。

Create Rule を押して、以下のパラメータを指定していきます

  • DISPLAY NAME : objectstorage_multiregion
  • DESCRIPTION : objectstorage_multiregion
  • Events Matching : 下の画像を参考にして設定する
    • EVENT TYPE に Object の Create, Delete, Update の3種類を入力
    • Attribute に、bucketNamemulti_region と手入力することで、特定のバケットに制限
  • Actions : Function の 名前を指定

動作確認

それでは準備完了できたので、さっそく動作確認をしてみます。エラーログや実行時のログは logging 先の Papertrail を確認すると、ほぼリアルタイムにログが表示されるので、これを開きながら動作確認すると良いです。

では、Tokyo Region の Object Storage にある バケットmulti_regionにファイル(Object) を格納します。

Upload Objects を押します

Upload Objects を選択すると、ファイルがアップロードされます

Work Requests の画面では、Object Storage へのリクエストされたコピー機能の状況が示されています。
Resource Name に、アップロードしたファイル名が表示され、Status が Completed となっています

ashburn と phoenix Region でファイルがコピーされていることが確認できます

ashburn

phoenix

Papertrail では実行時のログが出力されています

参考URL