Amazon RDS for Oracle DB 인스턴스에서 이메일을 보내려면 어떻게 해야 하나요?

8분 분량
0

이메일을 전송하도록 Amazon Relational Database Service(Amazon RDS) for Oracle DB 인스턴스를 구성하려고 합니다.

간략한 설명

RDS for Oracle DB 인스턴스에서 이메일을 보내려면 UTL_MAIL 또는 UTL_SMTP 패키지를 사용합니다. RDS for Oracle에서 UTL_MAIL을 사용하려면 인스턴스에 연결된 기본이 아닌 옵션 그룹에 UTL_MAIL 옵션을 추가합니다. UTL_MAIL을 구성하는 방법에 대한 자세한 내용은 Oracle UTL_MAIL을 참조하세요.

RDS for Oracle에서 ULT_SMTP를 사용하려면 온프레미스 시스템에서 SMTP 서버를 구성하거나 Amazon Simple Email Service(Amazon SES)를 사용합니다. RDS for Oracle DB 인스턴스에서 SMTP 서버로의 연결이 올바르게 구성되었는지 확인합니다.

다음 해결 방법은 Amazon SES를 사용하여 UTL_SMTP 패키지를 통해 이메일을 보내는 방법을 설명합니다.

사전 요구 사항

RDS DB 인스턴스에서 Amazon SES 엔드포인트에 액세스할 수 있는지 확인합니다. DB 인스턴스가 프라이빗 서브넷에서 실행되는 경우 Amazon SES에 대한 Virtual Private Cloud(VPC) 엔드포인트를 생성합니다.

참고: 프라이빗 서브넷에서 실행되는 DB 인스턴스의 경우 NAT 게이트웨이를 사용하여 Amazon SES 엔드포인트와 통신할 수도 있습니다.

이메일을 전송하도록 DB 인스턴스 구성

이메일을 전송하도록 DB 인스턴스를 구성하려면 다음 단계를 완료하세요.

  1. Amazon SES를 사용하여 SMTP 메일 서버를 설정합니다.
  2. Amazon SES에 VPC 엔드포인트를 생성합니다.
  3. Amazon Elastic Compute Cloud(Amazon EC2) Linux 인스턴스를 생성합니다. 그런 다음 적절한 인증서를 사용하여 Oracle 클라이언트와 전자 지갑을 구성합니다.
  4. 지갑을 Amazon Simple Storage Service(Amazon S3) 버킷에 업로드합니다.
  5. Amazon S3 통합을 사용하여 Amazon S3 버킷에서 Amazon RDS 서버로 지갑을 다운로드합니다.
  6. 기본이 아닌 사용자의 경우 사용자에게 필요한 권한을 부여한 다음 필요한 네트워크 액세스 제어 목록(네트워크 ACL)을 만듭니다.
  7. Amazon SES 자격 증명을 사용하여 이메일을 보냅니다.

해결 방법

참고: AWS Command Line Interface(AWS CLI) 명령 실행 시 오류가 발생하는 경우, AWS CLI 오류 문제 해결을 참고하세요. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하세요.

SMTP 메일 서버 설정

Amazon SES를 사용하여 SMTP 메일 서버를 설정하는 방법에 대한 지침은 Amazon SES를 사용하여 SMTP를 설정하고 연결하려면 어떻게 해야 하나요?를 참조하세요.

아마존 SES로 VPC 생성

Amazon SES를 사용하여 VPC를 생성하는 방법에 대한 지침은 Amazon SES를 사용하여 VPC 엔드포인트 설정을 참조하세요.

Amazon EC2 인스턴스 생성 및 Oracle 클라이언트 및 지갑 구성

다음 단계를 완료합니다.

  1. Amazon EC2 Linux 인스턴스를 생성합니다.

  2. Oracle 클라이언트를 설치합니다.
    참고: DB 인스턴스와 동일한 버전의 클라이언트를 사용하는 것이 가장 좋습니다. 이 해결 방법에서는 Oracle 버전 19c가 사용됩니다. 이 클라이언트를 다운로드하려면 Oracle 웹 사이트에서 Oracle Database 19c(19.3)를 참조하세요. 이 버전은 orapki 유틸리티와 함께 제공됩니다.

  3. AWS CLI를 엽니다.

  4. EC2 인스턴스에서 Amazon RDS 보안 그룹의 데이터베이스 포트에 대한 연결을 허용합니다. DB 인스턴스와 EC2 인스턴스가 동일한 VPC를 사용하는 경우 프라이빗 IP 주소를 사용하여 연결을 허용합니다.

  5. EC2 인스턴스에 연결합니다.

  6. 다음 명령을 실행하여 AmazonRootCA1 인증서를 다운로드합니다.

    wget https://www.amazontrust.com/repository/AmazonRootCA1.pem
  7. 다음 명령을 실행하여 지갑을 만듭니다.

    orapki wallet create -wallet . -auto_login_only  
    orapki wallet add -wallet . -trusted_cert -cert AmazonRootCA1.pem -auto_login_only

