Oracle FunctionsでBase Databaseのバックアップを取得してみた。
※ Oracle Functionsとは、Oracle Cloud Infrastructureで提供されるFn Projectのマネージドサービス
事前準備
Oracle Functionsが利用できるように以下の作業を実施
- 仮想クラウド・ネットワークの作成
- IAMポリシーの作成
- OCIレジストリの作成
- Cloud Shellを使ってOracle Functionsサンプルを動かしてみた。 を参考に fn shell のセットアップを実施。
Oracle Functionsがbase database backupが可能になるようにリソースプリンシパルの構成
動的グループの作成
Functionsに使用するコンパートメント用に動的グループを作成
一致ルール
ALL{resource.type='fnfunc', resource.compartment.id='ocid1.compartment.oc1..aaaaaaaa ..."}
動的グループにポリシーの割り当て
シークレットを読み取れるように、動的グループにポリシーを割り当て
allow dynamic-group XXX to read secret-family in tenancy
コンパートメントレベルでのポリシーでも可
ファンクションの作成
アプリケーションの作成
Webコンソールまたは、CLIでアプリケーションを作成
fn create app backupap
ファンクションの作成/テストディレクトリの削除
すべてのファイルは github より取得可能
fn init --runtime java sampletimestamp
cd sampletimestamp
rm -r src/test/
fn config function backupap sampletimestamp DATABASE_ID ocid1.database.oc1.XXXX
バックアップ対象となるBase DatabaseのOCIDを設定
fn config function backupap sampletimestamp DATABASE_ID ocid1.database.oc1.XXXX
pom.xmlファイルのdependenciesにSDKを追記
pom.xml
<dependency>
<groupId>com.oracle.oci.sdk</groupId>
<artifactId>oci-java-sdk-core</artifactId>
<version>2.45.0</version>
</dependency>
<dependency>
<groupId>com.oracle.oci.sdk</groupId>
<artifactId>oci-java-sdk-database</artifactId>
<version>2.45.0</version>
</dependency>
func.yamlファイルにタイムアウトとメモリの値を追記
func.yaml
memory: 128
timeout: 180
HelloFunction.javaの編集(一部抜粋)
クラス群のインポート
import com.oracle.bmc.auth.ResourcePrincipalAuthenticationDetailsProvider;
import com.oracle.bmc.database.DatabaseClient;
import com.oracle.bmc.database.model.*;
import com.oracle.bmc.database.requests.*;
import com.oracle.bmc.database.responses.*;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
変数の宣言
DatabaseID を取得
final String dbid = System.getenv().get("DATABASE_ID");
リソースプリンシパル
final ResourcePrincipalAuthenticationDetailsProvider provider = ResourcePrincipalAuthenticationDetailsProvider.builder().build();
Backup Displayname をタイムスタンプ付で生成
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String str = sdf.format(timestamp);
String prep = "backup";
String displayname = prep + str;
バックアップ取得
/* Create a service client */
DatabaseClient client = new DatabaseClient(provider);
/* Create a request and dependent object(s). */
CreateBackupDetails createBackupDetails = CreateBackupDetails.builder()
.databaseId(dbid)
.displayName(displayname).build();
CreateBackupRequest createBackupRequest = CreateBackupRequest.builder()
.createBackupDetails(createBackupDetails)
.opcRetryToken("opcRetryToken-Value").build();
/* Send request to the Client */
CreateBackupResponse response = client.createBackup(createBackupRequest);
ファンクションのデプロイと呼び出し
デプロイと呼び出し
fn deploy --app sampletimestamp
fn invoke backupap sampletimestamp
おわりに
FunctionsでBase Databaseのバックアップ取得ができた。
