
同じことをずっと手作業で繰り返すの大変…
自動化できたら最高なのに…
もし一度でも こう感じたことがあるのなら、この記事はあなたにピッタリでしょう!

こんにちは!
私は「サイレントAI・オートパイロット収益化プラン」という、ちょっと大げさな名前の個人プロジェクトを進めている者です。
これは、Oracle Cloud Infrastructure (OCI) の無料枠などを限界まで使いこなし、SNS投稿からブログ記事の作成までを、ほぼコストゼロで全自動化してしまおうという壮大な(無謀な?)計画です!
私のように少しでも楽をしたいと思っている人間にとって、「自動化」という言葉の響きは魔性の魅力ですよねw
というわけで、今回の記事では
この記事で紹介した「Oracle Cloud無料枠でAI自動化サーバーを構築する」際に発生する
サーバー取得の順番待ちによる「インスタンス作成トライの手動実行」
を自動化するために、Windows PC上に「OCIの仮想マシン(VM)を、スクリプトで自動的に確保する環境」を構築する方法をご紹介しようと思います!!
慣れない人にとっては難しい単語も多いですが、できるだけ丁寧に解説しますので、ご安心ください!
それでは、一緒に自動化環境を作っていきましょう!
フェーズ1:すべての基本!OCI CLIのインストール

まず最初に、あなたのPCからOCIを自由自在に操るためのツールである「OCI CLI」をインストールします。
OCI CLIとは、一言で言うと「文字の命令(コマンド)でOracle Cloud Infrastructure (OCI)を操作するための公式ツール」のこと。

要するに、サーバー取得を自動化するための最重要ツールということですね!
Windowsユーザー向けに、ウィザードに従ってポチポチ進めるだけで終わる、最も簡単な方法を紹介します。
1. 最重要!インストーラの「正しい」選び方
何事も最初が肝心。ここで間違うと、後で面倒な設定地獄にハマる可能性があります。
- ①ダウンロードページを開く
まずは、OCI CLIの公式リリース一覧ページ(GitHub)を開きましょう。
- ②対象の拡張子がついたものを探す
ズラッと英語のページが表示されますが、焦らず下にスクロールして、ファイル名に .msi という拡張子がついたものを探します。
超注意点ページの一番上にある「Latest (最新版)」がZIPファイルだったとしても、絶対にそれを選ばないでください!!
ZIP版は、後から「環境変数」という面倒な手作業が必要になります。
その点、.msi形式のインストーラなら、面倒な設定はすべてお任せ。初心者はこちらを選びましょう。
(もちろん、知識がある方ならZIPファイルでもOKです!)
【2025年7月時点】
Latest表記があるバージョンのダウンロード部分の参考画像が以下↓この画像には.msiという拡張子がないため、今回の対象外になります。
- ③見つけたらダウンロードする
別のバージョンを探し、「Assets」となっている部分を探してください。ここをクリックすると、以下のように一覧が展開されます。
oci-cli-X.X.X-Windows-Server-Installer.msi
一覧のなかに このような名前のファイルを見つけたら、クリックしてダウンロードしましょう。
2. ウィザードに従ってインストールを実行
ダウンロードした.msiファイルをダブルクリックすれば、おなじみのインストールウィザードが起動します。
ここは特に迷うことはないはず。
- Select destination directory: 「Next」をクリック。
- インストール画面: そのまま待機。
- Completing the oci-cli installer: これが表示されたら、「Finish」ですべて完了です。
3. インストールできたか確認
正しくインストールできたか、一緒に確認してみましょう。
ここでも一つ、初心者がハマりがちな罠があります。
- ①黒い画面を表示する
PCのスタートメニューから「コマンド プロンプト」または「Windows PowerShell」を新しく起動しましょう。
- ②コマンドを入力する
起動した黒い画面(コンソール)に、以下のコマンドを打ち込んでEnterキーを押してみてください。
oci --version
「3.62.2」のように、バージョン番号が表示されれば大成功です!
【ハマりポイント】

