はじめに
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 の送付先を設定・確認することが可能です。
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 に、
bucketName
をmulti_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