주:
- 이 사용지침서에서는 Oracle Cloud에 액세스해야 합니다. 무료 계정에 등록하려면 Oracle Cloud Infrastructure Free Tier 시작하기를 참조하십시오.
- Oracle Cloud Infrastructure 인증서, 테넌시 및 구획에 대한 예제 값을 사용합니다. 실습을 마칠 때는 이러한 값을 클라우드 환경과 관련된 값으로 대체하십시오.
전자메일을 사용하여 비용 사용 보고서를 전송하도록 Oracle Cloud Infrastructure Functions 설정
소개
요구사항에 따라 비용 사용량 보고서를 사용자정의할 수 있으며 스케줄링된 비용 사용량 보고서를 생성할 수 있습니다. 일정에 따라 보고서가 풀링되고 선택된 OCI(Oracle Cloud Infrastructure) 오브젝트 스토리지 버킷에 저장됩니다.
이 보고서를 전자메일로 보내려면 OCI 함수를 배포해야 합니다. OCI 함수는 OCI에서 생성된 이벤트 규칙을 기반으로 트리거됩니다. 파일이 버킷에 저장될 때마다 객체 업로드 이벤트는 함수를 트리거하고 OCI 함수는 객체에 대해 사전 인증된 요청 URL을 생성하는 자동화를 갖게 됩니다. 이 URL은 전자메일을 통해 전송됩니다.
OCI 전자메일 전송 서비스 또는 OCI 통지 서비스에서 전자메일을 수신할 수 있습니다. 이 자습서에서는 두 구성에 대해 설명합니다.
목표
- 전자메일을 사용하여 스케줄링된 비용 사용 보고서를 가져오도록 OCI 함수를 설정합니다.
필요 조건
-
OCI IAM(Oracle Cloud Infrastructure Identity and Access Management)의 액세스 권한으로 동적 그룹, OCI IAM 정책을 생성하고, 버킷에 일정이 잡힌 비용 사용 보고서를 포함할 함수를 생성합니다.
-
OCI(Oracle Cloud Identifiers) 및 기타 관련 정보를 보기 위해 필요한 모든 구성요소에 액세스할 수 있습니다.
-
함수를 생성, 배치 및 호출할 수 있도록 OCI Cloud Shell에 액세스합니다.
-
OCI 함수에 대한 네트워크 리소스를 사용할 수 있어야 합니다. VCN 및 서브넷 구성입니다.
작업 1: 필요한 OCI IAM 정책 및 동적 그룹 설정
-
OCI 콘솔에 로그인합니다. 자세한 내용은 Oracle Cloud에 로그인을 참조하십시오.
-
OCI IAM 동적 그룹으로 이동하고 다음 규칙을 사용하여 새 동적 그룹을 생성합니다.
-
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: 스케줄링된 원가 사용 보고서 생성
-
청구 및 비용 관리로 이동하고 비용 관리를 선택합니다. 원가 분석 아래에 사용자 정의된 사용자 정의 원가 사용 보고서를 생성하고 적용을 눌러 보고서를 저장합니다.
-
스케줄링된 보고서를 누르고 버킷 정보가 포함된 새 스케줄링된 보고서를 생성합니다. 요구 사항에 따라 일정을 잡을 수 있습니다.
일정에 따라 보고서가 제공된 OCI Object Storage 버킷에 자동으로 저장됩니다.
작업 3: 함수 코드 생성 및 배치
-
애플리케이션을 생성하려면 개발자 서비스로 이동하여 애플리케이션을 누르고 사용 가능한 네트워크에서 애플리케이션을 생성합니다.
-
functions/applications로 이동하여 함수를 생성합니다. 이 함수는 OCI IAM 동적 그룹 및 정책을 사용하여 이벤트에 액세스합니다. 화면의 단계에 따라 기능을 만듭니다. 우리는 필요한 논리를 코딩하기 위해 Python을 사용했지만, 당신은 자신의 언어를 사용하고 필요에 따라 논리를 변경할 수 있습니다. 코드를 작성하려면 함수
requirement.txt
파일 및func.py
파일을 OCI Cloud Shell에서 열고 코드를 작성합니다. -
다음 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
-
-
OCI Cloud Shell에서 다음 명령을 사용하여 레지스트리에서 함수를 업데이트하고 최신 코드를 배치합니다.
fn -v deploy — app App_name
일단 배치되면 함수를 호출할 준비가 된 것입니다. 함수를 트리거하려면 이벤트 규칙을 생성해야 합니다.
작업 4: 이벤트 규칙 설정
-
OCI에서 이벤트 규칙을 생성합니다. 관찰성 및 관리에서 이벤트 서비스, 규칙 및 규칙 생성을 누릅니다. 다음 이미지에 표시된 대로 버킷 ID로 속성을 사용하여 일치 규칙을 입력합니다.
참고: 생성된 OCI Object Storage 버킷은 객체 이벤트 내보내기를 통해 사용으로 설정해야 합니다.
-
다음 이미지에 표시된 대로 작업 2에서 생성된 함수를 사용하여 작업을 추가합니다.
이제 함수에 대한 트리거가 생성됩니다.
작업 5: OCI 전자메일 전송 또는 OCI 통지를 사용하여 전자메일 구성 설정
-
OCI 전자메일 전송 사용(공용 DNS 도메인 필요):
-
OCI에서 전자메일 도메인을 생성합니다. 개발자 서비스로 이동하고 전자메일 전송을 선택합니다. 사용 가능한 공용 DNS에 따라 전자메일 도메인을 생성합니다. 전자메일 도메인 이름은 공용 DNS 이름과 동일해야 합니다.
-
공용 DNS 레코드에 레코드를 추가하여 전자메일 도메인에서 도메인 키 식별 메일(DKIM) 및 승인된 발신자를 구성합니다. 전자메일 도메인 및 구성 설정에 대한 자세한 내용은 OCI 전자메일 전송으로 전자메일을 전송하는 단계별 지침을 참조하십시오.
-
사용자에 대한 SMTP 자격 증명을 만듭니다. SMTP 인증서를 생성하고 나중에 사용할 수 있도록 저장합니다.
func.py
파일에 동일한 승인된 전자 메일 ID 및 SMTP 자격 증명을 제공해야 합니다.
-
-
OCI 통지 서비스 사용:
-
토픽을 생성하려면 개발자 서비스로 이동합니다. 애플리케이션 통합에서 통지를 누릅니다.
-
항목 페이지에서 항목 생성을 누르고 필요한 정보를 입력합니다.
-
토픽이 생성되면 구독을 생성하십시오. 프로토콜에
Email
및 필수 전자메일 ID를 입력합니다. -
구독 확인을 위해 엔드포인트로 전자메일이 수신됩니다.
-
테스트
객체 또는 파일을 버킷에 업로드하면 이벤트 규칙을 사용하여 자동으로 기능이 트리거됩니다.
관련 링크
확인
- 작성자 - Samratha S P(수석 클라우드 엔지니어)
추가 학습 자원
docs.oracle.com/learn에서 다른 실습을 살펴보거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하십시오. 또한 education.oracle.com/learning-explorer를 방문하여 Oracle Learning Explorer가 되십시오.
제품 설명서는 Oracle Help Center를 참조하십시오.
Set Up Oracle Cloud Infrastructure Functions to Send Cost Usage Report using Email
F96405-03
December 2024