Amazon RDS for Oracle インスタンスで E メールを送信するように設定するにはどうすればよいですか。

所要時間4分
0

Amazon Relational Database Service (Amazon RDS) for Oracle DB インスタンスでメールを送信するように設定したい。

簡単な説明

Amazon RDS for Oracle インスタンスから E メールを送信するには、 UTL_MAIL または UTL_SMTP パッケージを使用できます。

  • RDS for Oracle で UTL_MAIL を使用するには、インスタンスにアタッチされたデフォルト以外のオプショングループに UTL_MAIL オプションを追加する必要があります。UTL_MAIL の設定の詳細については、 ORACLE UTL_MAIL を参照してください。
  • RDS for Oracle で UTL_SMTP を使用するには、Amazon Simple Email Service (Amazon SES) を使用して、オンプレミスのマシンまたは Amazon Elastic Compute Cloud (Amazon EC2) インスタンスに SMTP サーバーを設定する必要があります。この場合、RDS for Oracle から SMTP サーバーへの接続が正しく構成されていることを確認してください。

この記事では、Amazon SES を使用して UTL_SMTP パッケージを介して E メールを送信するように DB インスタンスを設定することに焦点を当てます。

前提条件として、RDS インスタンスから Amazon SES エンドポイントにアクセスできることを確認してください。RDS インスタンスがプライベートサブネットで実行されている場合は、サブネットのルートテーブルに NAT ゲートウェイを追加する必要があります。これは、サブネットが Amazon SES エンドポイントと通信するために必要です。サブネットのルートテーブルを確認するには、 Amazon VPC コンソールを開き、ナビゲーションペインで [Route Tables] を選択します。

メールを送信するように DB インスタンスを設定するには、次の手順を実行します。

  1. SMTP メールサーバーをセットアップします。この記事では、SMTP メールサーバーの設定に Amazon SES を使用します。
  2. Amazon EC2 インスタンスを作成する次に、適切な証明書を使用して Oracle クライアントとウォレットを構成します。
  3. ウォレットをAmazon Simple Storage Service (Amazon S3) のバケットにアップロードします。
  4. S3 インテグレーションを使用して、Amazon S3 バケットから RDS サーバーにウォレットをダウンロードします。
  5. ユーザーに必要な権限を付与し (ユーザーがマスター以外のユーザーの場合)、必要なアクセス制御リスト (ACL) を作成します。
  6. Amazon SES 認証情報とこの記事に記載されている手順を使用してメールを送信します。

解決方法

Amazon SES を使用して SMTP メールサーバーをセットアップする

手順については、「Amazon SES を使用して SMTP をセットアップして接続するにはどうすればよいですか。」を参照してください。

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

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

2.    Amazon RDS インスタンスのバージョンと同じバージョンの Oracle Client をインストールします。この記事では、Oracle バージョン 19c を使用しています。Oracle 19c クライアントをダウンロードできます。 Oracle データベース 19c (19.3) を参照してください。このバージョンには orapki ユーティリティーも付属しています。

3.    AWS Command Line Interface (AWS CLI)をインストールします。

4.    EC2 インスタンスから RDS セキュリティグループのデータベースポートへの接続を許可します。両方のインスタンスが同じ 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 インテグレーションが機能するには、S3 バケットが RDS インスタンスと同じリージョンにあることを確認してください。

aws s3 cp cwallet.sso s3://testbucket/

2.    次のコマンドを実行して、ファイルが正常にアップロードされたかどうかを確認します。

aws s3 ls testbucket

S3 インテグレーションを使用してウォレットを RDS サーバーにダウンロードする

1.    Amazon RDS コンソールを使用してオプショングループを作成します。

2.    作成したオプショングループに S3_INTEGRATION オプションを追加します。これは、Amazon S3 から RDS インスタンスにウォレットファイルをダウンロードするために必要です。

3.    作成したオプショングループを使用して RDS for Oracle インスタンスを作成します。

4.    AWS Identity and Access Management (IAM) のポリシーとロールを作成して、S3 インテグレーションの準備をします。詳細については、Amazon RDS for Oracle と Amazon S3 を統合する前提条件を参照してください。

5.    次のコマンドを実行して、S3 バケットから 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

必要な権限をユーザーに付与し、必要な ACL を作成します。

**注:**RDS for Oracle でマスター以外のユーザーを使用している場合は、この手順が必要です。

以下のコマンドを実行して、マスター以外のユーザーに必要な権限を付与します。

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;
/

メールを送信する

電子メールを送信するには、以下の手順を実行してください。

注: この手順では、以下の値を必ず置き換えてください。

  • SMTP メールサーバーの名前を指定した example-sever
  • 送信者のメールアドレスを指定した example-sender-email
  • 受信者のメールアドレスを指定した example-receiver-email
  • ユーザ名を指定した example-SMTP-username
  • パスワードを指定した example-SMTP-username

SMTP サーバーとしてオンプレミスまたは Amazon EC2 を使用している場合は、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

この問題を解決するには、次の手順を実行して、必要な権限をユーザーに付与します。

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;
/

関連情報

メール配信サービスの概要に関するOracleのドキュメント

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

関連するコンテンツ