このように表示された場合はエラーなんですが、可能性としてはふたつあります。
①インストールができていない(画像はインストールしてないPCで実行した結果)
②インストール前から開いていたコンソールを使っている
PCは、新しいソフトが入った場合、インストール後に開いたコンソールでしか認識してくれません。
「なんかうまく動かない…という時は、まずコンソールを再起動」
これを覚えておくと、今後の人生で何度もあなたを救ってくれるはずですよ!
フェーズ2:PCとOCIを繋ぐ「合言葉」の設定 (対話形式)

インストール完了後は、あなたのOCIアカウントを認識できるように「合言葉」を設定していきましょう。
これも「oci setup config」というたった一つのコマンドで、親切な質問に答えていくだけで完了しますよ!
1. 設定に必要な3つの「ID」を準備する
設定を始める前に、まずはOCIコンソールから3つの情報(OCIDと呼ばれる、長い文字列のID)を取得します。
コピーして、メモ帳などに貼り付けておきましょう。
- ①OCIコンソールに行く
- ②ユーザーOCID
あなた自身のIDです。
コンソール右上の人型アイコン → あなたのユーザー名 → 「ユーザー詳細」画面でコピーできます。「ocid1.user.oc1..」から始まる長い文字列が対象ID。
- ③テナンシーOCID
あなたが契約しているOCI環境全体のID。
人型アイコン → 「テナンシ: (あなたのテナンシ名)」 → 「テナンシ詳細」画面でコピーできます。「ocid1.tenancy.oc1..」から始まる長い文字列が対象ID。
- ④ホーム・リージョン識別子
あなたが主に使っているデータセンターの場所を示すID。
東京リージョンならap-tokyo-1となります。以下から探してください。
1: af-johannesburg-1 2: ap-chiyoda-1 3: ap-chuncheon-1 4: ap-chuncheon-2 5: ap-dcc-canberra-1 6: ap-dcc-gazipur-1 7: ap-delhi-1 8: ap-hyderabad-1 9: ap-ibaraki-1 10: ap-melbourne-1 11: ap-mumbai-1 12: ap-osaka-1 13: ap-seoul-1 14: ap-seoul-2 15: ap-singapore-1 16: ap-singapore-2 17: ap-suwon-1 18: ap-sydney-1 19: ap-tokyo-1 20: ca-montreal-1 21: ca-toronto-1 22: eu-amsterdam-1 23: eu-crissier-1 24: eu-dcc-dublin-1 25: eu-dcc-dublin-2 26: eu-dcc-milan-1 27: eu-dcc-milan-2 28: eu-dcc-rating-1 29: eu-dcc-rating-2 30: eu-dcc-zurich-1 31: eu-frankfurt-1 32: eu-frankfurt-2 33: eu-jovanovac-1 34: eu-madrid-1 35: eu-madrid-2 36: eu-marseille-1 37: eu-milan-1 38: eu-paris-1 39: eu-stockholm-1 40: eu-zurich-1 41: il-jerusalem-1 42: me-abudhabi-1 43: me-abudhabi-2 44: me-abudhabi-3 45: me-abudhabi-4 46: me-alain-1 47: me-dcc-doha-1 48: me-dcc-muscat-1 49: me-dubai-1 50: me-jeddah-1 51: me-riyadh-1 52: mx-monterrey-1 53: mx-queretaro-1 54: sa-bogota-1 55: sa-santiago-1 56: sa-saopaulo-1 57: sa-valparaiso-1 58: sa-vinhedo-1 59: uk-cardiff-1 60: uk-gov-cardiff-1 61: uk-gov-london-1 62: uk-london-1 63: us-ashburn-1 64: us-ashburn-2 65: us-chicago-1 66: us-gov-ashburn-1 67: us-gov-chicago-1 68: us-gov-phoenix-1 69: us-langley-1 70: us-luke-1 71: us-phoenix-1 72: us-saltlake-2 73: us-sanjose-1 74: us-somerset-1 75: us-thames-1)
2. 対話形式で設定を進める
準備ができたら、コンソールを新しく開いて、以下のコマンドを実行します。
oci setup config
英語でいくつか質問されますので、以下を参考にしつつ入力していきましょう。
- Enter a location for your config …: 設定ファイルの保存場所です。何も入力せず、そのままEnterでOK。
- Enter a user OCID …: 準備しておいたユーザーOCIDを貼り付けてEnter。
- Enter a tenancy OCID …: 準備したテナンシーOCIDを貼り付けてEnter。
- Enter a region …: 準備したホーム・リージョン識別子(例: ap-tokyo-1)を入力してEnter。
- Generate a new RSA key pair? …: PCとOCIが安全に通信するための「鍵」を新しく作りますか?という質問です。Y と入力してEnter。
- Enter a directory for your keys …: 鍵の保存場所。そのままEnterでOK。
- Enter a name for your key …: 鍵のファイル名。これもそのままEnterで大丈夫です。
- Enter a passphrase for your key …: 今回はパスワードなしで設定します。N/A と入力してEnter。(N/Aと入力しても実際の画面には表示されませんが、正常です)
- Repeat for confirmation: …: 確認のため、もう一度 N/A と入力してEnter。

