주:

이벤트 규칙 및 Python 함수를 사용하여 OCI 컴퓨트 인스턴스에 대해서만 인스턴스 메타데이터 서비스 업데이트를 버전 2로 자동화

소개

클라우드 환경 전반에서 보안 및 일관성을 보장하는 것이 모던 기업의 최우선 과제입니다. OCI(Oracle Cloud Infrastructure)에서 IMDS(인스턴스 메타데이터 서비스)는 중요한 인스턴스별 정보를 제공하고 버전 2(IMDSv2)의 사용을 적용하면 세션 기반 인증을 요구하여 보안이 향상됩니다. 모든 OCI 컴퓨팅 인스턴스에서 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 함수에 적합한 영역을 선택하고 애플리케이션 생성을 누릅니다.

    OCI Functions

  2. 함수 배치 환경을 설정하고, OCI Cloud Shell 또는 OCI 컴퓨트 인스턴스(Oracle Linux 8 실행) 또는 함수를 생성 및 배치할 시스템에서 다음 설정을 수행합니다.

  3. OCI Cloud Shell 또는 OCI 컴퓨트 인스턴스에 로그인하여 함수를 생성할 OCI Cloud Shell 또는 OCI 컴퓨트 인스턴스에 액세스합니다. 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 이벤트 서비스를 사용하여 새 OCI 컴퓨트 인스턴스가 생성되는 시기를 감지합니다.

이벤트 규칙을 구성하려면 다음 정보를 입력합니다.

이벤트 규칙

작업 6: 인스턴스 IMDS 값 검증

새 인스턴스를 실행하여 이벤트 규칙을 트리거하고 인스턴스 메타데이터 서비스 구성을 확인합니다. VM(가상 시스템) 생성이 완료되면 IMDS 값이 자동으로 버전 2로만 설정됩니다.

이러한 구성은 리전 및 구획에 따라 다릅니다. 다른 컴파트먼트에서 동일한 함수를 호출하려면 해당 컴파트먼트에 이벤트 규칙을 생성하고 이 함수를 트리거할 규칙을 설정합니다.

이 작업을 완료하면 특정 컴파트먼트의 OCI 컴퓨트 인스턴스에 대해 IMDS 버전을 v2로 업데이트하는 프로세스가 자동화됩니다.

확인

추가 학습 자원

docs.oracle.com/learn에서 다른 실습을 탐색하거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하세요. 또한 Oracle Learning Explorer가 되려면 education.oracle.com/learning-explorer을 방문하십시오.

제품 설명서는 Oracle Help Center를 참조하십시오.