OCI CLIのインストールと認証から、Resource Managerで構成を再現するまで

※当ページにはAmazonアソシエイト等の広告リンクを含みます。

公式ドキュメントで検証最終検証 2026-11-01編集部出典 19件

OCI CLIをインストールする

使っているOSに合わせて、次のコマンドで入れます。いずれも公式の手順にあるものです(2026-11-01確認)。

# macOS(Homebrew)
brew update && brew install oci-cli

# Linux(インストーラ)
bash -c "$(curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh)"

# Oracle Linux 9
sudo dnf -y install oraclelinux-developer-release-el9
sudo dnf install python39-oci-cli

Windows は、管理者として開いた PowerShell で実行します。

Set-ExecutionPolicy RemoteSigned
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Invoke-WebRequest https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.ps1 -OutFile install.ps1
./install.ps1 -AcceptAllDefaults

入ったら、バージョンを確かめます。

oci --version

認証を設定する

CLIがOCIのAPIを呼ぶには、誰としての呼び出しかを示す必要があります。題材で使うのは次の3つです。

CLI AuthenticationCLIからOCIのAPIを呼ぶ3つの経路
OCI の APIリクエストを受けるIAMポリシーでできることを判定手元のPC手元のPCCompute公開IPなしAPIキー~/.oci/config と秘密鍵セッショントークンブラウザでログイン、既定1時間インスタンスプリンシパル動的グループ、鍵ファイルなし123
  1. APIキー:既定の方式です。公開鍵をユーザーに登録し、秘密鍵で署名します。
  2. セッショントークン:ブラウザでログインして一時的なトークンを受け取ります。各コマンドに --auth security_token を付けます。
  3. インスタンスプリンシパル:Compute 自身の権限で呼びます。各コマンドに --auth instance_principal を付けます。
図1:手元のPCはAPIキーかセッショントークン、Compute はインスタンスプリンシパルで呼ぶ。できることはIAMポリシーで決まる

APIキーを作る

いちばん基本の方式です。

  1. oci setup config を実行する。対話形式で設定ファイルとキーのペアを作れます。
  2. Console の Profile メニューから User settings を開き、Token and keys で Add API Key を選ぶ。
  3. Paste a public key で公開鍵を貼り付け、Add を選ぶ。
  4. 確認のコマンドを実行する。
oci setup config
oci os ns get

設定は ~/.oci/config に入ります。必要な項目は user、fingerprint、key_file、tenancy、region です。東京なら region=ap-tokyo-1 です。行の途中のコメントには対応していないので、コメントは別の行に書きます。

一時的なトークンを使う

手元に長く使う鍵を置きたくなければ、セッショントークンが使えます。

oci session authenticate
oci session validate --profile <profile_name> --auth security_token
oci os ns get --profile <profile_name> --auth security_token

ブラウザでログインするとトークンが保存されます。既定の有効期間は1時間で、oci session refresh --profile <profile_name> で更新できます。更新できるのは最長24時間までです。

Compute ではキーを置かない

Compute の中でCLIを使うときは、キーのファイルを置かず、インスタンスプリンシパルを使います。

oci os ns get --auth instance_principal

環境変数 OCI_CLI_AUTH=instance_principal でも指定できます。事前に、その Compute を含む動的グループとポリシーが必要です。考え方はコンパートメントとIAMの記事で確認できます。

よく使うコマンド

書き方は oci <サービス> <種類> <操作> <オプション> です。まずは読むだけのコマンドで慣れましょう。$C にはコンパートメントのOCIDを入れます。

# Object Storage の名前空間を見る(疎通確認にも使える)
oci os ns get

# リージョンの一覧を表で見る
oci iam region list --output table

# コンパートメントの一覧
oci iam compartment list --all --query "data[].[name, \"lifecycle-state\"]"

# VCNとサブネット
oci network vcn list --compartment-id $C
oci network subnet list --compartment-id $C --vcn-id $VCN_ID

# Compute の名前と状態を表で見る
oci compute instance list --compartment-id $C \
  --query "data[].{Name:\"display-name\", State:\"lifecycle-state\"}" --output table

# アラームの一覧
oci monitoring alarm list --compartment-id $C