Amazon S3에 지갑 업로드

다음 단계를 완료합니다.

  1. 다음 명령을 실행하여 지갑을 Amazon S3 버킷에 업로드합니다.
    참고: S3 버킷은 DB 인스턴스와 동일한 AWS 리전에 있어야 합니다.

    aws s3 cp cwallet.sso s3://testbucket/
  2. 다음 명령을 실행하여 파일이 성공적으로 업로드되었는지 확인합니다.

    aws s3 ls testbucket

Amazon S3 통합을 사용하여 Amazon RDS 서버에 지갑을 다운로드합니다.

다음 단계를 완료합니다.

  1. Amazon RDS 콘솔을 열고 옵션 그룹을 생성합니다.
  2. S3_INTEGRATION 옵션을 옵션 그룹에 추가합니다.
  3. 옵션 그룹을 사용하여 DB 인스턴스를 생성합니다.
  4. AWS Identity and Access Management(IAM) 정책 및 역할을 생성합니다. 자세한 정보는 RDS for Oracle과 Amazon S3의 통합을 위한 IAM 권한 구성을 참조하세요.
  5. 다음 명령을 실행하여 S3 버킷에서 Amazon RDS로 지갑을 다운로드합니다.
    SQL> exec rdsadmin.rdsadmin_util.create_directory('S3_WALLET');  
    
    PL/SQL procedure successfully completed.  
    
    SQL> SELECT OWNER,DIRECTORY_NAME,DIRECTORY_PATH FROM DBA_DIRECTORIES WHERE DIRECTORY_NAME='S3_WALLET';  
    
    OWNER             DIRECTORY_NAME            DIRECTORY_PATH  
    -------------------- ------------------------------ ----------------------------------------------------------------------  
    SYS             S3_WALLET                /rdsdbdata/userdirs/01  
    
    SQL> SELECT  
    rdsadmin.rdsadmin_s3_tasks.download_from_s3(  
    p_bucket_name => 'testbucket',  
    p_directory_name => 'S3_WALLET',  
    P_S3_PREFIX => 'cwallet.sso')  AS TASK_ID FROM DUAL;  
    
    TASK_ID  
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------  
    1625291989577-52  
    
    SQL> SELECT filename FROM table(RDSADMIN.RDS_FILE_UTIL.LISTDIR('S3_WALLET'));  
    
    FILENAME  
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------  
    01/  
    cwallet.sso

기본 사용자가 아닌 RDS for Oracle 사용자의 경우: 사용자에게 필요한 권한을 부여하고 필요한 네트워크 ACL을 만듭니다

다음 명령을 실행하여 기본 사용자가 아닌 사용자에게 필요한 권한을 부여합니다.

begin  
    rdsadmin.rdsadmin_util.grant_sys_object(  
        p_obj_name  => 'DBA_DIRECTORIES',  
        p_grantee   => 'example-username',  
        p_privilege => 'SELECT');  
end;  
/

다음 명령을 실행하여 필요한 네트워크 ACL을 생성합니다.

BEGIN  
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (  
acl => 'ses_1.xml',  
description => 'AWS SES ACL 1',  
principal => 'TEST',  
is_grant => TRUE,  
privilege => 'connect');  
COMMIT;  
END;  
/  
BEGIN  
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL (  
acl => 'ses_1.xml',  
host => 'example-host');  
COMMIT;  
END;  
/

이메일 보내기

이메일을 보내려면 다음 절차를 실행합니다.

