RDS for Oracle と S3 でファイルをやり取りする

こちらを参照しました
　→[Amazon RDS for OracleでS3と直接ファイルをやり取り可能になりました](https://dev.classmethod.jp/cloud/aws/rds-for-oracle-supports-s3-integration/)
　→[Amazon S3 の統合](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/oracle-s3-integration.html)


# 前提
- S3を介し、ORCL1（RDS）とORCL2(RDS)でファイルをやり取りする。
- 検証はオレゴン（us-west-2）で実施。
- 事前にS3バケット（orcl-test）を作成。

# オプショングループの作成
S3連携はオプショングループで有効化するらしい。

RDSコンソールからのオプショングループ画面で`グループの作成`をクリック
<img width="1718" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/0e96379c-b292-0536-0c45-43ba46953f40.png">

今回は以下で設定。
エンジンはRDSのエディションに合わせ、メジャーエンジンのバージョンはRDSのバージョンに合わせる。
説明も入れないと作成ができないため、適当に入力。

| エンジン  |エディション | 
|:-----------------|------------------|
| oracle-ee  |Enterpries Edition|
| oracle-se2  |Standard Edition 2|
| oracle-se |Standard Edition|
| oracle-se1 |Standard Edition 1|
<img width="837" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/83b088ee-0e02-ce2d-3cb4-fa551bc5434e.png">

作成したオプショングループ（orcl-s3）を選択し`オプションの追加`
<img width="1717" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/ab6e8a3d-5bf3-7ad1-19b4-d66a6a4bac9b.png">

オプションの追加では以下に設定。
※[Oracle DB インスタンスのオプション](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Appendix.Oracle.Options.html#Appendix.Oracle.Options.Timezone)

<img width="842" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/09a1e415-6df7-9809-cf6d-04389b1e90de.png">

# DBインスタンスにオプショングループを付与
今回は事前にDBインスタンスを作成している。

RDSのコンソールで対象インスタンスを選択し`変更`
<img width="1749" alt="5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/368616f7-5a45-cfd1-474e-3c2febaf1963.png">

データベースの設定の項目の`オプショングループ`に作成したオプショングループ（orcl-s3）を指定し`次へ`
<img width="847" alt="6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/236ecdda-3614-ab2a-9e00-73beb171ac3a.png">

今回は即時適用したいため、変更のスケジュールを`すぐに適用`にし、`DBインスタンスの変更`をクリック
<img width="886" alt="7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/f32382f0-6e76-4dfc-1871-1df9ef536daf.png">

# IAMロールの作成
RDSがS3にアクセスするためのIAMロールを作成

- IAMポリシー（s3-integration-policy）を作成

| オプション |内容 | 
|:-----------------|------------------|
| --policy-name|IAMポリシー名 (例：s3-integration-policy)|
| Action|使用する権限は s3:GetObject 、 s3:ListBucket 、 s3:PutObject の3種類|
| Resource|S3のバケット名 （例：orcl-test）|

```
$ 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:::orcl-test",
>          "arn:aws:s3:::orcl-test/*"
>        ]
>      }
>    ]
>  }'
{
    "Policy": {
        "PolicyName": "s3-integration-policy",
        "PermissionsBoundaryUsageCount": 0,
        "CreateDate": "2019-07-03T05:25:34Z",
        "AttachmentCount": 0,
        "IsAttachable": true,
        "PolicyId": "ANPAZ6OVR5XYVBJSDXSCT",
        "DefaultVersionId": "v1",<img width="1749" alt="8-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/e93a18e8-e30b-9320-047f-0a7dcd5ae6cc.png">

        "Path": "/",
        "Arn": "arn:aws:iam::683884539377:policy/s3-integration-policy",
        "UpdateDate": "2019-07-03T05:25:34Z"
    }
}
```
- 作成したポリシーの確認

```
$ aws iam list-policies --query "Policies[?PolicyName == 's3-integration-policy']"
[
    {
        "PolicyName": "s3-integration-policy",
        "PermissionsBoundaryUsageCount": 0,
        "CreateDate": "2019-07-03T05:25:34Z",
        "AttachmentCount": 0,
        "IsAttachable": true,
        "PolicyId": "ANPAZ6OVR5XYVBJSDXSCT",
        "DefaultVersionId": "v1",
        "Path": "/",
        "Arn": "arn:aws:iam::683884539377:policy/s3-integration-policy",
        "UpdateDate": "2019-07-03T05:25:34Z"
    }
]
```

- IAMのコンソールからも作成したポリシーを確認

<img width="1751" alt="8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/68e634de-7482-ec37-2912-1ceba8f8716b.png">

- 作成されたポリシーに、3種類の権限があることを確認

<img width="1749" alt="8-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/c13a8d72-23dc-c2f4-f77f-5049ecb9dd23.png">


- IAMロール（s3-integration-role）の作成

| オプション |内容 | 
|:-----------------|------------------|
| --role-name|IAMロール名 (例：s3-integration-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": "AROAZ6OVR5XYUOGZ7UMX2",
        "CreateDate": "2019-07-03T05:29:06Z",
        "RoleName": "s3-integration-role",
        "Path": "/",
        "Arn": "arn:aws:iam::683884539377:role/s3-integration-role"
    }
}
```

- 作成したロールを確認

```
$ aws iam list-roles --query "Roles[?RoleName == 's3-integration-role']"
[
    {
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Action": "sts:AssumeRole",
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "rds.amazonaws.com"
                    }
                }
            ]
        },
        "MaxSessionDuration": 3600,
        "RoleId": "AROAZ6OVR5XYUOGZ7UMX2",
        "CreateDate": "2019-07-03T05:29:06Z",
        "RoleName": "s3-integration-role",
        "Path": "/",
        "Arn": "arn:aws:iam::683884539377:role/s3-integration-role"
    }
]
```

- IAMコンソールからも作成したロールを確認

<img width="1752" alt="9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/f002d2d6-e1e5-8605-a1e2-494153cbfde3.png">

- 作成したIAMロールにさきほど作成したIAMポリシーをアタッチ

| オプション |内容 | 
|:-----------------|------------------|
| -policy-arn|IAMロールにアタッチするポリシーのARN|
| --role-name|アタッチされるロール名 (例：s3-integration-role)|

```
$ aws iam attach-role-policy \
>     --policy-arn arn:aws:iam::683884539377:policy/s3-integration-policy \
>     --role-name s3-integration-role
```

- ロールにアタッチされたポリシーの確認

| オプション |内容 | 
|:-----------------|------------------|
| --role-name|IAMロール名|

```
$ aws iam list-attached-role-policies --role-name s3-integration-role
{
    "AttachedPolicies": [
        {
            "PolicyName": "s3-integration-policy",
            "PolicyArn": "arn:aws:iam::683884539377:policy/s3-integration-policy"
        }
    ]
}
```

- IAMコンソールからもIAMロールにIAMポリシーがアタッチされていることを確認

<img width="1760" alt="スクリーンショット 2019-07-03 16.20.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/c7129669-216d-583f-de87-1e50b77e3207.png">

- RDSにIAMロールを付与

| オプション |内容 | 
|:-----------------|------------------|
|--db-instance-identifier|データベース名|
|--role-arn|付与するロールのARN|

```
$ aws rds add-role-to-db-instance \
>     --db-instance-identifier orcl1 \
>     --feature-name S3_INTEGRATION \
>     --role-arn arn:aws:iam::683884539377:role/s3-integration-role
```

<img width="1457" alt="10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/692a9e67-571b-b100-0ae6-208f11ff5cf8.png">

`※今回は、S3のファイルをORCL2にダウンロードするため、ORCL2にもIAMロールを付与しておく`

# ダンプファイルのエクスポート
ORCL1でダンプファイルをエクスポート。
エクスポート方法は[こちら](https://qiita.com/ghogho-seki/items/3ab2dd085115d62c4307)。

S3へ転送するファイルを確認。

```sql
SQL> set pages 100 line 200
SQL> col filename for a20
SQL> select * from TABLE(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) ORDER BY MTIME;

