[Oracle Cloud]Oracle FunctionsでBase Databaseのバックアップを取得してみた。

Oracle FunctionsでBase Databaseのバックアップを取得してみた。

※ Oracle Functionsとは、Oracle Cloud Infrastructureで提供されるFn Projectのマネージドサービス

# 事前準備
Oracle Functionsが利用できるように以下の作業を実施

- 仮想クラウド・ネットワークの作成
- IAMポリシーの作成
- OCIレジストリの作成
- [Cloud Shellを使ってOracle Functionsサンプルを動かしてみた。](https://qiita.com/kenwatan/items/d8fd2426e93a1cfb65f6) を参考に 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](https://github.com/kenwatan/functions_BaseDB_Backup) より取得可能

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

バックアップ確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/68204bfe-6de6-1715-3870-0ac9d5f61c16.png)


# おわりに

FunctionsでBase Databaseのバックアップ取得ができた。

# 参考情報

- [Cloud Shellを使ってOracle Functionsサンプルを動かしてみた。](https://qiita.com/kenwatan/items/d8fd2426e93a1cfb65f6)
- [Oracle Functionsことはじめ](https://oracle-japan.github.io/paasdocs/documents/faas/oraclefunctions/handson/getting-started/)
- [CreateBackupExample.java - Oracle Help Center](https://docs.oracle.com/en-us/iaas/tools/java-sdk-examples/2.46.0/database/CreateBackupExample.java.html)