주:

Oracle Cloud Native Framework를 사용하여 원가 분석 보고서에 대한 이벤트 기반 자동 전자메일 통지 설정

소개

클라우드에서 워크로드를 실행하는 모든 조직은 클라우드에 대한 비용 지출을 매우 중요하게 생각하며 이를 의미 있는 방식으로 보고하고자 합니다. 이를 위해 OCI(Oracle Cloud Infrastructure)는 비용을 기반으로 자동화된 보고서를 생성한 다음 OCI Object Storage에서 해당 보고서를 가져올 수 있는 기능을 제공합니다.

이러한 비용 보고서의 경우 팀은 보고서가 생성되자마자 해당 팀이 통지를 받는 방식으로 자동화를 설정하고자 합니다. 이를 통해 보고서 링크를 통지의 일부로 포함시키고자 합니다. Oracle Cloud Native Framework를 사용하여 이 자동화를 모두 설정할 수 있습니다.

목표

필요 조건

작업 1: 필요한 OCI IAM 정책 및 동적 그룹 설정

  1. OCI 콘솔에 로그인한 후 동적 그룹으로 이동하여 새 동적 그룹을 생성합니다.

    동적 그룹 생성

  2. 규칙 1에 구획 OCID를 입력합니다. OCI 함수는 동일한 구획에 존재해야 합니다.

    동적 그룹 설정

  3. OCI IAM 정책으로 이동하여 다음 명령문을 사용하여 정책을 생성합니다.

    allow dynamic-group dynamic_group_name to manage ons-family in compartment compartment_name
    
    allow dynamic-group dynamic_group_name to manage object-family in compartment compartment_name
    

    참고:

    • 사용 사례에 적합한 보다 구체적인 IAM 정책을 사용하십시오. 아래의 예를 참조하십시오.

      • allow dynamic-group dynamic_group_name to use ons-topics in compartment compartment_name where request.operation = 'PublishMessage'
      • allow dynamic-group dynamic_group_name to manage buckets in compartment compartment_name where all {request.operation = 'CreatePreauthenticatedRequest', target.bucket.name = 'bucket_name'}

작업 2: OCI Object Storage 버킷 설정 및 일정이 잡힌 보고서 생성

  1. OCI 콘솔을 사용하여 버킷을 생성합니다. 이 버킷을 사용하여 보고서를 푸시합니다. 생성한 버킷이 전용인지 확인하십시오. 이렇게 하면 콘텐츠가 공용 액세스로부터 안전하게 보호되고 이 버킷에서 객체 이벤트 제출이 사용으로 설정됩니다. 그러면 새 객체가 푸시될 때 이벤트를 내보낼 수 있습니다.

    버킷 생성

  2. Cost Management, 스케줄링된 보고서로 이동하고 스케줄링된 보고서를 생성합니다. 이름, 설명, 시작 날짜반복을 입력합니다.

    예약된 보고서 생성

    보고서를 게시할 버킷을 선택합니다. 드롭다운 메뉴에서 버킷을 선택하려면 다음 이미지에 표시된 대로 정책을 추가해야 측정 서비스가 생성된 버킷에 액세스할 수 있습니다.

    예약된 보고서 생성

  3. 버킷 및 일정이 잡힌 보고서가 생성되면 실행된 보고서 내역을 확인할 수 있으며, 선택된 OCI Object Storage 버킷에 보고서가 게시되는 것을 확인할 수 있습니다.

    기록 스케줄링된 보고서

작업 3: OCI 통지 항목 생성 및 가입 추가

  1. 전자메일 통지를 전송하는 데 필요한 OCI 통지 토픽을 생성합니다. 통지, 토픽으로 이동하고 토픽을 생성합니다.

    주제 생성

  2. 동일한 토픽에 구독을 생성하고 통지가 전송될 전자메일을 추가합니다.

    구독 생성

    이제 OCI Notifications 항목이 구성됩니다.

작업 4: 함수 코드 생성 및 배치

functions/applications로 이동하여 함수를 생성합니다. 이 함수는 OCI IAM 동적 그룹 및 정책을 사용하여 OCI Object Storage 버킷에 액세스하고 이벤트 내보내기에 의해 함수가 트리거될 때 필요한 작업(일정이 잡힌 보고서 파일에 대한 PAR URL 생성 및 통지 전송)을 수행합니다.

