はじめに
以前に、OCI Resource Scheduler を利用して自動で起動と停止してみよう! という記事にて、コンピュート・インスタンスの自動起動・停止処理を紹介させていただきました
しかし、記事執筆時点(01/05時点)のOCI Resource Schedulerではコンピュート・インスタンスとAutonomous Database、OCI Functions以外はサポートされていないため、そのままではHeatWave MySQLなどのリソースは自動起動・停止を行うことができません
そこで、本記事ではOCI Functionsを利用してHeatWave MySQLの自動起動・停止を実施してみたいと思います
前提条件
本記事で記載します手順は、以下に紹介するチュートリアルやブログ記事を参考として、ポリシー等を事前に設定済みであることといたします
- Oracle Functions ハンズオン
- ⑦の
Setup fn CLI on Cloud Shell
が完了するところまでを実施いたします - アプリケーション名は
lifecycle-app
とします
- ⑦の
- OCI Resource Scheduler を利用して自動で起動と停止してみよう!
- ポリシー付与を実施いたします
- ファンクションの実行による他のOracle Cloud Infrastructureリソースへのアクセス
- 動的グループの作成と、MySQL リソースの利用ポリシー付与を実施いたします
- DBシステムの作成
- DBシステムを作成しOCIDを確認しておきます
手順
functionを作成します
1 2 |
fn init --runtime python wakeup-mysql fn init --runtime python shutdown-mysql |
起動用: wakeup-mysql、停止用: shutdown-mysqlとし、ランタイムはPythonを使用いたします
※以降は起動用のwakeup-mysqlをベースにして記載させていただき、停止用のみの設定などは適宜注釈を入れさせていただきます
カレントディレクトリの移動
1 |
cd wakeup-mysql |
使用ライブラリの定義
requirements.txtに
1 |
oci>=2.141.0 |
を追記します
※バージョンは記事執筆時点のPython SDKの最新バージョンです
スクリプトの作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import io import json import oci import logging from fdk import response def handler(ctx, data: io.BytesIO = None): try: result = "" signer = oci.auth.signers.get_resource_principals_signer() mysql_client = oci.mysql.DbSystemClient(config={}, signer=signer) result = mysql_client.start_db_system(db_system_id="ocid1.mysqldbsysritem.xxxxxxxxxxxxxxx") except (Exception, ValueError) as ex: logging.getLogger().error('error: ' + str(ex)) return response.Response( ctx, response_data=json.dumps({"result": "{0}".format(result)}), headers={"Content-Type": "application/json"} ) |
事前に確認しておいたDBシステムのOCIDを start_db_system() の db_system_id パラメータとして設定し、func.pyとして保存いたします
停止処理の場合は、start_db_system() の箇所を下記のように変更いたします
1 2 3 |
result = mysql_client.stop_db_system( db_system_id="ocid1.mysqldbsystem.xxxxxxxxxxxxxxx", stop_db_system_details=oci.mysql.models.StopDbSystemDetails(shutdown_type="FAST")) |
oci.authやoci.mysqlの詳細は、Python SDKのリファレンスをご参照願います
デプロイ
1 |
fn -v deploy --app lifecycle-app |
上記コマンドを実行し、lifecycle-appにデプロイします
スクリプトの実行確認
1 |
fn invoke lifecycle-app wakeup-mysql |
手動実行でスクリプトの確認を行います
停止処理はshutdown-mysql
で確認します
OCI Resource Schedulerの設定
以前の記事(OCI Resource Scheduler を利用して自動で起動と停止してみよう!)とほぼ同一設定であり、重要な変更点はリソース指定の箇所のみとなるため、リソース設定画面のみを記載させていただきます
同様に停止処理も作成いたします
※起動・停止の各アクションですが、OCI Functionsの実行時にパラメータ付与されませんでしたので、同一スクリプトでパラメータで分岐させるなどはできないようです
OCI Resource Schedulerのアクションの確認
OCI Resource SchedulerからOCI Functionsが実行され、HeatWave MySQLの起動・停止を行えていることが確認できました
まとめ
以上のようにOCI Functionsを組み合わせることで、HeatWave MySQLの自動起動・停止を実現することが可能となります
ただ、OCI Functionsを構築するためにはプログラミング知識が少なからず必要となりますし、エラーがあった場合などにはロギングサービスに出力されている情報から原因を特定する必要があるなど、少々敷居が高いのも事実としてあるかと思います
しかし、OCI FunctionsとOCI Resource Schedulerを組み合わせることで、非常に幅広いリソースを対象として、特定の時間に処理を実行させることも可能になります
OCI Resource Schedulerの対象サービスが拡充されるまでは、本記事で紹介したような単純なスクリプトでも、自動起動・停止を実現することができますので、ご一考願えれば幸いです