目的
AWSでIAMポリシーを運用してきた経験がある方でも、OCIの独特な仕様でつまずくことがあると思います。
この記事では、実際の現場を想定したトラブル事例と効果的な解決策、そしてPython SDKを使用した動作確認を行うための検証手順を提示しております。
※記事の内容は参考までにご覧ください。
前提知識
- AWS IAMの基本的な概念を理解している
- OCIのコンソールにアクセス可能
- 基本的なOCIサービス(Compute、Networking等)の操作経験
- Python(バージョンは2025/10/10時点で3.14.0が最新版)がインストール済みであること
トラブル事例1: 条件句の誤り
発生する問題
時間制限やIPアドレス制限をかけたつもりが、期待通りに動作しませんでした。
# 動作しない例
Allow group Contractors to manage compute-instances in compartment Development
where request.time > '09:00' and request.time < '18:00'
正しい実装方法
OCIの条件句は独特な文法があります。
なお、上記の時間制限の記載について、OCIのIAMポリシーでは「時間制限」や「曜日制限」を直接記述する構文は現時点(2025年10月現在)ではそもそも存在していません。
もし、どうしても時間帯に制限をかけたいのであれば、特定時間外にインスタンスを自動で停止/起動するResource Scheduler(リソーススケジューラ) というものを使います。
# IPアドレス制限
# Network Source には、許可するIPレンジやVCN CIDR(10.0.0.0/16や192.168.10.0/24など)
を設定できます
Allow group RemoteUsers to manage compute-instances in compartment Development
where request.networkSource.name = '(事前に登録したNetwork Sourceの名前を記載)'
# リソースタイプによる制限
# 「VM.Standardシリーズの形状のみ管理可」などの制御が可能です。
Allow group Developers to manage compute-instances in compartment Development
where target.instance.shape like 'VM.Standard*'
# タグベースの制限
# タグによる細かいアクセス制御が可能です。
# チームやプロジェクト単位での権限管理に有効
Allow group ProjectA to manage all-resources in compartment Development
where target.resource.freeform-tags.project = 'web-portal'
Python SDKで時間ベースアクセス制限を検証する手順
条件句の動作確認には、以下の手順が有効です。
※ 本手順は学習・検証目的です。本番適用前に必ずテスト環境で確認してください。
【ステップ1】Python SDKをインストール
コマンドプロンプトを開いて以下を実行します。
以下実行結果↓
最後に「Successfully installed...」と出力されていればOKです!
※pip が認識されない場合は、PythonのPATH設定を見直してください。
【ステップ2】APIキーを作成して設定ファイルを準備
①OCIコンソールにログイン
②画面右上(赤枠)のユーザーアイコンをクリック
③プロフィールの中の「User settings」をクリック
④「Tokens and keys」タブをクリック
⑤「add API Keys」をクリックします。
⑥
「1」「Generate API key pair」が選択されていることを確認したら、
「2」
・Download private key(秘密鍵をダウンロード)
・Download public key(公開鍵をダウンロード)(省略可能)
をクリックしてそれぞれの鍵をローカルに落とした後、
「3」「add」をクリックする。
※秘密鍵は 他人に見られないよう 保管してください。誤って公開してしまうとアカウントが危険に晒されます。
⑦ ⑥でダウンロードしたファイル(拡張子が.pemのもの)を「.oci」フォルダの直下に保存します。
C:\Users\<ユーザー名>\.oci\<⑥でダウンロードしたファイル>
※「.oci」ファイルは「.(ドット)」が付いているので要注意!
⑧ ⑥で、最後に「add」ボタンをクリックすると、自動的に設定ファイルのプレビュー画面に遷移します。
設定ファイルには以下の情報が含まれています。
・user(ユーザー OCID)
・fingerprint(先ほど作成した鍵の指紋情報)
・tenancy(テナンシ OCID)
・region(現在選択中のリージョン)
・key_file(秘密鍵ファイルのパス。⑦で保存したパスを記載する)
この設定ファイルの情報をコピーして、メモ帳などのテキストエディタに張り付けて「.oci」フォルダ直下に「config」というファイル名で保存します。
・保存場所
C:\Users\<ユーザー名>\.oci\config
※拡張子 .txt がつかないように注意してください(config.txt はNG)。
【ステップ3】設定ファイルの動作確認
コマンドプロンプトで下記のコマンドを実行する。
【出力例(成功時)】
これでOCI SDKとの接続準備は完了です。
【ステップ4】検証スクリプトを作成
①メモ帳を開いて以下を貼り付けます。
※コード内下部の「compartment_id」には⑧で確認したテナンシIDを置き換えてください。
# 現在時刻をチェック
# 業務時間内かどうか判定
# 実際にOCI APIを呼び出してアクセス可否を確認
# 期待結果と実際の結果を比較
import oci
from datetime import datetime
def test_time_based_access(config, compartment_id):
"""
時間ベースアクセス制限のテスト
注意: request.time.* は実験的機能のため本番前に検証必須
"""
current_hour = datetime.now().hour
print(f"現在時刻: {current_hour}時")
# 業務時間(9-18時)判定
expected_access = 9 <= current_hour < 18
status = "業務時間内" if expected_access else "業務時間外"
print(f"{status} - アクセス{'許可' if expected_access else '拒否'}されるはずです")
try:
# 実際のアクセステスト
compute = oci.core.ComputeClient(config)
compute.list_instances(compartment_id=compartment_id)
actual_access = True
print("アクセス結果: 成功")
except oci.exceptions.ServiceError as e:
actual_access = False
error_messages = {
401: "認証エラー",
403: "権限エラー(時間制限の可能性)",
404: "コンパートメントが見つかりませんでした"
}
print(f"{error_messages.get(e.status, 'エラー')}: {e.message}")
except Exception as e:
actual_access = False
print(f"予期しないエラー: {e}")
# 結果判定
result = "期待通り" if expected_access == actual_access else "設定要確認"
print(f"{result}")
# 使用例
if __name__ == "__main__":
config = oci.config.from_file()
compartment_id = "ocid1.compartment.oc1..aaaaaaaa..." # 実際のOCIDに置換
test_time_based_access(config, compartment_id)
② ファイル名を「time_access_test.py」(拡張子は.py)にして保存します。
【ステップ5】スクリプトを実行
コマンドプロンプトでファイルを保存したフォルダに移動し、以下を実行する(出力例ではDocumentsを保存先に指定している)。
【出力例】
【補足】わざわざSDKで確認する理由
直接コンソールにアクセスできるか手動で確認するだけでも十分な場合があります。
ただし、API経由(SDKやCLI)でのアクセス制御も検証したい場合は、このPythonスクリプトが有効です。
まとめ
これらの解決策を実装することで、セキュアで効率的なOCI環境を構築できます。AWSからOCIに移行する際も、これらの違いを理解することでスムーズな移行が可能になります。