これで、あなたのPCとOCIを繋ぐための基本的な設定は完了しました!
フェーズ3:作成した「公開鍵」をOCIコンソールに登録

先ほどの手順で、あなたのPCに「秘密鍵」と「公開鍵」というペアのファイルが作成されました。
これは、あなたが家の「鍵(秘密鍵)」を持ち、信頼できる相手(OCI)に「合鍵(公開鍵)」を渡しておくようなイメージです。
このフェーズでは、その「合鍵」をOCIに登録する作業を行います。
1. PC上の「公開キー」の中身をまるごとコピー
- ①対象フォルダを見つける
エクスプローラーを開く→「C:」を選択→「ユーザー」を選択→自分のユーザー名を選択→「.oci」というフォルダに移動します。
(.ociは隠しフォルダになっているかもしれません) - ②合鍵ファイルを選択
oci_api_key_public.pem というファイルを見つけてください。これが合鍵です。
- ③メモ帳で開く
このファイルを右クリックし、「メモ帳で編集」で開きましょう。
- ④テキストをすべて選択してコピー
何やら暗号のような文字列が表示されますが、恐れることはありません。
BEGIN PUBLIC KEY から END PUBLIC KEY まで、表示されているテキストをすべて選択してコピー(Ctrl+C) します。

コピーできてるか不安な方は、別のメモ帳を開いて貼り付けてみるといいですよ!
2. OCIコンソールに合鍵を登録
- ①OCIコンソールに行く
- ②ユーザー詳細画面に行く
右上の人型アイコン → あなたのユーザー名 をクリックして「ユーザー詳細」画面へ。
- ③「トークンおよびキー」を選択
画面が切り替わったら「APIキーの追加」ボタンを押しましょう。
- ④公開キーの貼り付け
赤:まずは「公開キーの貼付け」を選択
青:次に「公開キー」という大きな枠内に、先ほどコピーした内容を全部貼付けましょう
緑:最後に「追加」ボタンを押して完了です!
リストに新しいキーが追加され、「フィンガープリント」というIDが表示されたら登録完了。

これでOCIは、あなたのPCからのアクセスを「本人だ!」と信頼してくれるようになりました!
フェーズ4:いよいよ本丸!VM自動確保スクリプトの作成