表1:覚えておくと便利なオプション

オプション使いどころ
–help使えるオプションを調べる
–queryJMESPath で必要な項目だけ取り出す
–output table表で表示する
–all全ページの結果を取る
–profile設定ファイルのプロファイルを切り替える
–generate-full-command-json-input引数の雛形をJSONで出す。–from-json で実行する

Resource Manager と Terraform の関係

Resource Manager は、OCIの中で Terraform を実行するサービスです。構成そのものは Terraform で書きます。自分のPCで Terraform を動かす場合との違いは、state の扱いです。

表2:手元の Terraform と Resource Manager の違い

項目手元で実行Resource Manager
構成Terraform(.tf)同じ。ファイルは zip や Git などで渡す
state保管先と共有を自分で決めるResource Manager が生成、更新、保管する
同時実行ロックを自分で用意する1つのスタックで動くジョブは1つ
実行terraform plan、applyPlan、Apply、Destroy の各ジョブ
認証provider に設定する構成に認証情報を書かない

用語は2つだけ覚えれば読めます。スタックは、1つの構成に対応するリソースのまとまりです。ジョブは、スタックに対する実行の1回分です。AWS の CloudFormation も、リソースをスタックというまとまりで扱います。ただし、OCI では CloudFormation のテンプレートではなく Terraform で書きます。

Resource Manager構成からリソースができるまで
スタック(Resource Manager)OCI のリソースTerraform 構成zip、Git などPlan ジョブ実行計画を作る人が確認ログを読むApply ジョブ計画を適用VCN などCompute などstate ファイル保管とロックは自動ドリフト検出:実物と構成の差を調べる1234
  1. 渡す:構成をスタックに登録します。ローカルの zip のほか、Git や Object Storage からも作れます。
  2. 計画:Plan ジョブが作る内容を示します。ログを読み、意図しない削除や置き換えがないかを見ます。
  3. 適用:確認した Plan を指定して Apply ジョブを実行します。
  4. 反映:リソースが作られ、state が更新されます。1つのスタックで同時に動くジョブは1つです。
図2:構成をスタックに渡し、Plan の結果を確認してから Apply する。state は Resource Manager が保管する

CLIで同じ流れを実行すると、次のようになります。

# 1. スタックを作る
stack_id=$(oci resource-manager stack create \
  --compartment-id $NETWORK_C \
  --config-source network.zip \
  --terraform-version 1.5.x \
  --variables "{\"region\":\"ap-tokyo-1\",\"compartment_ocid\":\"$NETWORK_C\"}" \
  --query data.id --raw-output)

# 2. Plan を実行し、ログを読む
plan_id=$(oci resource-manager job create-plan-job \
  --stack-id $stack_id \
  --wait-for-state SUCCEEDED \
  --query data.id --raw-output)
oci resource-manager job get-job-logs-content --job-id $plan_id

# 3. 確認した Plan を適用する
oci resource-manager job create-apply-job \
  --stack-id $stack_id \
  --execution-plan-strategy FROM_PLAN_JOB_ID \
  --execution-plan-job-id $plan_id

# あとで:画面の手作業で変わった部分がないか調べる
oci resource-manager stack detect-drift --stack-id $stack_id

題材の構成を再現する考え方

経費申請アプリの全部を1つのファイルに書くと、小さな変更でも全体の Plan を読むことになります。変更の頻度と、壊れたときの影響で分けます。次の分け方は編集部の例です。

表3:題材の構成をスタックに分ける例(上から順に作る)

順スタック主な Terraform リソース変更の頻度
1基盤oci_identity_compartment、oci_identity_policy、oci_budget_budgetまれ
2networkoci_core_vcn、oci_core_subnet、oci_core_internet_gateway、oci_core_nat_gateway、oci_core_service_gateway、oci_core_route_table、oci_core_network_security_groupまれ
3securityoci_kms_vault、oci_bastion_bastionまれ
4appoci_core_instance、oci_database_autonomous_database、oci_load_balancer_load_balancer、oci_waf_web_app_firewall、oci_objectstorage_bucket、oci_ons_notification_topic、oci_ons_subscription、oci_monitoring_alarm多い

