この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
大栗です。
今までRDS for Oracleは直接S3と連携できずにダンプファイルの受け渡しが不便でした。今回S3と直接連携できるようになったのでご紹介します。
Amazon RDS for Oracle Now Supports Amazon S3 Integration
Amazon RDS for Oracleのデータインポート/エクスポート
Oracle Databaseはデータのインポート/エクスポートにOracle Data Pumpを使用します。しかしOracle Data PumpはダンプファイルをDirectoryオブジェクトにローカルのファイルとして配置します。RDSの場合はOSにログインできずローカルファイルを触ることができないので工夫が必要です。
今までは手元にOracle Databaseを用意してRDS for OracleとDBLinkで接続して、手元のOracle DatabaseのDirectoryオブジェクトにダンプファイルを出力していました。ダンプファイルは大きなファイルになりがちなのでS3などで保存する事が多いと思います。オンプレミスのOracle Databaseと直接DBLinkで接続するか、別途Oracle Databaseを立てる必要があり手間がかかるものでした。
今回のアップデートによりRDS for OracleがS3とファイルを直接やり取りできるようになりました。
やってみた
以下の手順でOracleのS3連携を試してみます。
- オプショングループの作成
- DBインスタンスの作成
- IAM Roleの作成
- ダンプファイルの作成
- S3へのアップロード/ダウンロード
以下は東京リージョンで検証しています。
オプショングループの作成
S3連携はオプショングループで有効化をします。
RDSコンソールのオプショングループの画面でグループの作成
をクリックします。
ここではエンジンバージョンをoracle-se2
、メジャーエンジンのバージョンを12.2
で作成します。
作成したオプショングループを選択してオプションの追加
をクリックします。
オプションはS3_INTEGRATION
、バージョンは1.0
、すぐに適用ではい
を選択して、オプションの追加
をクリックします。
DBインスタンスの作成
RDS for OracleのDBインスタンスを起動します。
RDSコンソールのダッシュボードでデータベースの作成
をクリックします。
エンジンのオプションでOracle
を選択して、エディションでOracle Standard Edition Two
を選択して次へをクリックします。
ここでは開発/テスト
を選択して次へ
をクリックします。
ライセンスモデルはライセンス込み
、DBエンジンのバージョンはOracle 12.2.0.1.ru-2019-01.rur-2019-01.r1
としました。
DBインスタンス識別子やマスターユーザの名前、パスワードを入力して次へ
をクリックします。
データベースの設定のオプショングループで最初に作成したものを選択します。その他の設定を行いデータベースの作成
をクリックします。
DBインスタンスが起動するまで待ちます。
IAM Roleの作成
RDSがS3にアクセスするためのIAM Roleを作成します。
初めに、以下のコマンドでIAMポリシーを作成します。使用する権限はs3:GetObject
、s3:ListBucket
、s3:PutObject
の3種類です。``はアクセス対象のS3のバケット名で置き換えて下さい。
$ aws iam create-policy \
> --policy-name s3-integration-policy \
> --policy-document '{
> "Version": "2012-10-17",
> "Statement": [
> {
> "Sid": "s3integration",
> "Action": [
> "s3:GetObject",
> "s3:ListBucket",
> "s3:PutObject"
> ],
> "Effect": "Allow",
> "Resource": [
> "arn:aws:s3:::<Bucket Name>",
> "arn:aws:s3:::<Bucket Name>/*"
> ]
> }
> ]
> }'
{
"Policy": {
"PolicyName": "s3-integration-policy",
"PermissionsBoundaryUsageCount": 0,
"CreateDate": "2019-02-28T07:56:41Z",
"AttachmentCount": 0,
"IsAttachable": true,
"PolicyId": "A1B2C3D4E5F6G7H8I9K0L",
"DefaultVersionId": "v1",
"Path": "/",
"Arn": "arn:aws:iam::123456789012:policy/s3-integration-policy",
"UpdateDate": "2019-02-28T07:56:41Z"
}
}
RDSにアタッチできるIAM Roleを作成します。
$ aws iam create-role \
> --role-name s3-integration-role \
> --assume-role-policy-document '{
> "Version": "2012-10-17",
> "Statement": [
> {
> "Effect": "Allow",
> "Principal": {
> "Service": "rds.amazonaws.com"
> },
> "Action": "sts:AssumeRole"
> }
> ]
> }'
{
"Role": {
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": "rds.amazonaws.com"
}
}
]
},
"RoleId": "A1B2C3D4E5F6G7H8I9K0L",
"CreateDate": "2019-02-28T07:57:31Z",
"RoleName": "s3-integration-role",
"Path": "/",
"Arn": "arn:aws:iam::123456789012:role/s3-integration-role"
}
}
Roleにポリシーをアタッチします。
$ aws iam attach-role-policy \
> --policy-arn arn:aws:iam::123456789012:policy/s3-integration-policy \
> --role-name s3-integration-role
起動したRDSにIAM Roleを付与します。
$ aws rds add-role-to-db-instance \
> --db-instance-identifier ora1 \
> --feature-name S3_INTEGRATION \
> --role-arn arn:aws:iam::123456789012:role/s3-integration-role
これでRDS for OracleにS3へのアクセス権限が付きました。
ダンプファイルの作成
S3へアップロードするダンプファイルを作成します。
クライアントはAmazon Linux 2を想定しています。
以下のOracleのサイトからInstant Clientをダウンロートします。
Instant Client Downloads for Linux x86-64 (64-bit)
SQL*PLUSを使用するため、以下のファイルをダウンロードしてAmazon Linux 2にインストールします。
- oracle-instantclient18.3-basic-18.3.0.0.0-3.x86_64.rpm
- oracle-instantclient18.3-sqlplus-18.3.0.0.0-3.x86_64.rpm
今回は一時的に接続するだけなので、tnsnames.oraの設定を行わずに接続します。
$ export LD_LIBRARY_PATH=/usr/lib/oracle/18.3/client64/lib
1-6-127 ~]$ sqlplus64 awsuser/mypassword@"(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora1.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))"
SQL*Plus: Release 18.0.0.0.0 - Production on Thu Feb 28 07:43:14 2019
Version 18.3.0.0.0
Copyright (c) 1982, 2018, Oracle. All rights reserved.
Last Successful login time: Thu Feb 28 2019 07:20:09 +00:00
Connected to:
Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production
SQL>
ディレクトリの状態を確認してみます。
SQL> select directory_name, directory_path FROM dba_directories
2 where directory_name='DATA_PUMP_DIR';
DIRECTORY_NAME
--------------------------------------------------------------------------------
DIRECTORY_PATH
--------------------------------------------------------------------------------
DATA_PUMP_DIR
/rdsdbdata/datapump
サンプル用のテーブルを作成してみます。
SQL> create table sample_table (
2 col1 int,
3 col2 varchar(20),
4 col3 date);
Table created.
SQL> insert into sample_table (col1, col2, col3)
2 values (1, 'Developers.IO', sysdate);
1 row created.
SQL> commit;
Commit complete.
ダンプファイルを作成します。DBMS_DATAPUMP
パッケージを使用して作成します。
SQL> DECLARE
2 hdnl NUMBER;
3 BEGIN
4 hdnl := DBMS_DATAPUMP.open( operation => 'EXPORT', job_mode => 'SCHEMA', job_name=>null);
5 DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'tab1.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file);
6 DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'exp.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file);
7 DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''AWSUSER'')');
8 DBMS_DATAPUMP.start_job(hdnl);
9 END;
10 /
PL/SQL procedure successfully completed.
ディレクトリの中を確認すると、以下のようにファイルが出力されています。
SQL> select * from table
2 (rdsadmin.rds_file_util.listdir(p_directory => 'DATA_PUMP_DIR'));
FILENAME
------------------------------------------------------------------------------------------------------------------------
TYPE FILESIZE MTIME
---------- ---------- ---------
datapump/
directory 4096 28-FEB-19
exp.log
file 604 28-FEB-19
tab1.dmp
file 49152 28-FEB-19
S3へのアップロード/ダウンロード
S3へのファイル出力はrdsadmin.rdsadmin_s3_tasks.upload_to_s3
を使用します。詳しくは以下のドキュメントをご確認ください。
Transferring Files Between Amazon RDS for Oracle and an Amazon S3 Bucket
以下のコマンドを実行します。するとTASK_ID
が返ってきます。
SQL> SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3(
2 p_bucket_name => 'bucket-name',
3 p_prefix => 'exp.log',
4 p_s3_prefix => 'dbfiles/',
5 p_directory_name => 'DATA_PUMP_DIR')
6 AS TASK_ID FROM DUAL;
TASK_ID
------------------------------------------------------------------------------------------------------------------------
1234567890123-12
dbtask-.log
の形式でログが出力されるので内容を確認します。アップロードが成功していました。
SQL> SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-1234567890123-12.log'));
TEXT
------------------------------------------------------------------------------------------------------------------------
2019-02-28 08:35:31.686 UTC [INFO ] File #1: Uploading the file /rdsdbdata/datapump/exp.log to Amazon S3 with bucket nam
e bucket-name and key exp.log.
2019-02-28 08:35:31.872 UTC [INFO ] The file /rdsdbdata/datapump/exp.log was uploaded to Amazon S3 with bucket name buck
et-name and key exp.log.
2019-02-28 08:35:31.873 UTC [INFO ] The task finished successfully.
S3も確認してみます。S3側もファイルが有ることが確認できました。
次にS3からファイルをダウンロードしてみます。
S3にtest.txt
というファイルを用意します。
rdsadmin.rdsadmin_s3_tasks.download_from_s3
でダウンロードします。
SQL> SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3(
2 p_bucket_name => 'bucket-name
5 AS TASK_ID FROM DUAL;
TASK_ID
--------------------------------------------------------------------------------
1234567890123-45
ログを確認すると成功しています。
SQL> SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-1234567890123-45.log'));
TEXT
--------------------------------------------------------------------------------
2019-03-01 00:08:32.411 UTC [INFO ] This task is about to list the Amazon S3 obj
ects for AWS Region ap-northeast-1, bucket name bucket-name, and prefix dbfiles/
test.txt.
2019-03-01 00:08:32.488 UTC [INFO ] The task successfully listed the Amazon S3 o
bjects for AWS Region ap-northeast-1, bucket name bucket-name, and prefix dbfile
s/test.txt.
2019-03-01 00:08:32.498 UTC [INFO ] This task is about to download the Amazon S3
object or objects in /rdsdbdata/datapump to bucket name bucket-name and key dbf
iles/test.txt.
TEXT
--------------------------------------------------------------------------------
2019-03-01 00:08:32.576 UTC [INFO ] The task successfully downloaded the Amazon
S3 object or objects from bucket name bucket-name with key dbfiles/test.txt to t
he location /rdsdbdata/datapump.
2019-03-01 00:08:32.604 UTC [INFO ] The task finished successfully.
ディレクトリの中身にもtest.txt
があり、ちゃんとS3からダウンロードできたことを確認できます。
SQL> select * from table
2 (rdsadmin.rds_file_util.listdir(p_directory => 'DATA_PUMP_DIR'));
FILENAME
--------------------------------------------------------------------------------
TYPE FILESIZE MTIME
---------- ---------- ---------
datapump/
directory 4096 01-MAR-19
exp.log
file 1197 28-FEB-19
tab1.dmp
file 348160 28-FEB-19
FILENAME
--------------------------------------------------------------------------------
TYPE FILESIZE MTIME
---------- ---------- ---------
test.txt
file 9 01-MAR-19
さいごに
いかがでしたか?今までダンプファイルをRDS for Oracleとやり取りするには別途Oracle Databaseサーバーが必要となり大変面倒な作業でした。今回のアップデートによりS3と簡単にファイルをアップロード/ダウンロードできるようになったためデータの受け渡しが簡単になりました。RDS for Oracleを利用されている方には必須となる知識だと思いますので、ご活用ください。