FILENAME	         TYPE	      FILESIZE MTIME
-------------------- ---------- ---------- ---------
scott.dmp	            file	  26267648 28-JUN-19　★今回の転送対象
exp_scott.log	        file	      1034 28-JUN-19
datapump/	       directory	      4096 28-JUN-19
expdb_tables.log        file	       140 28-JUN-19
```

# S3へのアップロード
- `rdsadmin.rdsadmin_s3_tasks.upload_to_s3 プロシージャ`を使用し、
ORCL1でエクスポートしたダンプファイル（scott.dmp）をS3へアップロードする。

     `rdsadmin.rdsadmin_s3_tasksパッケージについては`[こちら](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/oracle-s3-integration.html)

| オプション |内容 | 
|:-----------------|------------------|
|p_bucket_name                                    |ファイルをアップロードする S3バケット名|
|p_directory_name                          　         |アップロード元のディレクトリオブジェクト名|
|p_s3_prefix                                         |アップロードする S3ファイル名のプレフィックス|
|p_prefix                                               |アップロードするファイル名|


```sql
SQL> SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3(
        p_bucket_name => 'orcl-test',
        p_directory_name => 'DATA_PUMP_DIR',
        p_s3_prefix => 'orcl-test/',
        p_prefix => 'scott.dmp')
   AS TASK_ID FROM DUAL; 

