주:

전자메일을 사용하여 비용 사용 보고서를 전송하도록 Oracle Cloud Infrastructure Functions 설정

소개

요구사항에 따라 비용 사용량 보고서를 사용자정의할 수 있으며 스케줄링된 비용 사용량 보고서를 생성할 수 있습니다. 일정에 따라 보고서가 풀링되고 선택된 OCI(Oracle Cloud Infrastructure) 오브젝트 스토리지 버킷에 저장됩니다.

이 보고서를 전자메일로 보내려면 OCI 함수를 배포해야 합니다. OCI 함수는 OCI에서 생성된 이벤트 규칙을 기반으로 트리거됩니다. 파일이 버킷에 저장될 때마다 객체 업로드 이벤트는 함수를 트리거하고 OCI 함수는 객체에 대해 사전 인증된 요청 URL을 생성하는 자동화를 갖게 됩니다. 이 URL은 전자메일을 통해 전송됩니다.

OCI 전자메일 전송 서비스 또는 OCI 통지 서비스에서 전자메일을 수신할 수 있습니다. 이 자습서에서는 두 구성에 대해 설명합니다.

목표

필요 조건

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

  1. OCI 콘솔에 로그인합니다. 자세한 내용은 Oracle Cloud에 로그인을 참조하십시오.

  2. OCI IAM 동적 그룹으로 이동하고 다음 규칙을 사용하여 새 동적 그룹을 생성합니다.

    동적 그룹 생성

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

    allow dynamic-group dynamicgroup_name to manage buckets in compartment CompartmentName where all {target.bucket.name='bucket_name'}
    
    allow dynamic-group dynamicgroup_name to manage objects in compartment CompartmentName where all {target.bucket.name='bucket_name'}
    
    Allow service metering_overlay to manage objects in compartment CompartmentName where all {target.bucket.name='bucket_name', any {request.permission='OBJECT_CREATE', request.permission='OBJECT_DELETE', request.permission='OBJECT_READ'}}
    

    OCI 통지 서비스를 사용하여 전자메일을 전송하려면 OCI IAM 정책에 다음 명령문을 추가하여 OCI 통지 토픽에 액세스해야 합니다.

    allow dynamic-group dynamicgroup_name to use ons-topics in compartment CompartmentName
    

