※この記事は①の続きとなっております。
①を読んでからこの記事を読むことをお勧めします。
前回の記事→https://qiita.com/tkhsyuk/items/92a5ea85a8e71494eaaf
目的
AWSでIAMポリシーを運用してきた経験がある方でも、OCIの独特な仕様でつまずくことがあると思います。
この記事では、実際の現場を想定したトラブル事例と効果的な解決策、そしてPython SDKを使用した動作確認を行うための検証手順を提示しております。
※記事の内容は参考までにご覧ください。
前提知識
- AWS IAMの基本的な概念を理解している
- OCIコンソールにアクセス可能
- 基本的なOCIサービス(Compute、Networking等)の操作経験
- Python(バージョンは2025/10/16時点で3.14.0が最新版)がインストール済みであること
- 前回の記事を読んでいること→https://qiita.com/tkhsyuk/items/92a5ea85a8e71494eaaf
※AWSでいうところのアカウント構成(Organizations)を、OCIでは「コンパートメント」として扱います。
AWSでは親から子への権限制御が自動的に適用されますが、OCIでは自動継承は行われず、明示的にポリシーで指定する必要があります。
そのため、AWSの仕組みをOCIの構造に置き換えて読むイメージで理解すると分かりやすいです。
トラブル事例2: 継承権限の誤り
発生している問題
親コンパートメントに権限を付与したが、子コンパートメントでアクセスできない状況が発生している。
# 親コンパートメントでは成功
parent_response = compute.list_instances(compartment_id=parent_compartment_id)
# 子コンパートメントで失敗
child_response = compute.list_instances(compartment_id=child_compartment_id)
# ServiceError: NotAuthorized
根本原因
先述の通り、AWSでは親から子へ権限の継承が自動的に行われますが、OCIでは自動的には行われません。明示的に継承を指定する必要があります。
解決策
継承を含む権限設定の書き方↓
# 子コンパートメントも含めて権限を付与
Allow group Managers to manage all-resources in compartment Production or any child compartments of Production
# 特定の階層レベルまで
Allow group TeamLeads to read all-resources in compartment Projects:TeamA or any child compartments of Projects:TeamA
Allow group TeamLeads to manage compute-instances in compartment Projects:TeamA:Development
# 読み取り専用の継承権限
Allow group Auditors to inspect all-resources in compartment Production or any child compartments of Production
# 特定リソースタイプのみの継承
Allow group NetworkAdmins to manage virtual-network-family in compartment Infrastructure or any child compartments of Infrastructure
# 条件付き継承権限
Allow group ContractorTeam to use compute-instances in compartment Development or any child compartments of Development
where target.instance.shape.name like 'VM.Standard.E*'
Python SDKでコンパートメント階層の確認(親子関係の確認)を行う手順
親子関係の確認には、以下の手順が有効です。
※ 本手順は学習・検証目的です。本番適用前に必ずテスト環境で確認してください。
【検証前準備】コンソール画面でコンパートメントを新規作成する
※既にコンパートメントを作成している方は【Python SDKでコンパートメントの階層構造を確認する手順】にスキップしてください
下記リンクからOCIのコンソール画面にログイン
https://www.oracle.com/jp/cloud/free/
②タブの中の「Identity & Security」→「Compartments」を順にクリック

③「Create Compartment(コンパートメントの作成)」をクリック
※初期状態では、テナンシー(root)のみが存在し、階下にコンパートメントがないと思います。
④以下の項目を入力し、「Create Compartment」をクリック(数秒で作成完了します)
・Name:Development (名前は何でもOK)
・Description:テスト用環境 (名前は何でもOK)
・Parent Compartment:rootテナンシ (デフォルトのまま)
以下のようになっていればOK (rootの階下にコンパートメントが1つ追加されている状態)
⑤同様に複数作成して構造を作る
・Name:Production (名前は何でもOK)
・Description:本番用環境 (名前は何でもOK)
・Parent Compartment:rootテナンシ (デフォルトのまま)

・Name:Dev-Sub (名前は何でもOK)
・Description:テスト用サブ環境 (名前は何でもOK)
・Parent Compartment:Development (Developmentを親コンパートメントに設定)

イメージとしては以下のような階層構造になります。
Tenancy(ルート)
├─ Development
└─ DEV-Sub(Developmentが親コンパートメント)
├─ Production
【Python SDKでコンパートメントの階層構造を確認する手順】
上記まで作成したら、以下のスクリプトを実行して階層構造をAPI経由で確認してみましょう。
※Python SDKの設定方法は前回の記事をご参照ください。
https://qiita.com/tkhsyuk/items/92a5ea85a8e71494eaaf
import oci
def show_compartments(config):
identity = oci.identity.IdentityClient(config)
tenancy_id = config["tenancy"]
def recurse(compartment_id, level=0):
response = oci.pagination.list_call_get_all_results(
identity.list_compartments,
compartment_id=compartment_id,
lifecycle_state="ACTIVE",
compartment_id_in_subtree=False
)
for comp in response.data:
print(" " * level + f"├─ {comp.name} ({comp.id[-8:]})")
recurse(comp.id, level + 1)
print("=== コンパートメント階層 ===")
print(f"Root: {tenancy_id[-8:]}")
recurse(tenancy_id)
if __name__ == "__main__":
config = oci.config.from_file()
show_compartments(config)
上記のスクリプトをローカルに「Conparments.py」として保存(名前は何でもOK)
コマンドプロンプトで保存場所の階層に移動し、「python Conparments.py」で実行。
先ほどコンソールで作成したコンパートメントの階層が出力されたら成功です。
※()の中の英数字は省略されたOCIDです。
まとめ
上記の操作で、
・コンソールの構成(手動で確認)
・SDKでの出力(スクリプトで検証)
→コンソールにログインしていなくても階層構造を確認可能
の両方から、親コンパートメントと子コンパートメントの継承関係を確認できます。