참고: 다음 값을 자신의 값으로 바꾸세요.

  • example-server를 자신의 SMTP 메일 서버 이름으로 바꿉니다.
  • example-sender-email을 발신자 이메일 주소로 바꿉니다.
  • example-receiver-email을 수신자 이메일 주소로 바꿉니다.
  • example-SMTP-username을 사용자 이름으로 바꿉니다.
  • example-SMTP-password를 자신의 암호로 바꿉니다.

온프레미스 SMTP 서버 또는 Amazon EC2를 SMTP 서버로 사용하는 경우 Amazon SES 정보를 온프레미스 또는 EC2 서버 세부 정보로 바꿉니다.

declare  
l_smtp_server varchar2(1024) := 'example-server';  
l_smtp_port number := 587;  
l_wallet_dir varchar2(128) := 'S3_WALLET';  
l_from varchar2(128) := 'example-sender-email';  
l_to varchar2(128)  := 'example-receiver-email';  
l_user varchar2(128) := 'example-SMTP-username';  
l_password varchar2(128) := 'example-SMTP-password';  
l_subject varchar2(128) := 'Test mail from RDS Oracle';  
l_wallet_path varchar2(4000);  
l_conn utl_smtp.connection;  
l_reply utl_smtp.reply;  
l_replies utl_smtp.replies;  
begin  
select 'file:/' || directory_path into l_wallet_path from dba_directories where directory_name=l_wallet_dir;  
--open a connection  
l_reply := utl_smtp.open_connection(  
host => l_smtp_server,  
port => l_smtp_port,  
c => l_conn,  
wallet_path => l_wallet_path,  
secure_connection_before_smtp => false);  
dbms_output.put_line('opened connection, received reply ' || l_reply.code || '/' || l_reply.text);  
--get supported configs from server  
l_replies := utl_smtp.ehlo(l_conn, 'localhost');  
for r in 1..l_replies.count loop  
dbms_output.put_line('ehlo (server config) : ' || l_replies(r).code || '/' || l_replies(r).text);  
end loop;  
--STARTTLS  
l_reply := utl_smtp.starttls(l_conn);  
dbms_output.put_line('starttls, received reply ' || l_reply.code || '/' || l_reply.text);  
--  
l_replies := utl_smtp.ehlo(l_conn, 'localhost');  
for r in 1..l_replies.count loop  
dbms_output.put_line('ehlo (server config) : ' || l_replies(r).code || '/' || l_replies(r).text);  
end loop;  
utl_smtp.auth(l_conn, l_user, l_password, utl_smtp.all_schemes);  
utl_smtp.mail(l_conn, l_from);  
utl_smtp.rcpt(l_conn, l_to);  
utl_smtp.open_data (l_conn);  
utl_smtp.write_data(l_conn, 'Date: ' || to_char(SYSDATE, 'DD-MON-YYYY HH24:MI:SS') || utl_tcp.crlf);  
utl_smtp.write_data(l_conn, 'From: ' || l_from || utl_tcp.crlf);  
utl_smtp.write_data(l_conn, 'To: ' || l_to || utl_tcp.crlf);  
utl_smtp.write_data(l_conn, 'Subject: ' || l_subject || utl_tcp.crlf);  
utl_smtp.write_data(l_conn, '' || utl_tcp.crlf);  
utl_smtp.write_data(l_conn, 'Test message.' || utl_tcp.crlf);  
utl_smtp.close_data(l_conn);  

l_reply := utl_smtp.quit(l_conn);  
exception  
when others then  
utl_smtp.quit(l_conn);  
raise;  
end;  
/

오류 문제 해결

ORA-29279: SMTP 사용자 이름 또는 암호가 정확하지 않으면 다음과 같은 오류가 발생할 수 있습니다.

"ORA-29279: SMTP permanent error: 535 Authentication Credentials Invalid"

이 문제를 해결하려면 SMTP 자격 증명이 정확한지 확인합니다.

ORA-00942: 기본 사용자가 아닌 사용자가 이메일 패키지를 실행하는 경우 다음과 같은 오류가 발생할 수 있습니다.

"PL/SQL: ORA-00942: table or view does not exist"

액세스 권한이 없는 개체를 식별한 다음, 필요한 권한을 부여합니다. 예를 들어 expample-username에 대한 DBA_directories와 같은 SYS 소유 개체에 대한 특정 권한이 없는 경우 다음 명령을 실행합니다.

begin  
    rdsadmin.rdsadmin_util.grant_sys_object(  
        p_obj_name  => 'DBA_DIRECTORIES',  
        p_grantee   => 'example-username',  
        p_privilege => 'SELECT');  