태스크 2: 스케줄링된 원가 사용 보고서 생성

  1. 청구 및 비용 관리로 이동하고 비용 관리를 선택합니다. 원가 분석 아래에 사용자 정의된 사용자 정의 원가 사용 보고서를 생성하고 적용을 눌러 보고서를 저장합니다.

    비용 보고서 생성

  2. 스케줄링된 보고서를 누르고 버킷 정보가 포함된 새 스케줄링된 보고서를 생성합니다. 요구 사항에 따라 일정을 잡을 수 있습니다.

    일정이 잡힌 보고서 생성

    일정에 따라 보고서가 제공된 OCI Object Storage 버킷에 자동으로 저장됩니다.

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

  1. 애플리케이션을 생성하려면 개발자 서비스로 이동하여 애플리케이션을 누르고 사용 가능한 네트워크에서 애플리케이션을 생성합니다.

  2. functions/applications로 이동하여 함수를 생성합니다. 이 함수는 OCI IAM 동적 그룹 및 정책을 사용하여 이벤트에 액세스합니다. 화면의 단계에 따라 기능을 만듭니다. 우리는 필요한 논리를 코딩하기 위해 Python을 사용했지만, 당신은 자신의 언어를 사용하고 필요에 따라 논리를 변경할 수 있습니다. 코드를 작성하려면 함수 requirement.txt 파일 및 func.py 파일을 OCI Cloud Shell에서 열고 코드를 작성합니다.

    Cloud Shell 및 코드 편집기에서 함수 생성

  3. 다음 Python 코드를 func.py에 복사하고 requirement.txt 파일에 텍스트 파일을 복사합니다.

    • func.py:

      • OCI Email Delivery 사용:

        주: 각 전자메일 ID 및 SMTP(Simple Mail Transfer Protocol) 세부정보를 추가합니다.

        import oci
        import json
        import io
        import logging
        import smtplib
        from os.path import basename
        from email.mime.application import MIMEApplication
        from email.mime.multipart import MIMEMultipart
        from email.mime.text import MIMEText
        from email.utils import COMMASPACE, formatdate
        from datetime import datetime
        import ssl
        import email.utils
        from email.message import EmailMessage
        
        def handler(ctx, data: io.BytesIO = None):
           funDataStr = data.read().decode('utf-8')
        
        #Convert the log data to json
           funData =  json.loads(funDataStr)
        
        #Set up OCI configuration using resource principal
           signer = oci.auth.signers.get_resource_principals_signer()
        #Create Object Storage client
           object_storage_client = oci.object_storage.ObjectStorageClient({},signer=signer)
        
        # Extract object details from the event
           object_name = funData['data']['resourceName']
           namespace = funData['data']['additionalDetails']['namespace']
           bucket_name = funData['data']['additionalDetails']['bucketName']
        # Download the object
        #get_object_response = object_storage_client.get_object(namespace, bucket_name, object_name)
        #object_content = str(get_object_response.data.text)
           create_preauthenticated_request_response = object_storage_client.create_preauthenticated_request(
              namespace_name = namespace,
              bucket_name = bucket_name,
              create_preauthenticated_request_details=oci.object_storage.models.CreatePreauthenticatedRequestDetails(
                 name = "prestorage",
                 access_type = "ObjectRead",
                 time_expires = datetime.strptime(
                    "2024-06-05T04:25:22.344Z",
                    "%Y-%m-%dT%H:%M:%S.%fZ"),
                 object_name = object_name))
           #logging.getLogger().info(create_preauthenticated_request_response.data)
           logging.getLogger().info("created pre authenticated url")
           string = str(create_preauthenticated_request_response.data)
           #response = create_preauthenticated_request_response.data().decode('utf-8')
           url = json.loads(string)
           logging.getLogger().info(url)
           temporary_url = f"{url['full_path']}"
           logging.getLogger().info(temporary_url)
        
        #Set your email credentials
           sender_email = "test@domain"
           sender_name = "Tester"
        
        #Set the recipient email address
           recipient_email = "xyz@oracle.com"
           USERNAME_SMTP = "SMTPOCID"
           password_smtp = "************"
           HOST = "smtp_email"
           PORT = 587
        
        #Create the email content
           subject = "Cost Usage Report"
           body = temporary_url
           message = EmailMessage()
           message['From'] = email.utils.formataddr((sender_name, sender_email))
           message['To'] = recipient_email
           message['Subject'] = subject
           message.set_content(body)
           try:
              server = smtplib.SMTP(HOST, PORT)
              server.ehlo()
              server.starttls(context=ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH, cafile=None, capath=None))
              server.ehlo()
              server.login(USERNAME_SMTP, password_smtp)
              logging.getLogger().info("SMTP server logged in")
              server.sendmail(sender_email, recipient_email, message.as_string())
              #server.send_message(message)
              server.close()
           except Exception as e:
              logging.getLogger().info(f"Error: {e}")
           else:
              logging.getLogger().info('Email sent successfully!')
        
      • OCI Notifications 사용:

        주: OCID 항목을 갱신합니다. 통지 생성 단계는 작업 5에 설명되어 있습니다.

        import oci
        import json
        import io
        import logging
        import smtplib
        from os.path import basename
        from email.mime.application import MIMEApplication
        from email.mime.multipart import MIMEMultipart
        from email.mime.text import MIMEText
        from email.utils import COMMASPACE, formatdate
        from datetime import datetime
        import ssl
        import email.utils
        from email.message import EmailMessage
        
        def handler(ctx, data: io.BytesIO = None):
           funDataStr = data.read().decode('utf-8')
        
        # Convert the log data to json
           funData =  json.loads(funDataStr)
        
        # Set up OCI configuration using resource principal
           signer = oci.auth.signers.get_resource_principals_signer()
        # Create Object Storage client
           object_storage_client = oci.object_storage.ObjectStorageClient({},signer=signer)
           ons_client = oci.ons.NotificationDataPlaneClient({},signer=signer)
        # Extract object details from the event
        
        
           object_name = funData['data']['resourceName']
           namespace = funData['data']['additionalDetails']['namespace']
           bucket_name = funData['data']['additionalDetails']['bucketName']
        
        # Download the object
           create_preauthenticated_request_response = object_storage_client.create_preauthenticated_request(
              namespace_name = namespace,
              bucket_name = bucket_name,
              create_preauthenticated_request_details=oci.object_storage.models.CreatePreauthenticatedRequestDetails(
                 name = "prestorage",
                 access_type = "ObjectRead",
                 time_expires = datetime.strptime(
                    "2024-06-05T04:25:22.344Z",
                    "%Y-%m-%dT%H:%M:%S.%fZ"),
                 object_name = object_name))
        #logging.getLogger().info(create_preauthenticated_request_response.data)
           logging.getLogger().info("created pre authenticated url")
           string = str(create_preauthenticated_request_response.data)
        #response = create_preauthenticated_request_response.data().decode('utf-8')
           url = json.loads(string)
        
           logging.getLogger().info(url)
           temporary_url = f"{url['full_path']}"
           logging.getLogger().info(temporary_url)
        #to send mail using notification
           publish_message_response = ons_client.publish_message(
              topic_id="ocid1.onstopic.oc1.iad.************",
              message_details=oci.ons.models.MessageDetails(
                 body=temporary_url,
                 title="Cost-usage report"),
           message_type="RAW_TEXT")
           logging.getLogger().info(publish_message_response)
           logging.getLogger().info('Email sent successfully!')
        
    • requirement.txt:

      fdk>=0.1.68
      oci
      
  4. OCI Cloud Shell에서 다음 명령을 사용하여 레지스트리에서 함수를 업데이트하고 최신 코드를 배치합니다.

    fn -v deploy — app App_name
    

일단 배치되면 함수를 호출할 준비가 된 것입니다. 함수를 트리거하려면 이벤트 규칙을 생성해야 합니다.

작업 4: 이벤트 규칙 설정

  1. OCI에서 이벤트 규칙을 생성합니다. 관찰성 및 관리에서 이벤트 서비스, 규칙규칙 생성을 누릅니다. 다음 이미지에 표시된 대로 버킷 ID로 속성을 사용하여 일치 규칙을 입력합니다.

    참고: 생성된 OCI Object Storage 버킷은 객체 이벤트 내보내기를 통해 사용으로 설정해야 합니다.

    이벤트 규칙 생성

  2. 다음 이미지에 표시된 대로 작업 2에서 생성된 함수를 사용하여 작업을 추가합니다.

    작업

    이제 함수에 대한 트리거가 생성됩니다.

작업 5: OCI 전자메일 전송 또는 OCI 통지를 사용하여 전자메일 구성 설정

테스트

객체 또는 파일을 버킷에 업로드하면 이벤트 규칙을 사용하여 자동으로 기능이 트리거됩니다.

확인

추가 학습 자원

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

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