[OCI]毎日決まった時間に行うOracle Analytics Cloudの起動/停止をAutonomous Databaseを使って実現してみた


# はじめに
Autonomous Databaseと組み合わせて使用されることの多いOracle Analytics Cloudの自動起動/停止をAutonomous Databaseを使用して実現する方法を検証してみました。

この記事ではリソース・プリンシパルを使用しますので、[こちら](https://docs.oracle.com/cd//E83857_01/paas/autonomous-database/adbsa/resource-principal-prereq.html#GUID-3CF59CED-F7DF-46AF-B3CF-E703ED0BB3EE)のマニュアルに従って、使用するAutonomous Databaseを含む動的グループを作成し、作成した動的グループに対してAnalytics Cloudに対する操作を許可するポリシーを作成する必要があります。

https://docs.oracle.com/cd//E83857_01/paas/autonomous-database/adbsa/resource-principal-prereq.html#GUID-3CF59CED-F7DF-46AF-B3CF-E703ED0BB3EE

動的グループの作成例：
動的グループadb_groupを作成し、一致ルールとして以下を入力
（resource.idにAutonomous DatabaseのOCIDを指定）
```
resource.id='ocid1.autonomousdatabase.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxxxxx'
```

ポリシーの例：
動的グループadb_groupに属するリソースに、テナンシ内の全てのアナリティクス・インスタンスの管理を許可する
```
allow dynamic-group adb_group to manage analytics-instances in tenancy
```

Oracle Analytics Cloudインスタンスを管理する権限、ポリシーに関する詳細は、[こちら](https://docs.oracle.com/ja-jp/iaas/analytics-cloud/doc/manage-service-access-and-security.html#GUID-251FA58C-AC2E-44A1-86FC-2F0565DD1D50)のマニュアルに記載があります。

https://docs.oracle.com/ja-jp/iaas/analytics-cloud/doc/manage-service-access-and-security.html#GUID-251FA58C-AC2E-44A1-86FC-2F0565DD1D50



# 1.Analytics CloudインスタンスのOCIDの確認 
コンソールで操作対象となるAnalytics InstanceのOCIDを確認してメモしておきます。
![　のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/80702fe0-2ab4-1755-87cf-dbf97835fda9.png)

# 2.Autonomous Databaseへの接続
SQL*PlusからAutonomous Databaseに接続します。
```
SQL*Plus: Release 19.0.0.0.0 - Production on 水 3月 8 17:12:12 2023
Version 19.16.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

最終正常ログイン時間: 水 3月  08 2023 09:50:44 +09:00

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.18.0.1.0
に接続されました。
SQL>
```
# 3.Analytics Cloudインスタンスを起動するプロシージャの作成
Analytics Cloudインスタンスを起動するプロシージャ「start_oac_instance」を作成します。
```sql:start_oac_instanceプロシージャ
SQL> CREATE OR REPLACE PROCEDURE start_oac_instance
  2  IS
  3  	response             dbms_cloud_oci_an_analytics_start_analytics_instance_response_t;
  4  	target_oac_region    VARCHAR2(200) := 'ap-tokyo-1'; -- Analytics Cloudインスタンスのリージョン
  5  	target_oac_ocid      VARCHAR2(200) := 'ocid1.analyticsinstance.oc1.ap-tokyo-1.aaxxxxxxxxxxxxxja'; -- Analytics CloudインスタンスのOCID
  6  
  7  BEGIN
  8  	response := DBMS_CLOUD_OCI_AN_ANALYTICS.START_ANALYTICS_INSTANCE (
  9                    analytics_instance_id => target_oac_ocid,
 10                    region                => target_oac_region,
 11                    credential_name       => 'OCI$RESOURCE_PRINCIPAL'
 12  	);
 13  END;
 14  /

プロシージャが作成されました。

SQL> 
```
# 4.Analytics Cloudインスタンスを停止するプロシージャの作成
Analytics Cloudインスタンスを停止するプロシージャ「stop_oac_instance」を作成します。

```sql:stop_oac_instanceプロシージャ
SQL> CREATE OR REPLACE PROCEDURE stop_oac_instance
  2  IS
  3  	response             dbms_cloud_oci_an_analytics_stop_analytics_instance_response_t;
  4  	target_oac_region    VARCHAR2(200) := 'ap-tokyo-1'; -- Analytics Cloudインスタンスのリージョン
  5  	target_oac_ocid      VARCHAR2(200) := 'ocid1.analyticsinstance.oc1.ap-tokyo-1.aaxxxxxxxxxxxxxja'; -- Analytics CloudインスタンスのOCID
  6  
  7  BEGIN
  8  	response := DBMS_CLOUD_OCI_AN_ANALYTICS.STOP_ANALYTICS_INSTANCE (
  9                    analytics_instance_id => target_oac_ocid,
 10                    region                => target_oac_region,
 11                    credential_name       => 'OCI$RESOURCE_PRINCIPAL'
 12  	);
 13  END;
 14  /

プロシージャが作成されました。

SQL >
```
# 5.作成したプロシージャのテスト実行
プロシージャ「start_oac_instance」を実行します。
```sql:
SQL> exec start_oac_instance

PL/SQLプロシージャが正常に完了しました。

SQL>
```
コンソールで対象のAnalytics Cloudインスタンスの状態を確認します。
状態が「非アクティブ」から「更新中」になりました。
![スクリーンショット 2023-03-08 23.05.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/ccb0a86c-fc73-88fd-e4e1-c3942bff3f6c.png)
少し待つと、状態が「アクティブ」になり、Analytics Cloudのインスタンスが起動しました。
![スクリーンショット 2023-03-08 23.24.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/33badd34-a7cd-68b0-c4f8-da98b7d8253e.png)

次にプロシージャ「stop_oac_instance」を実行します。

```sql:
SQL> exec stop_oac_instance

PL/SQLプロシージャが正常に完了しました。

SQL> 
```
コンソールで対象のAnalytics Cloudインスタンスの状態を確認します。
状態が「アクティブ」から「更新中」になりました。
![スクリーンショット 2023-03-08 23.28.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/f7b63373-36f6-9774-e904-4431aaea96e1.png)
少し待つと、状態が「非アクティブ」になり、Analytics Cloudのインスタンスが停止しました。
![スクリーンショット 2023-03-08 23.40.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/36fbb2b8-7dad-4be3-6967-001b625b2a6e.png)

# 6.Analytics Cloudインスタンスを起動するプロシージャの自動実行の設定
毎日朝8時にプロシージャ「start_oac_instance」を実行してAnalytics Cloudインスタンスを起動するジョブ「START_OAC_INSTANCE_JOB」を作成します。
```sql:ジョブ START_OAC_INSTANCE_JOB
SQL> BEGIN
  2    DBMS_SCHEDULER.CREATE_JOB (
  3      job_name            => 'START_OAC_INSTANCE_JOB', -- ジョブの名前
  4      job_type            => 'STORED_PROCEDURE', -- ジョブのタイプ
  5      job_action          => 'ADMIN.START_OAC_INSTANCE', --実行するプロシージャ名
  6      start_date          => TO_TIMESTAMP_TZ('2023-03-09 08:00:00 +9:00','YYYY-MM-DD HH24:MI:SS TZH:TZM'),  --初回実行のタイムスタンプ
  7      repeat_interval     => 'FREQ=DAILY;INTERVAL=1', -- ジョブの実行頻度
  8      auto_drop           => FALSE); -- ジョブの実行後の自動削除
  9  END;
 10  /

PL/SQLプロシージャが正常に完了しました。

SQL> 
```
ジョブ「START_OAC_INSTANCE_JOB」を有効化します。
```sql
SQL> EXEC DBMS_SCHEDULER.ENABLE('START_OAC_INSTANCE_JOB');    

PL/SQLプロシージャが正常に完了しました。

SQL> 
```
# 7.Analytics Cloudインスタンスを停止するプロシージャの自動実行の設定
毎日18時にプロシージャ「stop_oac_instance」を実行してAnalytics Cloudインスタンスを停止するジョブ「STOP_OAC_INSTANCE_JOB」を作成します。
```sql:ジョブ STOP_OAC_INSTANCE_JOB
SQL> BEGIN
  2    DBMS_SCHEDULER.CREATE_JOB (
  3      job_name            => 'STOP_OAC_INSTANCE_JOB', -- ジョブの名前
  4      job_type            => 'STORED_PROCEDURE', -- ジョブのタイプ
  5      job_action          => 'ADMIN.STOP_OAC_INSTANCE', --実行するプロシージャ名
  6      start_date          => TO_TIMESTAMP_TZ('2023-03-09 18:00:00 +9:00','YYYY-MM-DD HH24:MI:SS TZH:TZM'),  --初回実行のタイムスタンプ
  7      repeat_interval     => 'FREQ=DAILY;INTERVAL=1', -- ジョブの実行頻度
  8      auto_drop           => FALSE); -- ジョブの実行後の自動削除
  9  END;
 10  /

PL/SQLプロシージャが正常に完了しました。

SQL> 
```
ジョブ「STOP_OAC_INSTANCE_JOB」を有効化します。
```sql
SQL> EXEC DBMS_SCHEDULER.ENABLE('STOP_OAC_INSTANCE_JOB');

PL/SQLプロシージャが正常に完了しました。

SQL> 
```
# 8.作成したジョブの確認
作成したジョブを確認します。
```sql
SQL> SELECT job_name, enabled, next_run_date
  2  FROM user_scheduler_jobs
  3  WHERE job_name IN ('START_OAC_INSTANCE_JOB','STOP_OAC_INSTANCE_JOB');

JOB_NAME
--------------------------------------------------------------------------------
ENABL
-----
NEXT_RUN_DATE
---------------------------------------------------------------------------
START_OAC_INSTANCE_JOB
TRUE
23-03-09 08:00:00.000000 +09:00

STOP_OAC_INSTANCE_JOB
TRUE
23-03-09 18:00:00.000000 +09:00


SQL>
```

以上で、毎日決まった時間に行うOracle Analytics Instanceの起動/停止をAutonomous Databaseを使って実現できました。