BastionのIPを使う受信ルールは、network ではなく Bastion と同じ security スタックに書きます。oci_core_network_security_group_security_rule でNSGへ足すと、作る順番が循環しません。

DBは変更の多い app スタックにあるので、設定の誤りや置き換えで失わないよう、データ用のスタックに分けるか、lifecycle { prevent_destroy = true } を付けることも検討します。Destroy を禁止するポリシーだけでは、Apply の置き換えは防げません。

前のスタックで作ったものの OCID は、次のスタックの変数として渡します。network の構成は、たとえば次のように書き始めます。Resource Manager では provider に必要なのは region だけです。

variable "region" {}
variable "compartment_ocid" {}

provider "oci" {
  region = var.region
}

resource "oci_core_vcn" "main" {
  compartment_id = var.compartment_ocid
  cidr_blocks    = ["10.0.0.0/16"]
  display_name   = "vcn-expense"
  dns_label      = "expense"
}

resource "oci_core_nat_gateway" "main" {
  compartment_id = var.compartment_ocid
  vcn_id         = oci_core_vcn.main.id
  display_name   = "nat-expense"
}
resource "oci_core_route_table" "private_app" {
  compartment_id = var.compartment_ocid
  vcn_id         = oci_core_vcn.main.id
  display_name   = "rt-private-app"

  route_rules {
    destination       = "0.0.0.0/0"
    destination_type  = "CIDR_BLOCK"
    network_entity_id = oci_core_nat_gateway.main.id
  }
}

resource "oci_core_subnet" "private_app" {
  compartment_id             = var.compartment_ocid
  vcn_id                     = oci_core_vcn.main.id
  cidr_block                 = "10.0.1.0/24"
  display_name               = "private-app"
  dns_label                  = "app"
  route_table_id             = oci_core_route_table.private_app.id
  prohibit_public_ip_on_vnic = true
}

これは書き出しです。Service Gateway のルートやほかのサブネットは同じ形で足します。

コンソールでスタックを作ると、region と compartment_ocid は定義しておくだけで値が入ります。CLIの例では --variables で明示します。.tfstate や .terraform は構成に含めません。

秘密情報をコードと state に残さない

ここがいちばん注意するところです。state にはパスワードなどが入ることがあり、read orm-jobs の権限があれば読めます。ジョブの変数は監査ログに平文で残ることもあります。Terraform の sensitive も、画面の表示を隠すだけで、state には保存されます。

対策は次のとおりです。

  • パスワードは Vault のシークレットに置き、Terraform にはシークレットのOCIDだけを渡す。シークレットの作成自体はコードの外で行うと、中身が state に入りません。
  • Autonomous のリソースでは、admin_password の代わりに secret_id を使う。作成する人には対象シークレットの read secret-bundles が要ります。パスワードは12〜30文字で、大文字、小文字、数字を各1文字以上含めます。
  • orm-jobs の読み取り権限を、必要な人に絞る。

Destroy を誰にでも許さない

スタックで作ったリソースは、Destroy ジョブでまとめて解放できます。検証には便利ですが、本番では事故のもとです。公式の例のように、Plan と Apply だけを許可できます。

Allow group <group_name> to use orm-stacks in tenancy
Allow group <group_name> to read orm-jobs in tenancy
Allow group <group_name> to manage orm-jobs in tenancy where any {target.job.operation = 'PLAN', target.job.operation = 'APPLY'}

次に読むページ

よくある質問(FAQ)

OCI CLIのキーは、ComputeへのSSH鍵と同じものを使えますか?
使えません。APIキーはPEM形式で、SSH用の鍵とは別のものです。公開鍵をユーザーに登録し、秘密鍵は手元で管理します。
Resource Managerを使うとTerraformは要らなくなりますか?
構成はTerraformで書きます。Resource Managerは、その構成の実行、stateの保管とロック、ジョブの履歴を引き受けるサービスです。手元にTerraformを入れなくても、スタックとジョブで実行できます。
データベースのパスワードはTerraformの変数に入れてよいですか?
避けます。変数の値はstateや監査ログから読める場合があります。Vaultのシークレットに保管し、構成にはシークレットのOCIDだけを書きます。Autonomous のリソースでは secret_id を使えます。
目次