주:

OCI 모니터링에서 Oracle Cloud Infrastructure Events에 대한 전자메일 통지 설정

소개

OCI(Oracle Cloud Infrastructure) 서비스는 리소스 변화를 나타내는 구조화된 메시지인 이벤트를 내보냅니다. 이벤트 작업을 위한 규칙을 생성하고 일치하는 이벤트를 찾을 때 트리거할 작업을 지정해야 합니다.

전자메일 통지 작업은 이벤트 대응에 대해 정의하는 응답입니다. OCI 이메일 딜리버리 서비스는 안전한 대용량 및 트랜잭션 이메일 알림을 전송하기 위한 빠르고 안정적인 관리 솔루션을 제공합니다.

목표

필요 조건

Oracle Cloud Infrastructure Identity and Access Management(OCI IAM) 관리자는 다음을 생성해야 합니다.

가입된 전자메일 전달 영역 및 선호 전자메일 전달 영역에 대한 자세한 내용은 SMTP 접속 끝점 구성을 참조하십시오.

태스크 1: 전자메일 전달에서 승인된 발신자 구성

OCI를 통해 메일을 전송하는 모든 "보낸 사람:" 주소에 대해 승인된 발신자를 설정해야 합니다. 구획과 연관되어 있으며 승인된 발신자가 구성된 지역에만 존재합니다.

아래 언급된 승인된 발신자에 대해 도메인 이름 또는 기본 오라클 통지를 사용할 수 있습니다.

  1. OCI 콘솔의 탐색 메뉴를 열고 개발자 서비스를 누릅니다.

  2. [애플리케이션 통합] 아래의 전자메일 전송을 누릅니다.

  3. 전자메일 전달에서 승인된 발신자를 누릅니다.

  4. 승인된 발신자 생성을 누르고 승인된 발신자로 나열할 전자메일 주소를 입력합니다.

    참고: OCI 전자메일 전달 SMTP 접속 끝점이 smtp.email.ap-mumbai-1.oci.oraclecloud.com인 경우 noreply@notification을 영역에 추가하고 승인된 발신자 전자메일 주소를 입력하십시오. 예: noreply@notification.ap-mumbai-1.oci.oraclecloud.com.

  5. 추가를 눌러 승인된 발신자 목록에 전자메일 주소를 추가합니다.

작업 2: 태그 네임스페이스 및 키 정의 생성

  1. 탐색 메뉴를 열고 관리 및 관리를 누릅니다.

  2. Tenancy Management(테넌시 관리)에서 Tag Namespaces(태그 이름 공간)를 누릅니다.

  3. Tag Namespaces 페이지에서 Create Tag Namespaces를 누릅니다.

  4. Create Tag Namespace 패널에서 적절한 구획을 선택하고 이름 공간 이름에 custom을 입력하고 설명을 제공합니다.

  5. custom 이름 공간에서 Create Tag Key Definitions(태그 키 정의 만들기)를 누르고 Tag(태그 키) 키에 recipient(수신자)를 입력하여 만듭니다.

    참고: 통지가 필요한 각 OCI 리소스의 정의된 태그에 수신자 전자메일 주소를 추가할 수 있습니다. 솔루션에서는 recipient addresses를 사용하여 클라우드 이벤트에서 사용 가능한 경우 통지합니다. 그렇지 않으면 defaultrecepient 주소가 함수 구성에 지정됩니다. 예: demouser1@abc.com,demouser2@abc.com

작업 3: OCI 저장소에 암호 생성

  1. 탐색 메뉴를 열고 ID 및 보안을 누른 다음 저장소를 누릅니다.

  2. 목록 범위에서 저장소가 포함된 구획을 선택합니다.

    참고: 새 저장소 및 마스터 암호화 키를 생성해야 하는 경우 저장소 생성마스터 암호화 키의 지침을 따르십시오.

  3. 리소스에서 비밀 생성을 누르고 적합한 마스터 암호화 키를 선택합니다.

    • 이름 필드에 smptppass를 입력하고 설명 OCI 전자메일 전달 인증을 위한 SMTP 비밀번호를 입력합니다.

    • 암호 유형 템플리트에 대해 plain-text 형식을 선택하고 암호 내용에 대해 smtp password를 입력합니다.

      참고: OCI IAM 관리자가 공유하는 SMTP 비밀번호를 사용합니다.

작업 4: OCI 함수 생성 및 배치

  1. OCI 콘솔의 상단 탐색 메뉴에서 Cloud Shell을 누릅니다.

  2. 클라우드 셸에서 Fn 프로젝트 CLI를 사용하여 함수를 생성합니다.

    fn init --runtime python <function-name>
    
    Example: fn init --runtime python emaildelivery-func
    
  3. 디렉토리를 새로 생성된 디렉토리로 변경합니다.

  4. 함수를 배치할 앱을 생성합니다.

    # 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....."]'
    
  5. 기존 컨텐트를 겹쳐써서 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"})
    
  6. companylogo.png를 회사 로고로 대체하고 스크립트에서 HTML 텍스트를 전자메일 본문으로 업데이트할 수 있습니다. 기본값은 Oracle 로고입니다.

  7. 함수를 배치하려면 아래 명령을 실행하십시오.

    fn -v deploy --app <app-name>
    
    Example: fn -v deploy --app emaildeliveryapp
    
  8. 각 구성 키 및 값에 대한 함수 구성을 추가하려면 아래에서 실행하십시오.

    • 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: 이벤트 규칙 생성

  1. 탐색 메뉴를 열고 관찰 가능성 및 관리를 누릅니다.

  2. 이벤트 서비스에서 규칙을 누릅니다.

  3. 규칙 생성을 누르고 규칙 생성 패널에서 규칙에 대한 친숙한 이름과 규칙 수행 작업에 대한 설명을 제공합니다.

  4. 규칙 조건 영역에서 함수를 트리거할 이벤트 유형 및 작업을 지정합니다. 이벤트 유형, 속성 및 태그를 기반으로 필터를 정의하여 작업을 트리거하는 이벤트를 제한할 수 있습니다. 다음은 컴퓨트 인스턴스 시작 또는 정지 이벤트를 트리거하는 예입니다.

    컴퓨트 인스턴스 이벤트 규칙

태스크 6: 전자메일 통지 검증

  1. OCI 이벤트를 트리거하기 위해 이벤트 규칙이 생성된 구획에서 컴퓨트 인스턴스를 시작하거나 정지합니다.

  2. 원시 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를 참조하십시오.