お待たせしました。いよいよ、この仕組みの心臓部であるPythonスクリプトを作成します。
「え、プログラミング?」
と不安に思うかもしれませんが、大丈夫。今回はコードをコピペして、一部を書き換えるだけです。
もし、あなたのPCにPythonが入っていなければ、Microsoft Storeからインストールするのが一番簡単でおすすめですよ!
1. スクリプトのコードを準備する
まず、Windowsのメモ帳を開いて、以下のコードをそのまま全部コピーして貼り付けてください。
import subprocess
import time
import datetime
import os
import sys
import json
import shlex
# --- ユーザー設定項目 (ここをご自身の情報に書き換えてください!) ---
COMPARTMENT_ID = "ここにコンパートメントOCIDを貼り付け"
IMAGE_ID = "ここにイメージOCIDを貼り付け"
SUBNET_ID = "ここにサブネットOCIDを貼り付け"
AVAILABILITY_DOMAIN = "ここにドメインを貼り付け" # 例: sokM:AP-OSAKA-1-AD-1 など
# --- 基本的に変更不要な項目 ---
SHAPE = "VM.Standard.A1.Flex"
OCPUS = 1
MEMORY_IN_GBS = 6
RETRY_INTERVAL_SECONDS = 300
# --- スクリプト本体 (ここから下は変更しないでください) ---
def print_message(level, message):
""" タイムスタンプ付きでメッセージを出力する関数 """
timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f"[{timestamp}] [{level.upper()}] {message}")
sys.stdout.flush()
def run_command(command_list): # ← 引数の名前を変更
""" OCI CLIコマンドを実行し、結果を返す関数 """
result = subprocess.run(
command_list, # ← 引数をそのまま渡す
capture_output=True,
text=True,
shell=False, # ← 安全なFalseに変更
check=False,
encoding='utf-8',
timeout=300
)
return result.stdout, result.stderr, result.returncode
def main():
""" メイン処理 """
print_message("INFO", "OCIインスタンス自動作成スクリプトを開始します。")
if "ここに" in COMPARTMENT_ID or "ここに" in IMAGE_ID or "ここに" in SUBNET_ID:
print_message("ERROR", "スクリプト内のID情報 (COMPARTMENT_ID, IMAGE_ID, SUBNET_ID) を設定してください。")
return
print_message("INFO", "設定チェック完了。インスタンス作成の試行を開始します。")
print_message("INFO", f"設定: Shape={SHAPE}, OCPUs={OCPUS}, Memory={MEMORY_IN_GBS}GB")
print_message("INFO", f"失敗時は{RETRY_INTERVAL_SECONDS}秒ごとに再試行します。停止するにはコンテナを停止してください (Ctrl + C)。")
# shape-config用の辞書を作成し、JSON文字列に変換する(安全な方法)
shape_config_dict = {
"ocpus": OCPUS,
"memoryInGBs": MEMORY_IN_GBS
}
shape_config_json = json.dumps(shape_config_dict)
# 実行するOCI CLIコマンドを構築 (文字列からリストへ変更)
command_string = (
f'oci compute instance launch '
f'--compartment-id "{COMPARTMENT_ID}" '
f'--shape "{SHAPE}" '
f'--subnet-id "{SUBNET_ID}" '
f'--availability-domain "{AVAILABILITY_DOMAIN}" '
f'--image-id "{IMAGE_ID}" '
f'--shape-config \'{shape_config_json}\' '
f'--assign-public-ip true'
)
# 文字列をコマンドのリスト形式に安全に変換
oci_command = shlex.split(command_string)
try:
while True:
print_message("INFO", "インスタンス作成を試行中...")
try:
# OCIコマンドを実行
_stdout, stderr, returncode = run_command(oci_command)
stderr_lower = stderr.lower() # エラーメッセージを小文字に統一して判定しやすくする
# --- 正常終了の判定 ---
if returncode == 0:
print_message("SUCCESS", "🎉🎉 インスタンスの作成に成功しました!Oracle Cloudコンソールを確認してください。 🎉🎉")
break # 成功したのでループを抜ける
# --- 再試行するエラーの判定 ---
elif "out of host capacity" in stderr_lower:
print_message("RETRY", "原因: 容量不足です。再試行します。")
time.sleep(RETRY_INTERVAL_SECONDS)
elif "internal server error" in stderr_lower or "500" in stderr:
print_message("RETRY", "原因: OCIの一時的なエラー(500)です。再試行します。")
time.sleep(RETRY_INTERVAL_SECONDS)
# --- 上記以外の解決不能なエラー ---
else:
print_message("ERROR", "原因: 解決不能なエラーのためスクリプトを停止します。")
print_message("ERROR", f"詳細: {stderr.strip()}")
break # ループを抜けて終了
# --- タイムアウトエラーの判定 ---
except subprocess.TimeoutExpired:
print_message("RETRY", "原因: OCIからの応答がありません (タイムアウト)。再試行します。")
time.sleep(RETRY_INTERVAL_SECONDS)
except KeyboardInterrupt:
print_message("INFO", "スクリプトが手動で停止されました。")
if __name__ == "__main__":
main()
2. スクリプト内のID情報をあなたの情報に書き換える
貼り付けたコードの一番上にある「ユーザー設定項目」の部分を見てください。
# --- ユーザー設定項目 (ここをご自身の情報に書き換えてください!) ---
COMPARTMENT_ID = "ここにコンパートメントOCIDを貼り付け"
IMAGE_ID = "ここにイメージOCIDを貼り付け"
SUBNET_ID = "ここにサブネットOCIDを貼り付け"
AVAILABILITY_DOMAIN = "ここにドメインを貼り付け" # 例: sokM:AP-OSAKA-1-AD-1 など
COMPARTMENT_IDなど、4つの情報をあなたの環境に合わせて書き換える必要があります。
【裏ワザ】ID情報を最速で確認する方法
正直、これらのIDをコンソールのあちこちから探してくるのは、かなり骨が折れます。
私も最初はドキュメントを読み漁って時間を溶かしました…。