end;  
/

ORA-24247: 대상 호스트에 네트워크 ACL을 할당하지 않은 경우 다음 오류가 발생합니다. 사용자에게 대상 호스트에 액세스하는 데 필요한 권한이 없는 경우에도 이 오류가 발생합니다.

"ORA-24247: network access denied by access control list (ACL)"

이 문제를 해결하려면 다음 절차를 실행하여 네트워크 ACL을 생성하고 호스트에 네트워크 ACL을 할당합니다.

BEGIN  
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (  
acl => 'ses_1.xml',  
description => 'AWS SES ACL 1',  
principal => 'TEST',  
is_grant => TRUE,  
privilege => 'connect');  
COMMIT;  
END;  
/  

BEGIN  
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL (  
acl => 'ses_1.xml',  
host => 'example-host');  
COMMIT;  
END;  
/

ORA-29278: 보안 그룹, 방화벽 또는 네트워크 ACL을 올바르게 구성하지 않으면 다음과 같은 오류가 발생합니다.

"ORA-29278: SMTP transient error: 421 Service not available"

이 문제를 해결하려면 네트워크 구성을 올바르게 설정해야 합니다. VPC 흐름 로그에서 다음 정보를 검토할 수도 있습니다.

  • 소스 및 대상 IP 주소 분석: VPC 흐름 로그에서 소스 및 대상 IP 주소에서 전송된 데이터가 응답을 수신하는지 확인합니다.
  • 포트 및 프로토콜 검사: 올바른 포트와 프로토콜이 사용되고 비정상적인 불일치가 없는지 확인합니다.
  • **보안 그룹 및 네트워크 ACL: ** 보안 그룹 및 네트워크 ACL 구성을 확인하여 필요한 포트에서 트래픽을 허용하는지 확인합니다.
  • 서브넷 라우팅: 관련 서브넷의 라우팅 테이블이 데이터베이스 서버로 트래픽을 라우팅하도록 올바르게 구성되었는지 확인합니다.
  • 지연 시간 및 패킷 손실: 지연 시간 또는 패킷 손실을 찾습니다. 지연 시간 및 패킷 손실은 네트워크 문제를 나타낼 수 있습니다.

자세한 내용은 Oracle 웹 사이트에서 VPC 흐름 로그를 사용하여 IP 트래픽 로깅UTL_SMTP을 사용할 때 ORA-29278 및 ORA-29279 문제 해결(문서 ID 2287232.1)을 참조하세요.

ORA-29279: Amazon SES에서 자격 증명을 생성하지 않은 경우 다음과 같은 오류가 발생할 수 있습니다.

"ORA-29279: SMTP permanent error: 554 Message rejected: Email address is not verified. The following identities failed the check in region <REGION>:'example-sender-email'"

이 문제를 해결하려면 도메인 수준에서 ID를 구성하거나 이메일 주소 ID를 만듭니다. 자세한 내용은 Amazon SES에서 자격 증명 생성 및 확인을 참조하세요.

Amazon RDS에서 Amazon SES 엔드포인트로의 연결 테스트

다음 절차를 실행하여 Amazon RDS와 Amazon SES 엔드포인트 간의 연결을 테스트합니다.

CREATE OR REPLACE FUNCTION fn_check_network  
(p_remote_host in varchar2, -- host name  
 p_port_no in integer default 587  
)  
RETURN number IS  
   v_connection   utl_tcp.connection;  
BEGIN  
   v_connection := utl_tcp.open_connection(REMOTE_HOST=>p_remote_host, REMOTE_PORT=>p_port_no, IN_BUFFER_SIZE=>1024, OUT_BUFFER_SIZE=>1024,   TX_TIMEOUT=>5);  
   RETURN 1;  
EXCEPTION  
   WHEN others THEN  
      return sqlcode;  
END fn_check_network;  
/
SELECT fn_check_network('email-smtp.<region>.amazonaws.com', 587) FROM dual;

프로시저가 성공하면 함수는 1을 반환합니다. 프로시저가 실패하면 함수는 ORA-29260을 반환합니다.

관련 정보

Oracle 웹 사이트의 이메일 전송 서비스 개요

Oracle 웹 사이트의 UTL_SMTP

AWS 공식
AWS 공식업데이트됨 일 년 전