Amazon RDS for Oracle DB インスタンスから E メールを送信する方法を教えてください。

所要時間5分
0

E メールを送信するように Oracle DB インスタンス用の Amazon Relational Database Service (Amazon RDS) を設定したいと考えています。

簡単な説明

RDS for Oracle DB インスタンスから E メールを送信するには、UTL_MAIL または UTL_SMTP パッケージを使用します。RDS for Oracle で UTL_MAIL を使用するには、インスタンスにアタッチされているデフォルト以外のオプショングループに UTL_MAIL オプションを追加します。UTL_MAIL の設定方法の詳細については、Oracle UTL_MAIL を参照してください。

ULT_SMTP を RDS for Oracle で使用するには、オンプレミスマシンで SMTP サーバーを設定するか、Amazon Simple Email Service (Amazon SES) を使用します。RDS for Oracle DB インスタンスから SMTP サーバーへの接続が正しく設定されていることを確認します。

次の解決策では、Amazon SES を使用して UTL_SMTP パッケージを介して E メールを送信する方法を説明しています。

前提条件

RDS DB インスタンスから Amazon SES エンドポイントにアクセスできることを確認します。DB インスタンスがプライベートサブネットで実行されている場合は、Amazon ]() SES への仮想プライベートクラウド (VPC) [ エンドポイントを作成します。

注: プライベートサブネットで実行される DB インスタンスの場合は、NAT ゲートウェイを使用して Amazon SES エンドポイントと通信することもできます。

E メールを送信するように DB インスタンスを設定する

E メールを送信するように 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 の認証情報を使用して E メールを送信します。

解決策

**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

SMTP メールサーバーをセットアップする

Amazon SES を使用して SMTP メールサーバーをセットアップする方法については、「Amazon SES を使用して SMTP をセットアップして接続する方法を教えてください」を参照してください。

Amazon SES で VPC を作成する

Amazon SES を使用して VPC を作成する方法については、「Amazon SES で VPC エンドポイントをセットアップする」を参照してください。

Amazon EC2 インスタンスを作成し、Oracle クライアントとウォレットを設定する

次の手順を実行します。

  1. Amazon EC2 Linux インスタンスを作成します

  2. Oracle クライアントをインストールします。
    **注:**DB インスタンスと同じバージョンのクライアントを使用するのがベストプラクティスです。この解決策では、Oracle バージョン 19c を使用します。このクライアントをダウンロードするには、オラクルのウェブサイトの「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

Oracle ユーザー向け非プライマリ RDS ユーザーの場合: 必要な権限をユーザーに付与し、必要なネットワーク 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;  
/

E メールを送信

E メールを送信するには、次の手順を実行します。

注: 以下の値をご使用の値に置き換えてください。

  • SMTP メールサーバーの名前を指定したexample-server
  • 送信者の電子メールアドレスを指定した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"

アクセス権のないオブジェクトを特定し、必要な権限を付与します。例えば、example-usernameDBA_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 の設定をチェックして、必要なポートでトラフィックが許可されていることを確認します。
  • サブネットルーティング: 関連するサブネットのルーティングテーブルが、トラフィックをデータベースサーバーにルーティングするように正しく構成されていることを確認します。
  • レイテンシーとパケットロス: レイテンシーまたはパケットロスを調べてください。レイテンシーとパケットロスは、ネットワークに問題がある可能性があります。

詳細については、オラクルのウェブサイトの「VPC フローログを使用した IP トラフィックのログ記録」およびオラクルのウェブサイトの「Troubleshooting ORA-29278 and ORA-29279 when using UTL_SMTP (Doc ID 2287232.1)」を参照してください。

**ORA-29279:**Amazon SES で ID を作成しなかった場合、次のエラーが表示されることがあります。

"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 の ID の作成と検証」を参照してください。

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」を返します。

関連情報

オラクルのウェブサイトの「電子メール配信の概要

オラクルのウェブサイトの UTL_SMTP

AWS公式
AWS公式更新しました 1年前
コメントはありません