TASK_ID
--------------------------------------------------------------------------------
1562135977873-33
```

- ログの確認

```sql
SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-1562135977873-33.log'));
 
TEXT
--------------------------------------------------------------------------------
2019-07-03 06:39:39.129 UTC [INFO ] File #1: Uploading the file /rdsdbdata/datap
ump/scott.dmp to Amazon S3 with bucket name orcl-test and key orcl-test/scott.dm
p.

2019-07-03 06:39:41.300 UTC [INFO ] The file /rdsdbdata/datapump/scott.dmp was u
ploaded to Amazon S3 with bucket name orcl-test and key orcl-test/scott.dmp.

2019-07-03 06:39:41.300 UTC [INFO ] The task finished successfully.
```

- S3にファイルがアップロードされたか確認

<img width="1683" alt="11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/cec3c2b3-ec49-a1e2-37b6-194708016f32.png">

# S3からダウンロード
ORCL2からS３上のファイルをダウンロード。

- DATA_PUMP_DIRのファイルを確認

```sql
SQL> set pages 100 line 200
SQL> col filename for a20
SQL> select * from TABLE(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) ORDER BY MTIME;

FILENAME	     TYPE	  FILESIZE MTIME
-------------------- ---------- ---------- ---------
datapump/	     directory	      4096 02-JUL-19
```

- `rdsadmin.rdsadmin_s3_tasks.download_from_s3プロシージャ`を使用しS3のファイルをダウンロード

| オプション |内容 | 
|:-----------------|------------------|
|p_bucket_name|ファイルをダウンロードする S3バケット名|
|p_directory_name    　 |ダウンロード先のディレクトリオブジェクト名|
|p_s3_prefix                                         |ダウンロードする S3ファイル名のプレフィックス|

```sql
SQL> SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3(
      p_bucket_name    =>  'orcl-test',       
      p_directory_name =>  'DATA_PUMP_DIR',
      p_s3_prefix => 'orcl-test/') 
     AS TASK_ID FROM DUAL;            

TASK_ID
----------------------------------
1562139822040-55
```

- ログの確認

```sql
SQL> col text for a170
SQL> SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-1562139822040-55.log'));

TEXT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2019-07-03 07:43:42.095 UTC [INFO ] This task is about to list the Amazon S3 objects for AWS Region us-west-2, bucket name orcl-test, and prefix orcl-test/.
2019-07-03 07:43:42.167 UTC [INFO ] The task successfully listed the Amazon S3 objects for AWS Region us-west-2, bucket name orcl-test, and prefix orcl-test/.
2019-07-03 07:43:42.178 UTC [INFO ] This task is about to download the Amazon S3 object or objects in /rdsdbdata/datapump from bucket name orcl-test and key orcl-test/scott.dmp.
2019-07-03 07:43:43.318 UTC [INFO ] The task successfully downloaded the Amazon S3 object or objects from bucket name orcl-test with key orcl-test/scott.dmp to the location /rdsdbdata/datapump.
2019-07-03 07:43:43.356 UTC [INFO ] The task finished successfully.
```

- DATA_PUMP_DIRのファイルを確認

```sql
SQL> set pages 100 line 200
SQL> col filename for a20
SQL> select * from TABLE(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) ORDER BY MTIME;

FILENAME	         TYPE	      FILESIZE MTIME
-------------------- ---------- ---------- ---------
scott.dmp	         file	      26267648 03-JUL-19 ★ダウンロードされた
datapump/	         directory	      4096 03-JUL-19
```

# ダンプファイルのインポート

インポートは[こちら](https://qiita.com/ghogho-seki/items/9834cfa38aa346184b78)を参照