OCI リソース・スケジューラでインスタンスの自動起動と停止を設定（お金を節約したい方必見）

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

# 初めに
時はお金なり。使わないときにインスタンスを起動しっぱなしにするのはもったいないです。

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

2024年5月21日に、新しいサービスであるOCI<strong>リソース・スケジューラ</strong>がリリースされました。これを利用することで、インスタンスの起動および停止のスケジュール設定がより簡単になります。待ちに待った機能がついに登場しました。（この機能自体は簡単なのに、なぜ長い間リリースされなかったのか、とても興味深いです。）

__運用ケース__：指定日付（曜日）に、指定したリソースを自動に起動・停止させる。

試算してみましょう。

1ヶ月を30日と仮定すると、1ヶ月は合計で30日 × 24時間 = <font color=blue>720</font>時間になります。24時間稼働させる場合、インスタンスは1ヶ月720時間で課金されます。簡略のため、OCPU per hour以外の費用（ストレージ等）は考慮しないことにします。

例として、インスタンスを平日の毎日<strong>8:30</strong>から<strong>18:30</strong>まで（10時間）稼働させ、週末と祝日は稼働させないとします。

1ヶ月の<strong>稼働日数を22日</strong>と仮定すると、毎日定時に起動・停止させることで、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">

# サポート対象リソース
__2024年5月（サービス新規リリース時点）__
Standard Computeシェイプ、Autonomous Database、Base Databaseの3種類でした。

__2025年4月29日__
Base Databaseがサポート<strong>対象外</strong>となり、非常に残念です（訳が分かりません）。
一方で、新たにインスタンス・プールとファンクションがサポート対象に追加されました。

:::note warn
Base Databaseがサポート対象に復帰してほしいです。
:::

# 他方法との比較

|インスタンス・タイプ|リソース・スケジューラ|ネイティブの<br>スケジュール機能|CLI/APIで実現|
|:--|:--:|:--:|:--:|
|Compute|サポート対象<br>(<strong>Standard</strong>のみ)|なし|可能|
|Autonomous Database|サポート対象|<font color=blue>あり</font>|可能|
|Oracle Base DB|サポート<strong>対象外</strong>になった<br>(2025/4/29)|なし|可能|


Autonomous DBの自動起動・停止を例に、リソース・スケジューラの利点と制限事項を他の方法と比較してみます。
|項目|リソース・スケジューラ|ネイティブの<br>スケジュール機能|CLI/API|
|:--|:--:|:--:|:--:|
|OCIコンソールでの設定|Yes|Yes|No|
|コーディング作業|不要|不要|必要|
|実施端末|不要|不要|必要|
|分単位で細かく設定|<font color=blue>Yes</font>|No<br>(<font color=blue>時間</font>単位のみ)|Yes|
|ローカルタイムゾーンの対応|No<br>(UTC時間)|No<br>(UTC時間)|<font color=blue>Yes</font>|

:::note
Oracle Base Databaseはリソース・スケジューラのサポート対象から外れたため、自動起動・停止を行いたい方には、次の代替手段をご紹介します。
[OCI-CLIを使用してインスタンスの起動・停止を実現する方法](https://qiita.com/letian/items/2f059ec0ce4139632a11)
この方法は、Oracle Base Databaseだけでなく、他の種類のインスタンスにも適用可能です。ぜひご参考になさってください。

:::

# リソース・スケジューラの使い方
__事前準備__
管理者ユーザーではない場合、スケジュールを作成するために、ユーザーに権限を付与する必要があります。

IAMポリシーの例：
`
Allow group ResourceScheduleManagers to manage resource-schedule-family in tenancy
`
※、<strong>テナンシ</strong>・レベルにしてください。

__作成開始__
ガバナンスと管理 > リソース・スケジューラ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/1daef067-ecb3-3d8a-0630-ce56a0354465.png)

「スケジュールの作成」を押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/43903b53-68bf-3d93-4f21-e09b44e9a5d7.png)

__基本情報__
スケジュール名（必須）：適当な名前を入力する
実行するアクション（必須）：起動か停止を選択する
※、この例では、Computeインスタンスに対し、毎日の停止スケジュールを作成する。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/0da5b435-db83-556b-92dd-f01c9faf3749.png", width="550">

