OCIインスタンスの自動起動・停止（お金を節約したい方必見）

このシリーズの他の記事は、[オラクル・クラウドの個人ブログ一覧 ](https://qiita.com/letian/items/10152a4fec813c1b7d98)からご覧いただけます。

# 初めに
時はお金なり。土日祝など、長時間にわたりOCI（Oracle Cloud Infrastructure）インスタンスを使用しない場合は、コストを節約するために停止することを強くお勧めします。

インスタンスの<font color=blue>停止忘れは、お金を落とすのと同じ！</font>

**料金比較**
1ヶ月の稼働日数を<strong>22日</strong>と仮定すると、毎日定時(8:30から18:30まで)に起動・停止させることで、1ヶ月で合計<font color=blue>500</font>時間 (720 - 22*10)を節約できます。つまり、OCPU per hourに関連する費用は、停止なしの場合から<strong>69.4%</strong>（約<strong>7割</strong>）も<strong>節約できる</strong>ことになります。これは無視できない大きな差異です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/ba7a80ae-576f-4ead-88ef-d4800f1cc194.png", width="450">

**実装方法の比較**
OCIにて、インスタンスを自動的に起動・停止させたい場合、可能ですか？可能であれば、その実現方法について質問がある方に対し、解決方法を紹介したいと思います。

回答はまず可能です。インスタンスの種類によって実装方法が異なります。この記事では主に、OCI-CLIを使用してインスタンスを起動および停止する方法を紹介します。

|No.|OCI サービス|ネイティブの<br>スケジュール機能|CLI/APIで<br>実現|リソース<br>スケジューラ|
|:--:|:--|:--:|:--:|:--:|
|1|[Autonomous Database](#1-autonomous-database)|✅|可能|対応✅|
|2|[Compute](#2-computeインスタンス)|✘|可能|対応✅<br>(Standardのみ)|
|3|[Oracle Base DB](#3-oracle-base-db)|✘|可能|2025/4/29より<br>対応対象外になった|
|4|[MySQL DB Service](#4-mysql-db-service)|✘|可能|✘|
|5|[Oracle Analytics Cloud](#5-oracle-analytics-cloud)|✘|可能|✘|
|6|[OCI Data Integration](#6-oci-data-integration)|✘|可能|✘|

※、<font color=blue>Always Free</font> ADBは、ネイティブの起動・停止スケジュール機能を含まない。

:::note
__追記__
2024年5月21日に、OCIリソース・スケジューラがリリースされ、Standard Compute/ADBの起動および停止のスケジュール設定がより簡単になります。詳細について、次の記事をご参考ください。
[OCI リソース・スケジューラでインスタンスの自動起動と停止を設定する](https://qiita.com/letian/items/1c5d1446e31c11f6989c)
:::

# 1. Autonomous Database
## 実現方法-1
OCIコンソールより起動・停止のスケジュールを設定する。
注意点：<font color=blue>UTC</font>時間となる。(<font color=blue>JST</font>への換算を忘れずに)

ADBの詳細画面 →「他のアクション」 →「<strong>自動開始/停止スケジュール</strong>」

次は、毎日のJST 18時 (UTC 9時)に自動停止する例です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/d08dad93-1633-4462-8287-04ee864561aa.png", width="500">

設定後、次のように、ADBの詳細画面で確認できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/11491727-2fa1-58ae-e3b3-6a69dc82e9d2.png", width="250">

:::note
ADBは停止中の状態になってもスケジュールを設定できる。
:::

__メリット__
- OCIコンソールから簡単に設定可能。

__制限事項__
- <font color=blue>時間単位</font>でしかスケジュール設定ができない。
- <font color=blue>UTC</font>時刻での設定となるため、タイムゾーンの変換が必要。

__注意点__
- OCIコンソールの<font color=red>バグ</font>
:::note alert
追記：2025/4
OCIコンソールで以下のように表示されています。毎日が`<em>`と`</em>`で囲まれています。明らかにこれは<strong>バグ</strong>です。
:::

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/c18ff5df-0bc2-48fc-8d33-9e9af2fde584.png", width="300">

- UTCからJSTへの変換について
例：月曜日 午前8:00（JST）に自動起動させたい場合、コンソール上では<strong>前日</strong>の日曜日 23:00（UTC）に設定する必要があります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/df9a16ab-0482-42a9-b3f7-5435e0199751.png", width="500">

## 実現方法-2
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/0e9019ff-bd71-478f-b035-0883b285b0d7.png", width="400">

OCI-CLIで起動・停止用スクリプトを作成。

ADBの<strong>起動</strong>：oci db autonomous-database <font color=blue>start</font> --autonomous-database-id \<ADB_OCID>
ADBの<strong>停止</strong>：oci db autonomous-database <font color=blue>stop</font> --autonomous-database-id \<ADB_OCID>

__メリット__
- <font color=blue>分単位</font>でのスケジュール設定が可能。
- ローカルタイムゾーンでの設定が可能。
- この方法は、ADB 以外のリソースにも適用可能。

__制限事項__
- スクリプトの作成と、手動でのスケジューラ（cronなど）の設定が必要。
- 実行する端末が必要（例：Always Freeのインスタンスを活用）。

## 実現方法-3
詳細については次の記事をご参照ください。
[OCI リソース・スケジューラでインスタンスの自動起動と停止を設定する](https://qiita.com/letian/items/1c5d1446e31c11f6989c)

__メリット__
- OCIコンソール上で簡単に設定でき、スクリプトの作成や実行端末は不要。
- <font color=blue>分単位</font>でのスケジュール設定が可能。

__制限事項__
- <font color=blue>UTC</font>時刻での設定となるため、タイムゾーンの変換が必要。

# 2. Computeインスタンス
APIでPython、Javaなどの言語でも実現可能ですが、OCI-CLIはおすすめです。

<strong>ステップ</strong>
- Step-1) 管理サーバにOCI-CLIをインストールして、構成ファイルを設定する。
- Step-2) 起動・停止用のスクリプトを作成する。（次は参考例です。実際の運用環境には、状態をチェックする処理を追加してください。）
インスタンスの<strong>起動</strong>：oci compute instance action <font color=blue>--action "START</font>" --instance-id \<Instance_OCID>  
インスタンスの<strong>停止</strong>：oci compute instance action <font color=blue>--action "SOFTSTOP</font>" --instance-id \<Instance_OCID>  
- Step-3) 管理サーバから、定時に起動・停止用のスクリプトを実行する。
<strong>Linux OS</strong>の場合：<strong>crontab</strong>を利用
<strong>Windows OS</strong>の場合、Task Schedulerを利用

Linuxの実施例： 毎日18時（OSのタイムゾーン）、自動停止用スクリプトを呼び出す。
```bash
[opc@linux8 ~]$ crontab -l
00 18 * * * /home/opc/shell/compute_auto_stop.sh
```

:::note
- `--action`引数："SOFT"なしで"STOP"を指定できますが、"<strong>SOFTSTOP</strong>"の使用をお勧めします。
- 管理用サーバは<strong>24時間稼働</strong>であり、料金を節約するため、低スペックでもよい。OCI Always Free Tier (Linuxのみ)でも動ける。
- 管理用サーバに、OCI-CLIのインストールとセットアッが必要。インストール方法については、この記事（[便利なOCI CLIコマンド例](https://qiita.com/letian/items/ed30da7a4d37a56ba8bc)）をご参照ください。
- 起動・停止対象インスタンスに<strong>タグ</strong>をつけて、対象だけを起動・停止させるのは、よく利用されるケースです。
:::

# 3. Oracle Base DB
これ以降の実現方法は、上記のComputeインスタンスと同様

DBノードの<strong>起動</strong>：oci <font color=blue>db node start</font> --db-node-id \<DB_Node_OCID>  
DBノードの<strong>停止</strong>：oci <font color=blue>db node stop</font> --db-node-id \<DB_Node_OCID>  

:::note warn
起動・停止対象は DB systemではなく、<strong>DBノード</strong>です。
:::

# 4. MySQL DB Service
DB Systemの<strong>起動</strong>：oci mysql <font color=blue>db-system start</font> --db-system-id \<DB_System_OCID>
DB Systemの<strong>停止</strong>：oci mysql <font color=blue>db-system stop</font> --shutdown-type <strong>FAST|IMMEDIATE|SLOW</strong> --db-system-id \<DB_System_OCID>

# 5. Oracle Analytics Cloud
通常のインスタンスでは「起動・停止（Start/Stop）」という用語が使われています、OACインスタンスの場合、<strong>OCIコンソールのUI</strong>には「一時停止・再開（Pause/Resume）」と表記されます。ただし、CLIコマンドでは他のインスタンスと同様に「Start」「Stop」というコマンドが使われていますので、ご注意ください。

OACの<strong>一時停止</strong>：oci analytics analytics-instance <font color=blue>stop</font> --analytics-instance-id \<Analytics_Instance_OCID>  
OACの<strong>再開</strong>：oci analytics analytics-instance <font color=blue>start</font> --analytics-instance-id \<Analytics_Instance_OCID>  

:::note warn
OAC一時停止中、課金が完全に止まるのではなく、<strong>通常の15%の課金</strong>が引き続き発生します。再開すると、通常の課金に戻ります。完全に課金を止めたい場合、OACインスタンスの<strong>削除</strong>が必要です。（一時停止すれば課金が発生しないと誤解する人が多いので、ご注意ください！）
:::

# 6. OCI Data Integration
ワークスペースの<strong>起動</strong>：oci data-integration <font color=blue>workspace start</font> --workspace-id \<Workspace_OCID>  
ワークスペースの<strong>停止</strong>：oci data-integration <font color=blue>workspace stop</font> --workspace-id \<Workspace_OCID>  

以上

使わないときにインスタンスを起動しっぱなしにするのはもったいないです。
楽しくお金を節約しましょう。Happy money saving!

----
__関連記事__
[OCIコスト節約術](https://qiita.com/letian/items/10152a4fec813c1b7d98#7-%E3%82%B3%E3%82%B9%E3%83%88%E7%AF%80%E7%B4%84%E8%A1%93%E9%87%8D%E8%A6%81)
[OCI-CLIを使用してOCIインスタンスのライフサイクル状態を取得する方法](https://qiita.com/letian/items/ff78090395567c7906c2)

# 参考資料

__MOS (My Oracle Support)__
[OCI Compute - How to Automate Stop and Start of OCI Instances (Doc ID 2876796.1)](https://support.oracle.com/knowledge/Oracle%20Cloud/2876796_1.html)
[OCI Compute - How to Schedule Start / Stop of an OCI Virtual Machine (Doc ID 2853159.1)](https://support.oracle.com/knowledge/Oracle%20Cloud/2853159_1.html)

[OCI Public PaaS/IaaS - What happens to the billing when you pause an Oracle Cloud Analytics instance (Doc ID 2934259.1)](https://support.oracle.com/knowledge/Oracle%20Cloud/2934259_1.html)

MOSドキュメントの記載内容の抜粋：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/2432befc-6f49-ca55-1b11-ecba452642d5.png)

__OCI-CLI コマンド__
[Docs » db » autonomous-database](https://docs.oracle.com/en-us/iaas/tools/oci-cli/3.40.1/oci_cli_docs/cmdref/db/autonomous-database.html)
[Docs » compute » instance](https://docs.oracle.com/en-us/iaas/tools/oci-cli/3.40.1/oci_cli_docs/cmdref/compute/instance.html)
[Docs » db » node](https://docs.oracle.com/en-us/iaas/tools/oci-cli/3.40.1/oci_cli_docs/cmdref/db/node.html)
[Docs » mysql » db-system](https://docs.oracle.com/en-us/iaas/tools/oci-cli/3.40.1/oci_cli_docs/cmdref/mysql/db-system.html)
[Docs » analytics » analytics-instance](https://docs.oracle.com/en-us/iaas/tools/oci-cli/3.40.1/oci_cli_docs/cmdref/analytics/analytics-instance.html)
[Docs » data-integration » workspace](https://docs.oracle.com/en-us/iaas/tools/oci-cli/3.40.1/oci_cli_docs/cmdref/data-integration/workspace.html)

__OCI ドキュメント__
[Schedule Start and Stop Times for an Autonomous Database Instance](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/autonomous-auto-stop-start.html)
[インスタンスの停止、起動または再起動](https://docs.oracle.com/ja-jp/iaas/Content/Compute/Tasks/restartinginstance.htm)