ノート:
- このチュートリアルでは、Oracle Cloudへのアクセスが必要です。無料アカウントにサインアップするには、Oracle Cloud Infrastructure Free Tierの開始を参照してください。
- Oracle Cloud Infrastructureの資格証明、テナンシおよびコンパートメントの値の例を使用します。演習を完了するときに、これらの値をクラウド環境に固有の値に置き換えます。
イベント・ルールおよびPython関数を使用したOCIコンピュート・インスタンスに対してのみ、インスタンス・メタデータ・サービスのバージョン2への更新を自動化します
イントロダクション
クラウド環境間のセキュリティと一貫性の確保は、最新の企業にとって最優先事項です。Oracle Cloud Infrastructure (OCI)では、インスタンス・メタデータ・サービス(IMDS)は重要なインスタンス固有の情報を提供し、バージョン2 (IMDSv2)の使用を強制することで、セッションベースの認証を要求することでセキュリティを強化します。すべてのOCI ComputeインスタンスでIMDSv2へのアップグレードを自動化することは、手作業によるオーバーヘッドを削減しながら、このセキュリティ標準を維持するための効果的な方法です。
このチュートリアルでは、OCIイベント・サービス・ルールおよびOCI関数を使用して、IMDSv2更新を強制する自動化されたイベント駆動型ワークフローを構築する方法を示します。Pythonベースの自動化を活用することで、必要なOCIリソース(動的グループ、イベント・ルール、サーバーレス機能など)を作成して構成し、この強化されたセキュリティ・プロトコルへのコンプライアンスをシームレスに確保します。
目的
- OCIでIMDSのバージョン2への更新を自動化することで、インスタンス・メタデータ・アクセスのセキュリティと制御が向上します。イベント・ルールおよびPython関数を使用することで、新しいインスタンスが起動されるたびにこの更新を強制する自動ワークフローを作成できます。このアプローチにより、クラウド環境全体で一貫性を維持しながら、インスタンス・メタデータ設定の管理が簡素化されます。
前提条件
-
Oracle Cloud Infrastructureコマンドライン・インタフェース(OCI CLI)およびPythonソフトウェア開発キット(SDK):プログラムによるアクセスのためにOCI CLIおよびPython SDKをインストールおよび構成します。
-
Oracle Cloud Infrastructure Identity and Access Management (OCI IAM)ポリシー:動的グループ、関数およびイベント・ルールを管理するために必要なOCI IAMポリシーが設定されていることを確認します。
-
コンパートメントOracle Cloud Identifier (OCID):リソースがデプロイされるコンパートメントのOCIDを取得します。
-
Python環境: OCIライブラリがインストールされた状態でPythonを設定します(
pip install oci
)。 -
OCI Functions Setup: OCI Functionsがテナンシで有効になり、Docker環境がデプロイメント用に構成されていることを確認します。
-
ユーザー権限: OCIリソースを作成および管理する権限があることを確認します。
タスク1: 動的グループの作成
ファンクションがターゲット・インスタンスにアクセスできるようにする動的グループを定義します。他のOCIサービスを使用するには、ファンクションが動的グループの一部である必要があります。
ALL {resource.type = 'fnfunc'}
一致ルールを指定する場合は、コンパートメント内のすべての関数を次と一致させることをお薦めします:
ALL {resource.type = 'fnfunc', resource.compartment.id = 'ocid1.compartment.oc1..aaaaaxxxxx'}
タスク2: OCI IAMポリシーの定義
動的グループがコンピュート・インスタンスを管理できるようにする新しいポリシーを作成します。特定のコンパートメント内のインスタンスへの管理アクセス権を付与します。
Allow dynamic-group dmg-for-functions to manage instance-family in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to manage functions-family in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to use virtual-network-family in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to manage instances in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to read repos in compartment Compartment-Name
タスク3: OCIファンクションの作成およびデプロイ
IMDS更新用のファンクションを作成、デプロイおよび起動します。
-
OCIコンソールでアプリケーションを作成します。
OCIコンソールにログインし、「開発者サービス」、「ファンクション」に移動して、「アプリケーション」をクリックします。OCI Functionsに適したリージョンを選択し、「アプリケーションの作成」をクリックします。
-
ファンクション・デプロイメント用の環境を設定し、OCI Cloud ShellまたはOCI Computeインスタンス(Oracle Linux 8を実行中)またはファンクションの作成およびデプロイを計画しているシステム上で次の設定を実行します。
-
CLIのインストール、Fn Project CLIのインストールおよびOracle Cloud Infrastructure Python SDKのインストールのリソースをインストールします。
-
OCIコンピュート・インスタンス上のOCI Functions QuickStartの詳細なセットアップ・ガイドに従って、環境を準備します。この準備により、OCI Functionsをシームレスに作成、デプロイおよび管理するための環境の準備が整います。
ノート:ファンクション・イメージのOCIレジストリにリポジトリが作成されていることを確認します。
-
-
OCI Cloud ShellまたはOCI Computeインスタンスにログインし、ファンクションを作成するOCI Cloud ShellまたはOCI Computeインスタンスにアクセスします。OCI Functions CLIのコンテキストを設定して、ファンクションがデプロイされるリージョンを指定します。
fn use context <region-name> Replace <region-name> with the appropriate region (e.g., ap-hyderabad-1).
-
コンパートメントIDでコンテキストを更新します。次のコマンドを実行して、アプリケーションが存在するコンパートメントを設定します。
fn update context oracle.compartment-id <compartment-ocid>
-
OCIレジストリを設定します。ファンクション・イメージを区別する一意のリポジトリ名接頭辞を入力します。次のコマンドを使用して、レジストリを更新します。
fn update context registry <region-key>.ocir.io/<tenancy-namespace>/<repo-name-prefix> Example: ap-hyderabad-1.ocir.io/namespace/prefix.
-
ユーザー・プロファイルのOCIコンソールから認証トークンを生成し、次のコマンドを実行して、認証トークンを使用してコンテナ・レジストリにログインします。
docker login -u '<tenancy-namespace>/<user-id>' <region-key>.ocir.io
-
アプリケーションをリストして、アプリケーションが正しく設定されていることを確認します。アプリケーションをリストするには、次のコマンドを実行します。
fn list apps
-
Pythonランタイムを使用して
imdsupdate
という名前の新しい関数を作成し、その関数を初期化します。fn init --runtime python imdsupdate
-
次のコマンドを実行して、作成したディレクトリに移動します。
cd imdsupdate
-
ls
コマンドを実行して、生成されたファイルをリストします。ls
タスク4: Python関数コードの更新
-
生成されたPythonファイル(たとえば、
func.py
)をディレクトリで開いて編集し、次のpythonコードをロジックの関数ファイルに追加します。import io import json import logging from fdk import response import oci def handler(ctx, data: io.BytesIO = None): try: # Authenticate using Instance Principals signer = oci.auth.signers.get_resource_principals_signer() body = json.loads(data.getvalue()) logging.getLogger().info("Event body: " + str(body)) # Extract Required Details From Event Rule instance_id = body["data"]["resourceId"] # Instance OCID action_type = body["eventType"] logging.getLogger().info("Action type: " + action_type) # Proceed only if instance creation event if action_type == "com.oraclecloud.computeapi.launchinstance.end": compute_client = oci.core.ComputeClient(config={}, signer=signer) update_instance_imds(compute_client, instance_id) except (Exception, ValueError) as ex: logging.getLogger().error("Error: " + str(ex)) return response.Response( ctx, response_data=json.dumps({"message": "Error: " + str(ex)}), headers={"Content-Type": "application/json"}, ) return response.Response( ctx, response_data=json.dumps({"message": "Function executed successfully"}), headers={"Content-Type": "application/json"}, ) def update_instance_imds(compute_client, instance_id): """ Updates the instance metadata service (IMDS) configuration to disable legacy endpoints. """ try: # Fetch instance details instance_details = compute_client.get_instance(instance_id).data # Update instance configuration update_details = oci.core.models.UpdateInstanceDetails( instance_options=oci.core.models.InstanceOptions( are_legacy_imds_endpoints_disabled=True # Disable legacy endpoints ) ) response = compute_client.update_instance(instance_id, update_details) logging.getLogger().info( f"Successfully updated IMDS for instance {instance_id}: {response.data}" ) except Exception as ex: logging.getLogger().error("Failed to update IMDS: " + str(ex)) raise
-
requirements.txt
ファイルを更新します。fdk>=0.1.86 oci==2.138.0
-
次のコマンドを実行して、作成したアプリケーションにファンクションをデプロイします。
fn -v deploy --app <application-name> Example: fn -v deploy --app functionpyth.
これらのステップにより、OCIでIMDSバージョンの更新を自動化するためにファンクションが作成され、デプロイされ、起動する準備が整います。
タスク5: イベント・ルールの定義
OCI Events Serviceを使用して、新しいOCI Computeインスタンスが作成されたタイミングを検出します。
イベント・ルールを構成するには、次の情報を入力します。
- イベント・ソース: 「コンピュート・インスタンス」を選択します。
- 条件: 「イベント・タイプ」として「インスタンス- 起動終了」を選択します。
- 処置: 「ファンクションのトリガー」を選択し、「ファンクション」、「ファンクション・コンパートメント」、「ファンクション・アプリケーション」およびタスク4で作成したトリガーするファンクションを入力します。
タスク6: インスタンスIMDS値の検証
新しいインスタンスを起動してイベント・ルールをトリガーし、インスタンス・メタデータ・サービス構成を確認します。仮想マシン(VM)の作成が完了すると、IMDS値がバージョン2のみに自動的に設定されます。
これらの構成はリージョン固有およびコンパートメント固有です。別のコンパートメントで同じファンクションをコールする場合は、そのコンパートメントにイベント・ルールを作成し、このファンクションをトリガーするルールを設定します。
これらのタスクを完了することで、特定のコンパートメント内のOCIコンピュート・インスタンスのIMDSバージョンをv2に更新するプロセスを自動化します。
関連リンク
承認
- 著者 - Akarsha I K (クラウド・アーキテクト)
その他の学習リソース
docs.oracle.com/learnの他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerになります。
製品ドキュメントは、Oracle Help Centerを参照してください。
Automate the Instance Metadata Service update to version 2 only for OCI Compute Instances using Event Rules and Python Functions
G24781-01
January 2025