で、結局UIの変更などが影響しているのか、確認できず…w
そこでおすすめしたいのが、「失敗したあとのエラーログからIDを拝借する」という裏ワザ。
一番最初にインスタンス作成を試みたあと、容量がなくて失敗し、スタックを作成したと思います。
そして、そのあとは
①スタックの詳細画面に行く
②「適用」ボタンを押してインスタンス作成トライ
③失敗
これを繰り返していることと思いますが、この失敗画面の下のほうにある「ログ」という部分を見てください。

実は、ここにすべての情報が記載されているんです!
ここから探してコピーするのが、一番早くて確実ですよ!
3. スクリプトファイルを保存する
IDの書き換えが終わったら、わかりやすいファイル名(例:auto_create_instance.py)をつけて保存します。
この時、拡張子を「.py」にしないとPythonスクリプトとして認識されません。
そのため、保存時のファイルの種類を「すべてのファイル」にすることをお忘れなく。

デスクトップなど、分かりやすい場所に保存しておきましょう。
フェーズ5:スクリプト実行!自動化の第一歩を踏み出す

さあ、すべての準備が整いました!
作成したスクリプトを実行し、あなたの代わりにVM確保を健気に試み続けてくれる、小さなロボットを起動しましょう!
1. コマンドプロンプトで実行する
新しくコマンドプロンプトを起動したら、以下のコマンドを実行しましょう。
python [Pythonスクリプトのフルパス]
例えば、デスクトップに保存した場合はこのようになります。
(○○○部分は自分のユーザー名です!)
python C:\Users\○○○\Desktop\auto_create_instance.py
フルパスは、対象のファイルやフォルダを右クリック→「パスのコピー」を選択することで取得できますよ!
2. 正常な実行結果を確認する
コマンドを実行すると、コンソールにメッセージが表示され始めます。
以下のような表示が繰り返されていれば、スクリプトは正常に動いているのでご安心を。
[2025-07-23 10:30:00] [INFO] インスタンス作成を試行中…
[2025-07-23 10:30:45] [RETRY] 原因: 容量不足です。再試行します。
[2025-07-23 10:35:45] [INFO] インスタンス作成を試行中…
【最重要】「容量不足」はエラーではありません!
この「原因: 容量不足です。再試行します。」というメッセージを見て、「うわ、失敗した!」と焦らないでください。
これはエラーではなく、「今は空きがないから、時間をおいてまた挑戦するね!」という、スクリプトが正常に動いている証拠なんです。

OCIの無料枠は人気が高く、常にリソースが逼迫しています。
実際私も、取得できるまでに2週間ほどかかりました。
だからこそ、このスクリプトが自分の代わりに何度も何度もトライしてくれる環境がありがたいんですよね。
注意点
自動化することには成功しましたが、知っておいてほしいことがあります。
それが、
やりすぎると制限がかかってスクリプトを停止される
というもの。
これはOCI側による「過度の作成トライによる負荷」を避けるための措置なので仕方ないのですが、私の場合は、
①最初→10回以上連続でトライできた
②その後→5回程度で制限がかかるようになった
という感じでした。
いちおう
RETRY_INTERVAL_SECONDS = 300
この部分の数字を調整することで「再トライまでの時間」を延長してみたりもしたのですが、正直、あまり効果がなかったような…

