주:
- 이 자습서에서는 Oracle Cloud에 액세스해야 합니다. 무료 계정에 등록하려면 Oracle Cloud Infrastructure Free Tier 시작하기를 참조하십시오.
- Oracle Cloud Infrastructure 자격 증명, 테넌시 및 구획에 예제 값을 사용합니다. 실습을 완료했으면 이러한 값을 자신의 클라우드 환경과 관련된 값으로 대체하십시오.
이벤트 규칙 및 Python 함수를 사용하여 OCI 컴퓨트 인스턴스에 대해서만 인스턴스 메타데이터 서비스 업데이트를 버전 2로 자동화
소개
클라우드 환경 전반에서 보안 및 일관성을 보장하는 것이 모던 기업의 최우선 과제입니다. OCI(Oracle Cloud Infrastructure)에서 IMDS(인스턴스 메타데이터 서비스)는 중요한 인스턴스별 정보를 제공하고 버전 2(IMDSv2)의 사용을 적용하면 세션 기반 인증을 요구하여 보안이 향상됩니다. 모든 OCI 컴퓨팅 인스턴스에서 IMDSv2로 업그레이드를 자동화하는 것은 이 보안 표준을 유지하면서 수동 오버헤드를 줄이는 효과적인 방법입니다.
이 사용지침서에서는 OCI 이벤트 서비스 규칙 및 OCI 함수를 사용하여 자동화된 이벤트 기반 워크플로우를 빌드하여 IMDSv2 업데이트를 적용하는 방법을 보여줍니다. Python 기반 자동화를 활용하여 동적 그룹, 이벤트 규칙 및 서버리스 함수와 같은 필요한 OCI 리소스를 생성하고 구성하여 이 향상된 보안 프로토콜을 원활하게 준수할 수 있습니다.
목표
- OCI에서 IMDS를 버전 2로 업데이트하도록 자동화하면 인스턴스 메타데이터 액세스에 대한 보안 및 제어가 향상됩니다. 이벤트 규칙 및 Python 함수를 사용하여 새 인스턴스가 실행될 때마다 이 업데이트를 적용하는 자동화된 워크플로우를 만들 수 있습니다. 이 접근 방식은 클라우드 환경 전반에서 일관성을 유지하면서 인스턴스 메타데이터 설정 관리를 간소화합니다.
필요 조건
-
Oracle Cloud Infrastructure CLI(명령행 인터페이스) 및 Python SDK(소프트웨어 개발 키트): 프로그래밍 방식 액세스를 위해 OCI CLI 및 Python SDK를 설치하고 구성합니다.
-
Oracle Cloud Infrastructure Identity and Access Management(OCI IAM) 정책: 동적 그룹, 기능 및 이벤트 규칙을 관리하는 데 필요한 OCI IAM 정책을 마련해야 합니다.
-
OCID(구획 Oracle Cloud 식별자): 리소스가 배치될 컴파트먼트의 OCID를 가져옵니다.
-
Python 환경: OCI 라이브러리(
pip install oci
)가 설치된 상태로 Python을 설정합니다. -
OCI 함수 설정: OCI 함수가 테넌시에서 사용으로 설정되고 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 함수에 적합한 영역을 선택하고 애플리케이션 생성을 누릅니다.
-
함수 배치 환경을 설정하고, OCI Cloud Shell 또는 OCI 컴퓨트 인스턴스(Oracle Linux 8 실행) 또는 함수를 생성 및 배치할 시스템에서 다음 설정을 수행합니다.
-
CLI 설치, Fn 프로젝트 CLI 설치 및 Oracle Cloud Infrastructure Python SDK 설치 리소스를 설치합니다.
-
환경을 준비하려면 OCI 컴퓨트 인스턴스의 OCI Functions QuickStart에 설명된 설정 가이드를 따르십시오. 이러한 준비를 통해 OCI Functions를 원활하게 생성, 배포 및 관리할 수 있습니다.
주: OCI 레지스트리에서 함수 이미지에 대해 생성된 저장소가 있는지 확인하십시오.
-
-
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).
-
컴파트먼트 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 이벤트 서비스를 사용하여 새 OCI 컴퓨트 인스턴스가 생성되는 시기를 감지합니다.
이벤트 규칙을 구성하려면 다음 정보를 입력합니다.
- 이벤트 소스: 컴퓨트 인스턴스를 선택합니다.
- 조건: 이벤트 유형을 인스턴스 – 실행 종료로 선택합니다.
- 조치: 함수 트리거를 선택하고 함수, 함수 컴파트먼트, 함수 애플리케이션 및 작업 4에서 생성한 함수를 입력합니다.
작업 6: 인스턴스 IMDS 값 검증
새 인스턴스를 실행하여 이벤트 규칙을 트리거하고 인스턴스 메타데이터 서비스 구성을 확인합니다. VM(가상 시스템) 생성이 완료되면 IMDS 값이 자동으로 버전 2로만 설정됩니다.
이러한 구성은 리전 및 구획에 따라 다릅니다. 다른 컴파트먼트에서 동일한 함수를 호출하려면 해당 컴파트먼트에 이벤트 규칙을 생성하고 이 함수를 트리거할 규칙을 설정합니다.
이 작업을 완료하면 특정 컴파트먼트의 OCI 컴퓨트 인스턴스에 대해 IMDS 버전을 v2로 업데이트하는 프로세스가 자동화됩니다.
관련 링크
확인
- 작성자 - Akarsha I K(클라우드 아키텍트)
추가 학습 자원
docs.oracle.com/learn에서 다른 실습을 탐색하거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하세요. 또한 Oracle Learning Explorer가 되려면 education.oracle.com/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
G24779-01
January 2025