__リソース__
リソースの選択方法：静的（デフォルトのまま）
一覧から対象のインスタンスを選択して、次へ。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/e1a2210c-51ce-d82d-7874-90b452c9e930.png", width="550">

__スケジュール__
間隔：選択肢は、"１回のみ"、"毎日"、"毎週"、"毎月"の４つがある。この例では、毎日のJST 18時を指定する。
時間: 入力は<strong>UTC時間</strong>となるので、ご注意を！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/b2f230df-e779-ab55-c13a-d47148624998.png", width="600">

曜日を指定したい場合、次の例をご参照ください（平日のJST 18:30に停止する例）。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/e8cbc2d5-2229-f977-5eea-d0da14423dd8.png", width="600">

__確認__
入力した内容を確認し、「スケジュールの作成」を押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/e84a1f26-9b6a-f8da-a90a-80af6e2ef046.png)

__作成後__
ステータスが、<strong>有効</strong>になることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/0889e9fb-f664-d109-1cec-2b6844dabf43.png)

スケジュールの詳細画面に、OCIDをコピーしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/14e0ecc6-ae68-cced-41dd-469481b67dba.png)

__IAM ポリシーの作成__

:::note warn
ポリシーを作成しないとスケジュールの実行が失敗しますので、ご注意ください。
:::

- ステートメント：
`
Allow any-user to manage <RESOURCE_TYPE> in compartment <TARGET_COMPARTMENT_NAME> where all {request.principal.type='resourceschedule', request.principal.id='<ocid_of_resourceschedule>'}
`
※、`<RESOURCE_TYPE>`、`<TARGET_COMPARTMENT_NAME>`とスケジュールの<strong>OCID</strong>を置き換えてください。

- 例：
`
Allow any-user to manage instance in compartment PoC where all {request.principal.type='resourceschedule', request.principal.id='ocid1.resourceschedule.oc1.ap-tokyo-1.amaa...lkcza'}
`

__動作確認__
予定の時刻になったら、インスタンスが停止されることを確認します。
スケジュールの一覧：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/3ace8626-c554-01fd-0bc4-997c053e3042.png)

作業リクエスト（スケジュールの詳細画面）：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/35af081b-003f-c5c9-d14c-606bfcd08774.png)

スケジュール設定と動作確認はここまで完了です。

# トラブルシューティング
## 現象-1: スケジュールが作成できない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/608050f1-c6ff-cf9e-09ed-e2ef9b65f70f.png)
考えられる理由: ユーザーがスケジュールを作成する権限がない。
対策：次のようにIAMポリシーを作成する。
`
Allow group ResourceScheduleManagers to manage resource-schedule-family in tenancy
`

## 現象-2：インスタンスが見つからない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/5b4af0e1-e861-7799-b102-92ebf7e29eb3.png)
考えられる理由: ユーザーがリソースを参照する権限がない。
対策：次のようにIAMポリシーを作成する。
`
Allow group ResourceScheduleManagers to read <resource_type> in tenancy
`

※、`<resource_type>`を置き換えてください。
例：all-resources, instances, autonomous-databases, database-family

## 現象-3：スケジュールの実行が失敗した
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/9299cc60-661d-69ac-91b1-decd9306f0b1.png)

考えられる理由: 関連するIAM ポリシーがないか、ポリシーステートメントが正しくない。
対策：次のようにIAMポリシーを作成してから、再度試してみてください。
```
Allow any-user to manage instance in compartment PoC where all {request.principal.type='resourceschedule', request.principal.id='<ocid_of_resourceschedule>'}
```

以上

楽しくお金を節約しましょう。Happy money saving!

----
__関連記事__
[OCIインスタンスの自動起動・停止](https://qiita.com/letian/items/2f059ec0ce4139632a11)
[コスト節約術](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)

----
__ドキュメント__
リソース・スケジューラの概要: [英語](https://docs.oracle.com/en-us/iaas/Content/resource-scheduler/concepts/resourcescheduler-overview.htm) [日本語](https://docs.oracle.com/ja-jp/iaas/Content/resource-scheduler/concepts/resourcescheduler-overview.htm)
サンプル・ポリシー: [英語](https://docs.oracle.com/en-us/iaas/Content/resource-scheduler/references/example_policies.htm) [日本語](https://docs.oracle.com/ja-jp/iaas/Content/resource-scheduler/references/example_policies.htm)