주:
- 이 사용지침서에서는 Oracle Cloud에 접근해야 합니다. 무료 계정에 등록하려면 Oracle Cloud Infrastructure Free Tier 시작하기를 참조하십시오.
- Oracle Cloud Infrastructure 인증서, 테넌시 및 구획에 대한 예제 값을 사용합니다. 실습을 완료하면 이러한 값을 클라우드 환경에 고유한 값으로 대체합니다.
OCI 모니터링에서 Oracle Cloud Infrastructure Events에 대한 전자메일 통지 설정
소개
OCI(Oracle Cloud Infrastructure) 서비스는 리소스 변화를 나타내는 구조화된 메시지인 이벤트를 내보냅니다. 이벤트 작업을 위한 규칙을 생성하고 일치하는 이벤트를 찾을 때 트리거할 작업을 지정해야 합니다.
전자메일 통지 작업은 이벤트 대응에 대해 정의하는 응답입니다. OCI 이메일 딜리버리 서비스는 안전한 대용량 및 트랜잭션 이메일 알림을 전송하기 위한 빠르고 안정적인 관리 솔루션을 제공합니다.
목표
- OCI Email Delivery를 사용하여 이메일 친화적 OCI 이벤트 통지를 전송합니다.
필요 조건
Oracle Cloud Infrastructure Identity and Access Management(OCI IAM) 관리자는 다음을 생성해야 합니다.
-
OCI 함수가 전자메일 통지를 호출하고 전송하기 위한 동적 그룹 및 정책입니다.
-
동적 그룹
함수 구획에 대한 동적 그룹을 생성합니다.
# Replace OCID for function compartment All {resource.type = 'fnfunc', resource.compartment.id = '<function-compartment>'} Example: All {resource.type = 'fnfunc', resource.compartment.id = 'ocid1.compartment.oc1..aaaaaaaanovmfmmnonjjyxeq4jyghszj2eczlrkgj5svnxrt...'}
-
정책
기능에 대한 동적 그룹을 지정하려면 정책을 생성합니다.
# Replace dynamic-group-name, function-compartment and OCID of vault secret for OCI function Allow dynamic-group <dynamic-group-name> to read secret-family in compartment <function-compartment> where target.secret.id='<ocid of smtp password vaultsecret>' Allow dynamic-group <dynamic-group-name> to inspect compartments in tenancy Allow dynamic-group <dynamic-group-name> to read repos in compartment <function-compartment>
-
-
SMTP(Simple Mail Transfer Protocol) 서비스 계정 - 사용자 기능이
SMTP credentials
에만 제한됩니다. SMTP 자격 증명을 생성하여 개발자와 공유합니다. -
구획, 그룹 및 정책 - 개발자가 암호를 생성하고 함수를 배치할 수 있습니다.
# Replace group-name as per your tenancy Allow group <group-name> to manage repos in compartment <function-compartment> Allow group <group-name> to manage vaults in compartment <function-compartment> Allow group <group-name> to manage keys in compartment <function-compartment> Allow group <group-name> to manage secret-family in compartment <function-compartment> Allow group <group-name> to manage approved-senders in compartment <function-compartment> allow group <group-name> to use cloud-shell in tenancy allow group <group-name> to manage functions-family in compartment <function-compartment> allow group <group-name> to use virtual-network-family in compartment <network-compartment> Allow group <group-name> to read objectstorage-namespaces in tenancy
가입된 전자메일 전달 영역 및 선호 전자메일 전달 영역에 대한 자세한 내용은 SMTP 접속 끝점 구성을 참조하십시오.
태스크 1: 전자메일 전달에서 승인된 발신자 구성
OCI를 통해 메일을 전송하는 모든 "보낸 사람:" 주소에 대해 승인된 발신자를 설정해야 합니다. 구획과 연관되어 있으며 승인된 발신자가 구성된 지역에만 존재합니다.
아래 언급된 승인된 발신자에 대해 도메인 이름 또는 기본 오라클 통지를 사용할 수 있습니다.
-
OCI 콘솔의 탐색 메뉴를 열고 개발자 서비스를 누릅니다.
-
[애플리케이션 통합] 아래의 전자메일 전송을 누릅니다.
-
전자메일 전달에서 승인된 발신자를 누릅니다.
-
승인된 발신자 생성을 누르고 승인된 발신자로 나열할 전자메일 주소를 입력합니다.
참고: OCI 전자메일 전달 SMTP 접속 끝점이
smtp.email.ap-mumbai-1.oci.oraclecloud.com
인 경우noreply@notification
을 영역에 추가하고 승인된 발신자 전자메일 주소를 입력하십시오. 예:noreply@notification.ap-mumbai-1.oci.oraclecloud.com
. -
추가를 눌러 승인된 발신자 목록에 전자메일 주소를 추가합니다.
작업 2: 태그 네임스페이스 및 키 정의 생성
-
탐색 메뉴를 열고 관리 및 관리를 누릅니다.
-
Tenancy Management(테넌시 관리)에서 Tag Namespaces(태그 이름 공간)를 누릅니다.
-
Tag Namespaces 페이지에서 Create Tag Namespaces를 누릅니다.
-
Create Tag Namespace 패널에서 적절한 구획을 선택하고 이름 공간 이름에 custom을 입력하고 설명을 제공합니다.
-
custom 이름 공간에서 Create Tag Key Definitions(태그 키 정의 만들기)를 누르고 Tag(태그 키) 키에 recipient(수신자)를 입력하여 만듭니다.
참고: 통지가 필요한 각 OCI 리소스의 정의된 태그에 수신자 전자메일 주소를 추가할 수 있습니다. 솔루션에서는
recipient addresses
를 사용하여 클라우드 이벤트에서 사용 가능한 경우 통지합니다. 그렇지 않으면defaultrecepient
주소가 함수 구성에 지정됩니다. 예: demouser1@abc.com,demouser2@abc.com
작업 3: OCI 저장소에 암호 생성
-
탐색 메뉴를 열고 ID 및 보안을 누른 다음 저장소를 누릅니다.
-
목록 범위에서 저장소가 포함된 구획을 선택합니다.
참고: 새 저장소 및 마스터 암호화 키를 생성해야 하는 경우 저장소 생성 및 마스터 암호화 키의 지침을 따르십시오.
-
리소스에서 비밀 생성을 누르고 적합한 마스터 암호화 키를 선택합니다.
-
이름 필드에 smptppass를 입력하고 설명 OCI 전자메일 전달 인증을 위한 SMTP 비밀번호를 입력합니다.
-
암호 유형 템플리트에 대해 plain-text 형식을 선택하고 암호 내용에 대해 smtp password를 입력합니다.
참고: OCI IAM 관리자가 공유하는 SMTP 비밀번호를 사용합니다.
-
작업 4: OCI 함수 생성 및 배치
-
OCI 콘솔의 상단 탐색 메뉴에서 Cloud Shell을 누릅니다.
-
클라우드 셸에서 Fn 프로젝트 CLI를 사용하여 함수를 생성합니다.
fn init --runtime python <function-name> Example: fn init --runtime python emaildelivery-func
-
디렉토리를 새로 생성된 디렉토리로 변경합니다.
-
함수를 배치할 앱을 생성합니다.
# Specify the OCID of subnet fn create app emaildeliveryapp --annotation oracle.com/oci/subnetIds='["<subnet OCID>"]' Example: fn create app emaildeliveryapp --annotation oracle.com/oci/subnetIds='["ocid1.subnet.oc1.ap-mumbai-1.aaaaaaaabitp32dkyox37qa3tk3evl2nxivwb....."]'
-
기존 컨텐트를 겹쳐써서
func.py
파일의 아래 스크립트를 복사하여 붙여넣습니다.# python script for sending SMTP configuration with Oracle Cloud Infrastructure Email Delivery import io import json import logging import oci from fdk import response import smtplib import email.utils import ssl import base64 from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase # Get Resource Principal Credentials signer = oci.auth.signers.get_resource_principals_signer() # Get instance principal context secret_client = oci.secrets.SecretsClient(config={}, signer=signer) identity_client = oci.identity.IdentityClient(config={}, signer=signer) tenancy_data = identity_client.get_tenancy(tenancy_id=signer.tenancy_id).data t_name = str(tenancy_data.name) t_id = signer.tenancy_id # Retrieve secret def read_secret_value(secret_client, secret_id): response = secret_client.get_secret_bundle(secret_id) base64_Secret_content = response.data.secret_bundle_content.content base64_secret_bytes = base64_Secret_content.encode('ascii') base64_message_bytes = base64.b64decode(base64_secret_bytes) secret_content = base64_message_bytes.decode('ascii') return secret_content # Sender name sendername = 'noreply' # If you're using Email Delivery in a different region, replace the HOST value with an appropriate SMTP endpoint. # Use port 25 or 587 to connect to the SMTP endpoint. port = 587 # Reading company logo information in base64 encoded with open("companylogo.png", "rb") as image_file: image_data = base64.b64encode(image_file.read()) image_data = '<img src="data:image/png;base64,'+str(image_data)[2:]+'" alt="company logo" />' def handler(ctx, data: io.BytesIO=None): try: # Extracting function config values cfg = ctx.Config() smtp_user = cfg["smtpuser"] host = cfg["host"] sender = cfg["sender"] smtp_defrec = cfg["defaultrecipient"] smtp_pass = cfg["smtppass"] # Secrets from vault smtp_pass = read_secret_value(secret_client, secret_id=smtp_pass ) # Extracting values from triggered OCI event body = json.loads(data.getvalue()) e_Type = body.get("eventType") e_time = body.get("eventTime") r_name = body["data"]["resourceName"] c_id = body["data"]["compartmentId"] c_name = body["data"]["compartmentName"] r_id = body["data"]["resourceId"] add_detail = "" try: # Extracting additional details from OCI event details = body["data"]["additionalDetails"] for key, value in details.items(): add_detail = add_detail+str(key)+' : '+str(value)+'<br>' except (Exception, ValueError) as ex: add_detail = "Additional details not available for this OCI event" try: # Extracting recepient details if available in OCI event recipient = body["data"]["definedTags"]["custom"]["recipient"] except Exception as e: recipient = smtp_defrec # Extract event type e_Type = e_Type.split('com.oraclecloud.')[1] # Extract region name r_id = r_id.split('.')[3] # The subject line of the email. SUBJECT = 'Event | '+ r_name + ' | ' + e_Type + ' | ' + e_time BODY_HTML = """\ <html> <head></head> <body> """ +str(image_data)+ """ <h2>Oracle Cloud Notification</h2> <hr> <b>Event Time : </b>""" +str(e_time)+ """ <br> <b>Event Type : </b>""" +str(e_Type)+ """ <br> <b>Tenancy Name : </b>""" +str(t_name)+ """ <br> <b>Tenancy ID : </b>""" +str(t_id)+ """ <hr> <b>Resource Name : </b>""" +str(r_name)+ """ <br> <b>Region Name : </b>""" +str(r_id)+ """ <br> <b>Compartment ID : </b>""" +str(c_id)+ """ <br> <b>Compartment Name : </b>""" +str(c_name)+ """ <hr> <b>Details : </b><br>""" +str(add_detail)+ """ <hr> <br> <p> Thank you, <br> The OCI team <br><br><br> Please do not reply directly to this email. This mailbox is not monitored. If you have any questions regarding this notification, contact your account administrator. <br> </p> </body> </html> """ # create message container msg = MIMEMultipart() msg['Subject'] = SUBJECT msg['From'] = email.utils.formataddr((sendername, sender)) msg['To'] = recipient # Attach HTML body for email msg.attach(MIMEText(BODY_HTML, 'html')) # Attach JSON payload as attachement attach_file = json.dumps(body,indent=2) payload = MIMEBase('application', 'octate-stream') payload.set_payload(attach_file) payload.add_header('Content-Disposition', 'attachment', filename='event_output.json') msg.attach(payload) # Try to send the message. server = smtplib.SMTP(host, port) server.ehlo() # most python runtimes default to a set of trusted public CAs that will include the CA used by OCI Email Delivery. # However, on platforms lacking that default (or with an outdated set of CAs), customers may need to provide a capath that includes our public CA. server.starttls(context=ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH, cafile=None, capath=None)) # smtplib docs recommend calling ehlo() before & after starttls() server.ehlo() server.login(smtp_user, smtp_pass) # our requirement is that SENDER is the same as From address set previously server.sendmail(sender, recipient, msg.as_string()) server.close() # Display an error message if something goes wrong. except (Exception, ValueError) as ex: logging.getLogger().info('error parsing json payload: ' + str(ex)) return response.Response(ctx, response_data=json.dumps({"message": "success"}),headers={"Content-Type": "application/json"})
-
companylogo.png를 회사 로고로 대체하고 스크립트에서 HTML 텍스트를 전자메일 본문으로 업데이트할 수 있습니다. 기본값은 Oracle 로고입니다.
-
함수를 배치하려면 아래 명령을 실행하십시오.
fn -v deploy --app <app-name> Example: fn -v deploy --app emaildeliveryapp
-
각 구성 키 및 값에 대한 함수 구성을 추가하려면 아래에서 실행하십시오.
-
sender: 작업 1에서 구성된 승인된 발신자를 사용합니다.
-
smtpuser: OCI IAM 관리자가 공유하는 SMTP 사용자입니다.
-
smtppass: SMTP 비밀번호 저장소 암호의 OCID를 사용하고 smtppass 구성 값에서 업데이트합니다.
-
host: 필요 조건에 따라 SMTP 연결 끝점을 사용합니다.
-
defaultrecipient: 전자메일 주소를 기본 수신자로 제공합니다. 이 솔루션은
_recipient addresses_
를 사용하여 클라우드 이벤트에서 사용 가능한 경우 통지합니다. 그렇지 않으면_defaultrecepient_
주소가 함수 구성에 사용됩니다.
fn config function <app-name> <function-name> <config-key> <config-value> Example: fn config function emaildeliveryapp emaildelivery-func sender noreply@notification.ap-mumbai-1.oci.oraclecloud.com
-
태스크 5: 이벤트 규칙 생성
-
탐색 메뉴를 열고 관찰 가능성 및 관리를 누릅니다.
-
이벤트 서비스에서 규칙을 누릅니다.
-
규칙 생성을 누르고 규칙 생성 패널에서 규칙에 대한 친숙한 이름과 규칙 수행 작업에 대한 설명을 제공합니다.
-
규칙 조건 영역에서 함수를 트리거할 이벤트 유형 및 작업을 지정합니다. 이벤트 유형, 속성 및 태그를 기반으로 필터를 정의하여 작업을 트리거하는 이벤트를 제한할 수 있습니다. 다음은 컴퓨트 인스턴스 시작 또는 정지 이벤트를 트리거하는 예입니다.
태스크 6: 전자메일 통지 검증
-
OCI 이벤트를 트리거하기 위해 이벤트 규칙이 생성된 구획에서 컴퓨트 인스턴스를 시작하거나 정지합니다.
-
원시 JSON과 함께 이메일 친화적 알림을 받게 됩니다.
관련 링크
승인
작성자 - Dipesh Kumar Rathod(Master Principal Cloud Architect, Infrastructure)
추가 학습 자원
docs.oracle.com/learn에서 다른 실습을 살펴보거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하십시오. 또한 Oracle Learning Explorer가 되려면 education.oracle.com/learning-explorer를 방문하십시오.
제품 설명서는 Oracle Help Center를 참조하십시오.
Set Up Email Notifications for Oracle Cloud Infrastructure Events in OCI Monitoring
F87596-01
October 2023
Copyright © 2023, Oracle and/or its affiliates.