OCI Functions 개발에 사용할 수 있는 다양한 접근 방식이 있으며, OCI Cloud Shell, OCI 가상 머신 또는 로컬에서 실행되는 개발 환경을 설정하는 과정을 안내하는 빠른 시작 가이드를 제공합니다. 이 가이드의 나머지 부분에 있는 이미지에는 OCI Cloud Shell이 표시되지만, 이러한 접근 방식은 모두 유효합니다. Python을 사용하여 필요한 논리를 코딩했지만 다른 언어를 사용하고 필요에 따라 논리를 변경할 수 있습니다.

  1. 코드를 작성하려면 OCI Cloud Shell에서 requirement.txtfunc.py 파일을 엽니다.

    함수 배치

  2. 다음은 OCI 리소스 주체를 사용하는 함수 코드이므로 OCI 인증서를 유지할 필요가 없습니다. 버킷 이름, 토픽 OCID 등과 같은 생성물의 변수를 바꾸어야 합니다.

    • requirements.txt.

      fdk>=0.1.71
      oci>=2.112.0
      
    • func.yaml.

      schema_version: 20180708
      name: reportsauto
      version: 0.0.6
      runtime: python
      build_image: fnproject/python:3.11-dev
      run_image: fnproject/python:3.11
      entrypoint: /python/bin/fdk /function/func.py handler
      memory: 256
      
    • func.py.

      import io
      import json
      import logging
      import oci
      from datetime import datetime
      
      from fdk import response
      
      
      def handler(ctx, data: io.BytesIO = None):
          try:
              body = json.loads(data.getvalue())
              logging.getLogger().info(body.get("eventType"))
              logging.getLogger().info(body.get("data").get("resourceName"))
          except (Exception, ValueError) as ex:
              logging.getLogger().info('error parsing json payload: ' + str(ex))
      
          logging.getLogger().info("Inside Python Hello World function")
          initiateFn(body.get("data").get("resourceName"))
          return response.Response(
              ctx, response_data=json.dumps(
                  {"message": "Function Executed!"}),
              headers={"Content-Type": "application/json"}
          )
      
      def initiateFn(uploaded_file):
          logging.getLogger().info("Reached initiate function...")
      
          signer = oci.auth.signers.get_resource_principals_signer()
          object_storage_client = oci.object_storage.ObjectStorageClient(config={}, signer=signer)
          namespace_name="orasenatdplt01"
          bucket_name="demobucket"
      
          now = datetime.now()
          par_name = "PAR_Request_" + str(now).split('.')[0].replace(" ", "_").replace(":", "_").replace("-", "_")
          create_preauthenticated_request_response = object_storage_client.create_preauthenticated_request(
              namespace_name=namespace_name,
              bucket_name=bucket_name,
              create_preauthenticated_request_details=oci.object_storage.models.CreatePreauthenticatedRequestDetails(
                  name=par_name,
                  access_type="ObjectRead",
                  time_expires=datetime.strptime(
                      "2037-06-05T04:25:22.344Z",
                      "%Y-%m-%dT%H:%M:%S.%fZ"),
                  object_name=uploaded_file))
      
          callNotificationAPI(create_preauthenticated_request_response.data)
      
      # Function to call Notification API as soon as an object push is detected
      def callNotificationAPI(parData):
          logging.getLogger().info("Trigger notification as object push is detected...")
          topicOcid = "ocid1.onstopic.oc1.iad.amaaaaxxxxxxxxxamn4"
          signer = oci.auth.signers.get_resource_principals_signer()
          ons_client = oci.ons.NotificationDataPlaneClient(config={}, signer=signer)
          publish_message_response = ons_client.publish_message(
              topic_id=topicOcid,
              message_details=oci.ons.models.MessageDetails(
                  body="OCI Notification Service - Cost Report File is created: " + str(parData.full_path),
                  title="OCI Notification Service - Cost Report File is created"),
              message_type="RAW_TEXT")
          logging.getLogger().info("Triggered notification as object push is detected...")
      
  3. OCI Cloud Shell에서 다음 명령을 사용하여 레지스트리에서 함수를 업데이트하고 최신 코드를 배치합니다.

    fn -v deploy — app reportsauto
    
  4. 일단 배치되면 함수를 호출할 준비가 된 것입니다. 함수 호출 명령을 사용하여 테스트하고 필요한 경우 함수가 작동하는지 확인할 수 있습니다.

    DEBUG=1 fn invoke reportsauto your_app_name
    

    참고:

    • OCI는 함수를 실행하는 동안 사용자 관련 정보를 제공하지 않도록 리소스/인스턴스 주체를 지원합니다. 따라서 함수에 API를 호출하기 위한 올바른 권한 집합이 있는지 확인하고 함수가 제대로 작동하지 않을 경우 이 작업이 필요합니다.

    • (선택 사항) 디버그 모드에서 문제 해결을 확인할 수도 있습니다. 예를 들어 OCI Cloud Shell에서 다음 명령을 실행하여 함수를 호출하고 예상대로 작동하는지 테스트합니다.

      DEBUG=1 fn invoke e2e-function-demo e2e-fn-streaming
      

작업 5: OCI 이벤트 규칙 설정

  1. OCI 콘솔로 이동하여 애플리케이션 통합, 이벤트 서비스, 규칙, 이벤트 규칙 생성을 누릅니다. 규칙 조건을 입력하고 태스크 4에서 생성된 함수를 트리거 작업으로 추가합니다.

  2. 표시 이름설명을 입력합니다.

    이벤트 규칙 생성

  3. 규칙 조건 섹션에서 첫번째 조건을 이벤트 유형, 오브젝트 스토리지, 객체 - 생성, 다른 조건을 속성, bucketName, demoBucket으로 선택합니다.

    이벤트 규칙 정의

  4. 작업 섹션을 통해 이벤트에 함수를 연결합니다. 함수 구획, 함수 애플리케이션 및 태스크 4에 배치된 함수를 선택합니다.

    이벤트 규칙 대상

  5. 이벤트 규칙을 저장하려면 변경사항 저장을 누릅니다. OCI Object Storage 버킷에서 내보낸 이벤트에 대한 조건이 일치하면 함수가 호출됩니다.

확인

추가 학습 자원

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

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