ノート:

イベント・ルールおよびPython関数を使用したOCIコンピュート・インスタンスに対してのみ、インスタンス・メタデータ・サービスのバージョン2への更新を自動化します

イントロダクション

クラウド環境間のセキュリティと一貫性の確保は、最新の企業にとって最優先事項です。Oracle Cloud Infrastructure (OCI)では、インスタンス・メタデータ・サービス(IMDS)は重要なインスタンス固有の情報を提供し、バージョン2 (IMDSv2)の使用を強制することで、セッションベースの認証を要求することでセキュリティを強化します。すべてのOCI ComputeインスタンスでIMDSv2へのアップグレードを自動化することは、手作業によるオーバーヘッドを削減しながら、このセキュリティ標準を維持するための効果的な方法です。

このチュートリアルでは、OCIイベント・サービス・ルールおよびOCI関数を使用して、IMDSv2更新を強制する自動化されたイベント駆動型ワークフローを構築する方法を示します。Pythonベースの自動化を活用することで、必要なOCIリソース(動的グループ、イベント・ルール、サーバーレス機能など)を作成して構成し、この強化されたセキュリティ・プロトコルへのコンプライアンスをシームレスに確保します。

目的

インスタンスIMDS更新

前提条件

タスク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更新用のファンクションを作成、デプロイおよび起動します。

  1. OCIコンソールでアプリケーションを作成します。

    OCIコンソールにログインし、「開発者サービス」「ファンクション」に移動して、「アプリケーション」をクリックします。OCI Functionsに適したリージョンを選択し、「アプリケーションの作成」をクリックします。

    OCI関数

  2. ファンクション・デプロイメント用の環境を設定し、OCI Cloud ShellまたはOCI Computeインスタンス(Oracle Linux 8を実行中)またはファンクションの作成およびデプロイを計画しているシステム上で次の設定を実行します。

  3. 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).
    
  4. コンパートメントIDでコンテキストを更新します。次のコマンドを実行して、アプリケーションが存在するコンパートメントを設定します。

    fn update context oracle.compartment-id <compartment-ocid>
    
  5. OCIレジストリを設定します。ファンクション・イメージを区別する一意のリポジトリ名接頭辞を入力します。次のコマンドを使用して、レジストリを更新します。

    fn update context registry <region-key>.ocir.io/<tenancy-namespace>/<repo-name-prefix>
    Example: ap-hyderabad-1.ocir.io/namespace/prefix.
    
  6. ユーザー・プロファイルのOCIコンソールから認証トークンを生成し、次のコマンドを実行して、認証トークンを使用してコンテナ・レジストリにログインします。

    docker login -u '<tenancy-namespace>/<user-id>' <region-key>.ocir.io
    
  7. アプリケーションをリストして、アプリケーションが正しく設定されていることを確認します。アプリケーションをリストするには、次のコマンドを実行します。

    fn list apps
    
  8. Pythonランタイムを使用してimdsupdateという名前の新しい関数を作成し、その関数を初期化します。

    fn init --runtime python imdsupdate
    
  9. 次のコマンドを実行して、作成したディレクトリに移動します。

    cd imdsupdate
    
  10. lsコマンドを実行して、生成されたファイルをリストします。

    ls
    

タスク4: Python関数コードの更新

  1. 生成された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
    
  2. requirements.txtファイルを更新します。

    fdk>=0.1.86
    oci==2.138.0
    
  3. 次のコマンドを実行して、作成したアプリケーションにファンクションをデプロイします。

    fn -v deploy --app <application-name>
    Example: fn -v deploy --app functionpyth.
    

これらのステップにより、OCIでIMDSバージョンの更新を自動化するためにファンクションが作成され、デプロイされ、起動する準備が整います。

機能コード更新

タスク5: イベント・ルールの定義

OCI Events Serviceを使用して、新しいOCI Computeインスタンスが作成されたタイミングを検出します。

イベント・ルールを構成するには、次の情報を入力します。

イベント・ルール

タスク6: インスタンスIMDS値の検証

新しいインスタンスを起動してイベント・ルールをトリガーし、インスタンス・メタデータ・サービス構成を確認します。仮想マシン(VM)の作成が完了すると、IMDS値がバージョン2のみに自動的に設定されます。

これらの構成はリージョン固有およびコンパートメント固有です。別のコンパートメントで同じファンクションをコールする場合は、そのコンパートメントにイベント・ルールを作成し、このファンクションをトリガーするルールを設定します。

これらのタスクを完了することで、特定のコンパートメント内のOCIコンピュート・インスタンスのIMDSバージョンをv2に更新するプロセスを自動化します。

承認

その他の学習リソース

docs.oracle.com/learnの他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerになります。

製品ドキュメントは、Oracle Help Centerを参照してください。