この自動化による連続トライでOCI側に目を付けられるのが嫌な人は、次に紹介する方法を試してみることをおススメします!
【成功率UPの秘訣】枯渇していない「可用性ドメイン」を探し出す方法

もうひとつ紹介しておきたい方法。
それが、試行する「可用性ドメイン(AD)」を意図的に変更するというテクニックです。
これは、例えるなら
人気のパン屋さんに3つの入口がある時、一番混んでいる正面入口(AD-1)だけでなく、空いているかもしれない裏口(AD-2)や通用口(AD-3)も叩いてみる
という作戦ですね。
同じリージョン(例えば東京)の中でも、リソースの空き状況はADごとに微妙に異なる場合があるのです。
1. あなたの地域の「可用性ドメイン」一覧を確認する
まずは、あなたのOCI環境にどんな「入口」があるのか、その一覧を最も簡単な方法で確認しましょう。
- ①インスタンスを選択
OCIコンソールにログイン後、ナビゲーション・メニュー(左上の三みたいなマーク)から「コンピュート」→「インスタンス」を選択します。
- ②インスタンスを仮作成
「インスタンスの作成」ボタンをクリックして、インスタンス作成画面を開きましょう。
(実際に作成するわけではありません!) - ③可用性ドメインをチェック
「配置」セクションにある「可用性ドメイン」という項目を見つけてください。
この画像には「AD 3」まであるので、3パターン試せるということですね!
このリストが、あなたが試すことのできる「入口」のすべてです。
この文字列を、メモ帳などに控えておきましょう。
2. スクリプトの「AVAILABILITY_DOMAIN」を書き換えて試す
次に、作成したPythonスクリプト 「auto_create_instance.py」 をメモ帳で開きます。
そして、スクリプト上部にあるユーザー設定項目の中から、以下の行を見つけてください。
AVAILABILITY_DOMAIN = "ここにドメインを貼り付け" # 例: sokM:AP-OSAKA-1-AD-1 など
このドメインの最後の部分を、先ほど確認したADリストの、まだ試していない別のAD番号に書き換えて保存します。

あとは、新しいコマンドプロンプトを開き、再度実行するだけ!
もし、変更したADでも容量不足が続くようであれば、また別のADに書き換えて試してみる…というわけですね!
この方法は少し手間がかかりますが、他の人があまり狙っていない「穴場」のADを見つけ出せれば、インスタンスを確保できる可能性は格段に上がります。
行き詰まった時に、ぜひ試してほしい奥の手です!
まとめ:小さな成功体験が、大きな自動化への扉を開く

ここまでお読みいただき、ありがとうございました!
この記事で紹介した手順に沿って作業することで、手動では確保が非常に難しいOCIのAlways Free枠VMを、自動で狙い続けるための環境が整ったはずです。
改めて、今回あなたが乗り越えてきた「ハマりポイント」を振り返ってみましょう。
- インストーラは最新版ではなく、.msi形式を選ぶのが成功への近道だったこと。
- ociコマンドが動かない時は、まずコマンドプロンプトの再起動を試すべきだということ。
- スクリプトに必要な各種OCIDは、ドキュメントを探すよりエラーログから探す方が圧倒的に早いこと。
- そして、スクリプト実行中の「容量不足」はエラーではなく、成功に向けた正常な待機状態だということ。
慣れない単語ばかりで難しかったかもしれませんが、一つ一つの手順をできるだけ丁寧に解説できたかと思います。
今回得られた「自分の手で、面倒な作業を自動化する仕組みを作れた!」という小さな成功体験こそが、より大きな、より面白い自動化の世界へと進むための、何よりの原動力になります。

このVM確保は、私の「サイレントAI・オートパイロット収益化プラン」のほんの始まりに過ぎません!
これから、このVMをベースに、様々な自動化システムを構築していく予定です!
ぜひ、あなたもこの冒険に乗り遅れることなく、一緒に「楽をするための努力」を楽しんでいきましょう!
私の計画の全体像はこちら↓