はじめに
Oracle Cloud Infrastructure(OCI)には、Amazon CloudWatch Eventsのように特定の時間にアクションを実行するようなサービスは執筆時点(2023/08/30)ではございません
しかし、開発環境の場合には業務時間中のみ起動しておき、不必要な起動(=課金)は防ぎたいと考えることが多いと思われます
そこで、OCIで現在使用できるサービスを組み合わせて、同様のことが実現できるのかを本記事では検証していきたいと思います
※OCI-AutoScaleのように外部から各リソースの起動・停止を実施するようなスクリプトがございますが、常時起動しているコンピュート・インスタンスが必要であったり、OCIのサービスではないため、本記事の対象外とさせて頂いております
まず、特定の時間に何かしらのアクションを実行できるサービス・機能ですが、OCI には PL/SQL SDKという開発者用キットがあります
この PL/SQL SDK を使用すれば、Autonomous Database(今回使用するのは Autonomous Data Warehouse を使用するため、以下ADWと表記いたします)から OCI の各リソースを管理することが可能になり、ADWのジョブ・スケジューラーを組み合わせることで、特定の時間にアクションを実行することが実現可能となります
さらに、ADWには Autonomous Databaseインスタンスの開始時間および停止時間のスケジュールという機能があり、指定したスケジュールに従ってインスタンスが自動的に起動および停止することが可能になるため、ADW 自体も不要な時間帯は停止させておくという運用が可能になります
そこで、本記事ではADWの自動開始/停止スケジュールを起点としてコンピュート・インスタンスの起動・停止を行ってみたいと思います
1.ADWのOCIDを確認する
2.動的グループの作成
ADWからコンピュート・インスタンスの起動・停止を実施するために、ポリシーの設定を実施する必要があります
そのポリシーの対象とするための、ADWが含まれた動的グループを作成いたします
1 |
resource.id='ocid1.autonomousdatabase.oc1.ap-tokyo-1.anxhiljrzif6lvyagotycdm2harrsf2utf3rsts3xkp7cwxhjjsfuswcki7a' |
とADWのOCIDを指定します
3.ポリシーの作成
ポリシーでは先に作成した動的グループに対し、コンピュート・インスタンスの管理権限と、ネットワークの利用権限を付与しています
4. SQL*PlusでADWに接続
以降はSQLを使用して設定を行うため、SQL*PlusでADWに接続します
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ sqlplus ADMIN@adb_high SQL*Plus: Release 19.0.0.0.0 - Production on Wed Aug 30 10:04:18 2023 Version 19.17.0.0.0 Copyright (c) 1982, 2022, Oracle. All rights reserved. Enter password: Last Successful login time: Wed Aug 30 2023 09:27:36 +09:00 Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.20.0.1.0 SQL> |
5. リソース・プリンシパルによるOCIリソースへのアクセスの有効化
ADWからリソース・プリンシパルにより、ADMINユーザーとして各リソースへアクセスできるようにします
※有効化しない場合は、認証トークンを作成しクレデンシャルを登録してください
1 |
EXEC DBMS_CLOUD_ADMIN.ENABLE_RESOURCE_PRINCIPAL(); |
本操作により、資格証明として OCI$RESOURCE_PRINCIPAL
が作成されます
また、ADMINユーザー以外で有効化したい場合などは、 リソース・プリンシパルによるOracle Cloud Infrastructureリソースへのアクセスの有効化 のドキュメントを参照願います
6.コンピュート・インスタンスのOCIDを確認する
起動・停止したいコンピュート・インスタンスの詳細画面を表示し、OCIDを確認します
7.コンピュート・インスタンスを起動・終了するプロシージャの登録
コンピュート・インスタンスを起動・終了するプロシージャを登録します
DBMS_CLOUD_OCI_CR_COMPUTEパッケージのINSTANCE_ACTIONを実行し、actionパラメータに START
と SOFTSTOP
を指定することで、起動と停止を行っています
また、その際の認証情報はリソース・プリンシパル( OCI$RESOURCE_PRINCIPAL
)を指定していますので、認証トークンを使用したクレデンシャルを使用する場合は、適宜読み替えて実施願います
DBMS_CLOUD_OCI_CR_COMPUTE.INSTANCE_ACTIONについては、こちらのドキュメントを参照いただければと思います
起動プロシージャ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
CREATE OR REPLACE PROCEDURE start_instance IS response dbms_cloud_oci_cr_compute_instance_action_response_t; instance_ocid VARCHAR2(200) := 'ocid1.instance.oc1.ap-tokyo-1.anxhiljrzif6lvyc5fnevo63g5ksgywzu2zntlhcj7powiic7j6ebwpykuwa'; BEGIN response := DBMS_CLOUD_OCI_CR_COMPUTE.INSTANCE_ACTION ( action => 'START', instance_id => instance_ocid, region => 'ap-tokyo-1', credential_name => 'OCI$RESOURCE_PRINCIPAL' ); END; / |
終了プロシージャ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
CREATE OR REPLACE PROCEDURE stop_instance IS response dbms_cloud_oci_cr_compute_instance_action_response_t; instance_ocid VARCHAR2(200) := 'ocid1.instance.oc1.ap-tokyo-1.anxhiljrzif6lvyc5fnevo63g5ksgywzu2zntlhcj7powiic7j6ebwpykuwa'; BEGIN response := DBMS_CLOUD_OCI_CR_COMPUTE.INSTANCE_ACTION ( action => 'SOFTSTOP', instance_id => instance_ocid, region => 'ap-tokyo-1', credential_name => 'OCI$RESOURCE_PRINCIPAL' ); END; / |
8.プロシージャの動作確認
インスタンスの起動
1 2 3 |
SQL> exec start_instance; PL/SQL procedure successfully completed. |
インスタンスの停止
1 2 3 |
SQL> exec stop_instance; PL/SQL procedure successfully completed. |
9.スケジューラ・ジョブの登録
インスタンスの起動・停止プロシージャの動作が問題なければ、スケジューラ・ジョブとして登録します
弊社は 09:00~18:00が勤務時間となっていますので、始業30分前に起動し、終業30分後に停止するようにジョブを登録します
また、repeat_intervalオプションにより、毎日実行されるように設定します
土日などの非稼働日はスケジューラ・ジョブ側での制御ではなく、ADWの自動開始/停止スケジュール設定で行うこととします
起動ジョブ
1 2 3 4 5 6 7 8 9 10 |
BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => 'START_INSTANCE_JOB', job_type => 'STORED_PROCEDURE', job_action => 'ADMIN.START_INSTANCE', start_date => TO_TIMESTAMP_TZ('2023-08-30 08:30:00 +9:00','YYYY-MM-DD HH24:MI:SS TZH:TZM'), repeat_interval => 'FREQ=DAILY;INTERVAL=1', auto_drop => FALSE); END; / |
停止ジョブ
1 2 3 4 5 6 7 8 9 10 |
BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => 'STOP_INSTANCE_JOB', job_type => 'STORED_PROCEDURE', job_action => 'ADMIN.STOP_INSTANCE', start_date => TO_TIMESTAMP_TZ('2023-08-30 18:30:00 +9:00','YYYY-MM-DD HH24:MI:SS TZH:TZM'), repeat_interval => 'FREQ=DAILY;INTERVAL=1', auto_drop => FALSE); END; / |
10. ADWの自動開始/停止スケジュール設定
最後にADWの自動開始/停止スケジュールを設定します
スケジューラ・ジョブが実行される際にはADWが起動していなければならないため、起動ジョブが実行される前にはADWが起動しているようにする必要があります
停止も同様に、停止ジョブが実行されたあとにADWが停止するように設定を行います
※ADWの自動開始/停止スケジュールはUTCで設定いたしますので、時間のズレに注意しながら設定を行います
翌営業日などにADWとコンピュート・インスタンスが自動的に起動・停止していることを確認します
まとめ
以上のステップを実施することで、ADWの自動開始/停止スケジュールを起点として、コンピュート・インスタンスの起動・停止を実施することが可能となります
今回は、コンピュート・インスタンスの起動・停止を実施いたしましたが、 PL/SQL SDK にはその他にもたくさんの対象サービスがございますので、プロシージャの作り方次第では様々なことが可能になるかと思われます
LoadBalancerのように停止できないサービスの場合、夜間はなるべく費用を抑えるために最小・最大帯域幅を10Mbpsに変更するといったことも可能かと思われますので、本記事に興味を持たれた方は、 PL/SQL SDK を一度ご参照いただき、何ができるのかを確認いただけますと幸いです