はじめに
クラウドインフラの構築において、コンソール画面から手動でリソースを作成するのは直感的でわかりやすい反面、スケールアップ時や定期的な環境構築においてはヒューマンエラーの原因となり、運用負荷も高くなります。 そこで今回は、Oracle Cloud Infrastructure (OCI) のPython SDK と、認証情報をコードに持たせないセキュアな仕組みである インスタンス・プリンシパル を組み合わせて、コンピュート・インスタンス(Oracle Linux)を自動でプロビジョニング(IaC)する方法を紹介します。
OCI Python SDKとは
Oracle Cloud Infrastructure(OCI)を操作する方法はいくつかあります。Webブラウザから操作する OCIコンソール(GUI)、コマンドで操作する CLI(コマンドラインインタフェース)、そしてアプリケーションやスクリプトに組み込んで使う SDK(ソフトウェア開発キット) です。
OCI Python SDK は、Pythonコードの中からOCIのリソースを作成・操作・管理できるライブラリです。OCIを「コード」(Python言語)で操作します。 今回は、その中から「コンピュート・インスタンスを作成する」をコードで実現します。
前提条件
- 開発用コンパートメントに操作用VM:Pythonコードを実行するVM(コンピュート・インスタンス)を用意されていること
- 操作用VMにインスタンス・プリンシパルの権限付与されていること ※インスタンス・プリンシパルについては後述します
- 操作用VMにPythonがインストールされていること:バージョン3.12.2を使用します
作成するリソースの仕様
サンプル版がベースであるため、作成するコンピュートやネットワークには以下の仕様・制約があります
- VCNとサブネットは引数指定した同じCIDRブロックで作成します
- スクリプトを実行するホストのみ、ssh接続が可能です
Python SDKのインストール
- Python SDKのダウンロード
$ cd $HOME
$ git clone https://github.com/oracle/oci-python-sdk
- Python SDKのインストール
$ python3 -m venv .venv
$ source .venv/bin/activate
(.env)$ cd oci-python-sdk
(.env)$ pip install .
(.env)$ pip list -v
インスタンス・プリンシパルの設定
1.動的グループの作成
(1) OCIコンソール左上のナビゲーションメニューからアイデンティティとセキュリティ ー ドメイン を選択します
(2) 現在のドメイン/Defaultの動的グループ画面で開きます
(3) 動的グループの作成ボタンを押して、dyngrp-sdk-instanceを作成します
一致ルール: All instance.compartment.id = ‘開発コンパートメントのocid’
2.ポリシー
(1) OCIコンソール左上のナビゲーションメニューから「アイデンティティとセキュリティ ー ポリシー」を選択します
(2) 適用済フィルタ で開発コンパートメント(構築したいVMが所属するコンパートメント)を選択します
(3) ポリシーの作成ボタンを押して、pol-dyngrp-sdkを作成します
ポリシー文: Allow dynamic-group dyngrp-sdk-instance to manage all-resources in compartment <開発コンパートメント名>
Pythonコードの作成
OCI公式が提供しているPython SDKのサンプルコード(launch_instance_example.py)をベースに、今回の目的に合わせてコードを改修します。
ここでは、オリジナルから変更した3つの重要なポイントに絞って解説します。
変更点1:APIキー認証からインスタンス・プリンシパル認証へ
元のサンプルコードではローカルのAPIキーを読み込む設定になっていますが、今回は操作用VM自体に権限を持たせる「インスタンス・プリンシパル」を使用するため、認証部分を以下のように書き換えます。
【変更後】
Python
# インスタンス・プリンシパルを使用した認証
signer = oci.auth.signers.InstancePrincipalsSecurityTokenSigner()
identity_client = oci.identity.IdentityClient(config={}, signer=signer)
compute_client = oci.core.ComputeClient(config={}, signer=signer)
この変更により、コード内にクレデンシャル(認証情報)を直接持たせる必要がなくなり、よりセキュアな運用が可能になります。
変更点2:Always Freeで使えるシェイプへの変更
デフォルトのシェイプ設定から、Always Free枠で利用可能なARMベースのシェイプ(VM.Standard.A1.Flex)に変更します。
【変更箇所】
Python
# シェイプをVM.Standard.A1.Flexに指定
shape_name = 'VM.Standard.A1.Flex'
これにより、コストを気にすることなく検証環境を自動構築できるようになります。
変更点3:作成直後の削除(Terminate)処理の抑止
元のサンプルコードはあくまで「作成から削除までのテスト」を目的としているため、スクリプトの最後にインスタンスを削除(Terminate)する処理が含まれています。今回は構築したVMを継続して利用するため、削除処理をコメントアウト(または削除)します。
【変更箇所】
Python
# 以下の処理をコメントアウト、もしくは削除します
# print('Terminating Instance: {}'.format(instance.id))
# terminate_instance(compute_client_composite_operations, instance)
Pythonコードの実行 – VM構築
準備が整ったら、操作用VM上でいよいよスクリプトを実行します。引数には、先ほど確認したコンパートメントのOCID、VCNのCIDRブロックを指定します。
【実行コマンド】
$ python launch_instance.py <コンパートメントOCID> <VCN CIDRブロック> <公開鍵ファイルのパス>
スクリプトを実行すると、VCNやサブネットなどのネットワークリソースが順に作成され、最後にコンピュート・インスタンスが起動します。
【実行ログ(抜粋)】
Launching Instance ...
(中略: VCNやサブネットなどネットワークリソースのプロビジョニング)
Launching Instance with Network Security Group ...
Instance <ocid1.instance.oc1.ap-tokyo-1...> is now in state RUNNING
Public IP: xxx.xxx.xxx.xxx
Private IP: 172.20.1.xxx
わずか40秒ほどで、VM.Standard.A1.FlexシェイプのOracle Linux 9インスタンスが構築されました。
無事に構築できたかの確認
OCIコンソールの「コンピュート」>「インスタンス」画面を開いて確認します。

まとめ
今回は、OCI Python SDKを使って実際にOracle Linuxが稼働するVMを1つ作成してみました。 コードによる構築はOCI CLIを使ってもできますが、SDK + Python(他の言語で同様ですが)は より複雑な環境や、他のリソースとの連携といった部分も柔軟に対応できそうです。
インフラの自動化は、Terraformの利用が定番といった感じもありますが、プログラミング好きな あなたには、こういったアプローチはいかがでしょうか?


