Autonomous Database：S3バケットにファイルがアップロードされたら自動的に表にロードするライブ表フィードを設定してみた

# はじめに

特定のS3バケットに新規にファイルがアップロードされたら、自動的にAutonomous Database内の表にデータをロードする方法が[マニュアル](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/feed.html#GUID-6EA3DA52-C8E0-4986-A587-9D8EF15BD039)に記載されたので、検証してみました。

仕組みとしては、S3バケットのイベント通知をAmazon SNS経由でAutonomos Databaseが受信し、データのロード（ライブ表フィード）を行うというものです。

# 1. S3バケットの作成とファイルのアップロード
今回は、my-bucket-forlivefeedというS3バケットを作成し、その中にempdataというフォルダを用意しました。
![スクリーンショット 2024-07-24 14.54.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/e8ff23f3-f84a-950a-9a0d-5d565c391734.png)

初期データとして、empdataフォルダにこちらのempdata1.txtをアプロードします。

```text:empdata1.txt
1,SMITH
2,ALLEN
3,WARD
```

![スクリーンショット 2024-07-24 14.53.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/2bfd5642-dbe5-8d39-a96f-2b732e878026.png)


# 2. Amazon S3に対するクラウド・ストレージ・リンク（クラウドストアの場所）の作成
Amazon S3に対するクラウド・ストレージ・リンク（クラウドストアの場所）作成を作成します。

Autonomous DatatabaseのDatabase Actionのデータ・ロードにアクセスします。

![スクリーンショット 2024-07-24 15.01.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/5ed7dd86-d88c-f656-6725-82b0d042dd3f.png)

「接続」をクリックします。
![スクリーンショット 2024-07-24 15.02.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/f6272ce5-ab4b-322f-63e4-afd774807531.png)

「作成」をクリックし、「新規クラウド・ストアの場所」を選択します。
![スクリーンショット 2024-07-24 15.04.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/bff83e7f-7a61-4cd3-972a-7d574cb38c76.png)

ここでは、クラウド・ストアの名前を「S3_empdata」とし、資格証明としてあらかじめ作成したARNベースのクレデンシャル「AWS_S3_CRED」を指定しました。

ARNベースのクレデンシャルの作成については、こちらの記事を参照ください。

https://qiita.com/500InternalServerError/items/bf5917270c1291a3558f

また、バケットURIとして、1.で作成したフォルダのURIを指定しました。
入力が完了したら、「次」をクリックします。
![スクリーンショット 2024-07-24 15.07.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/ecd0a312-aee3-6bbb-87d7-b8a58f4541c1.png)

使用可能なオブジェクトとして、先ほどアップロードしたempdata1.txtが確認できたら、「作成」をクリックします。
![スクリーンショット 2024-07-24 15.08.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/e1619bb6-808c-99c4-1422-17592118eb77.png)

クラウド・ストアの場所「S3_empdata」が作成できました。
![スクリーンショット 2024-07-24 15.08.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/0bf9241e-299e-f636-ff44-c55a18fe38ce.png)


# 3. ライブ表フィードの作成
Database Actionsのデータ・ロードからライブ表フィードを作成します。
「データ・ロード」をクリックします。
![スクリーンショット 2024-07-24 15.10.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/045eed81-3543-aaca-eb0e-19003389a7f2.png)

「データのフィード」をクリックします。
![スクリーンショット 2024-07-24 15.11.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/1f1c77eb-27ff-25f0-fdc9-278d424d8fb8.png)

「ライブフィード表の作成」をクリックします。
![スクリーンショット 2024-07-24 15.12.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/3bbd2354-f236-6e44-59fb-c4282a5b0362.png)

クラウド・ストアの場所として、2.で作成した「S3_empdata」を選択し、「次」をクリックします。
![スクリーンショット 2024-07-24 15.13.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/018d9010-c29a-fefb-fc9c-6d16b5f3d2d6.png)

表の設定画面が表示されます。
![スクリーンショット 2024-07-24 15.14.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/a6adc08f-691f-47d7-a26b-f6da616243c1.png)

今回はターゲット表名を「EMPDATA」に変更し、empdata1.txtのデータに合わせて、プロパティ・セクションの「列ヘッダー行」のチェックをオフにしました。
![スクリーンショット 2024-07-24 15.17.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/b8ca3886-ff9c-1c1a-dbf5-3cf058679629.png)

 マッピング・セクションでは、ターゲット列名をそれぞれempno、empnameに変更しました。
変更が完了したら、「次」をクリックします。
![スクリーンショット 2024-07-24 15.17.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/8a9e12db-afc2-a354-41a9-c076300ee861.png)

プレビューが表示されるので、内容に問題がなければ「次」をクリックします。
![スクリーンショット 2024-07-24 15.18.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/12b95838-2420-cdcc-c741-f0144d2f55b8.png)

ライブ・フィードの設定画面が表示されます。
![スクリーンショット 2024-07-24 15.21.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/f26dd2ff-649d-291c-a634-c1716bfe5793.png)

「通知に対して有効」のチェックをオンにし、「スケジュール済」のチェックをオフにします。
![スクリーンショット 2024-07-24 15.22.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/94cf8112-bc52-12e0-22cf-da315d7bc813.png)

データをロードする際に使用するコンシューマ・グループを指定し、「作成」をクリックします。
![スクリーンショット 2024-07-24 15.22.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/f1d6c65c-2e27-86de-b016-a1617decf8a6.png)

「今すぐライブ表フィードを実行」というダイアログが表示されるので、「はい」をクリックします。
![スクリーンショット 2024-07-24 15.23.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/861d7494-77cd-eaec-1b87-49e3780b2d1f.png)

少し待つと、S3_EMPDATA_FEEDにデータがロードされた旨が表示されます。
この時点で、S3バケット内にあるempdata1.txtがロードされます。
![スクリーンショット 2024-07-24 15.23.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/ecabb977-031d-ace6-4616-c07cadfda12a.png)

S3_EMPDATA_FEEDの右上にある3つの点の部分をクリックし、「通知URLの表示」をクリックします。
![スクリーンショット 2024-07-24 15.26.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/0d73bc5c-824c-05b7-0882-0906c0c5c5bf.png)

S3_EMPDATA_FEEDの通知URLが表示されるので、この後の手順のために通知URLをコピーしてメモしておきます。
![スクリーンショット 2024-07-24 15.26.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/5a4c7255-3900-060c-1551-99bb59c9d1ee.png)


# 4. Amazon SNSのトピックの作成
AWSコンソールからAmazon SNS（Simple Notification Service）にアクセスし、「トピックの作成」をクリックします。
![スクリーンショット 2024-07-24 15.57.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/9a85d602-556a-cb9f-a608-26efcde0aec1.png)
タイプは「スタンダード」を選択し、任意の名前を指定します。
今回は「s3_empdata_feed」としました。
![スクリーンショット 2024-07-24 16.01.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/7ba5bc82-ad86-4c9c-3cdc-45ca52aab0a0.png)

暗号化オプションが「オフ」になっていることを確認します。
![スクリーンショット 2024-07-24 16.01.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/2d947cb9-4556-34b0-0899-f7207fa9b063.png)

必要に応じてアクセスポリシーを指定します。
![スクリーンショット 2024-07-24 16.04.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/215912f0-013e-f430-d8a2-7ded2772c9e1.png)

今回はこちらのようなポリシーを設定しました。
```
{
  "Version": "2008-10-17",
  "Id": "__default_policy_ID",
  "Statement": [
    {
      "Sid": "__default_statement_ID",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": [
        "SNS:Publish",
        "SNS:RemovePermission",
        "SNS:SetTopicAttributes",
        "SNS:DeleteTopic",
        "SNS:ListSubscriptionsByTopic",
        "SNS:GetTopicAttributes",
        "SNS:AddPermission",
        "SNS:Subscribe"
      ],
      "Resource": "arn:aws:sns:ap-northeast-1:<アカウントID>:s3_empdata_feed",
      "Condition": {
        "StringEquals": {
          "AWS:SourceOwner": "<アカウントID>"
        }
      }
    },
    {
      "Sid": "s3_policy",
      "Effect": "Allow",
      "Principal": {
        "Service": "s3.amazonaws.com"
      },
      "Action": "SNS:Publish",
      "Resource": "arn:aws:sns:ap-northeast-1:<アカウントID>:s3_empdata_feed",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "<アカウントID>"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:s3:::my-bucket-for-livefeed"
        }
      }
    }
  ]
}
```
「トピックの作成」をクリックして、トピックを作成します。
![スクリーンショット 2024-07-24 18.28.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/eddd8603-50ca-99f3-af2c-05a8feafa588.png)

トピック「s3_empdata_feed」が作成できました。
![スクリーンショット 2024-07-24 17.09.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/6c36aa76-07b6-335b-3de2-f02dbbbcf8d4.png)

# 5. S3バケットのイベント通知の有効化

S3バケットのフォルダに新しいファイルがアップロードされた時に通知を行うように、イベント通知を有効化します。

バケットの「プロパティ」タブに移動します。
![スクリーンショット 2024-07-24 17.11.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/9d041ad5-d501-8600-4d67-cef5625bbab5.png)

「イベント通知を作成」をクリックします。
![スクリーンショット 2024-07-24 17.11.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/9b5860d3-633a-2b49-e320-5bc99203622f.png)

任意のイベント名を入力します。ここでは「NewObjectCreated」としました。
プレフィックスとして、フォルダ名を入力します。
![スクリーンショット 2024-07-24 17.13.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/bf370151-05e5-8909-26f3-dcfeea26e179.png)

イベントタイプのセクションでは「全てのオブジェクト作成イベント」のチェックをオンにします。
![スクリーンショット 2024-07-24 17.13.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/34bfa651-1b2b-ace9-1c98-0e09b4d25525.png)

送信先のセクションでは、送信先として「SNSトピック」を選択し、送信先トピックとして先ほど作成した「s3_empdata_feed」を選択します。
入力が完了したら、「変更の保存」をクリックします。
![スクリーンショット 2024-07-24 17.13.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/24a61039-ce1b-0661-caa6-a01d0ed4f96f.png)

イベント通知「NewObjectCreated」が作成されました。
![スクリーンショット 2024-07-24 17.20.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/0310538d-907e-f2d0-efd3-fa99bb0ef420.png)


# 6. Amazon SNSのサブスクリプションの作成
先ほど作成したAmazon SNSのトピック「s3_empdata_feed」の詳細画面に移動し、「サブスクリプションの作成」をクリックします。
![スクリーンショット 2024-07-24 17.22.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/6115a9d1-ac74-64b3-18d6-5eaa88644e31.png)

トピックARNはデフォルトのままにし、プロトコルに「HTTPS」を選択します。
エンドポイントには、3.で確認したライブ表フィードS3_EMPDATA_FEEDの通知URLを入力します。
![スクリーンショット 2024-07-24 17.24.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/5d8f5666-57fe-6a54-012d-836ed918881a.png)

他の項目はそのままでOKですが必要に応じて変更してください。
入力が完了したら、「サブスクリプションの作成」をクリックします。
![スクリーンショット 2024-07-24 17.25.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/9b0bd887-c4cf-e0da-060e-fe399b761d65.png)

トピックs3_empdata_feedのサブスクリプションが作成できました。
![スクリーンショット 2024-07-24 17.25.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/5531898d-0aaf-f357-c1e2-5a9a4c90a5ed.png)

# 7. 通知が受信できるかの確認
ライブ表フィードS3_EMPDATA_FEEDの右上にある3つの点の部分をクリックし、「確認URLを表示」をクリックします。
![スクリーンショット 2024-07-24 17.25.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/e7219b9d-4d2b-e232-26f6-9b73d0aa50e2.png)

「S3_EMPDATA_FEEDの確認URL」のダイアログが表示されるので、表示されたリンクをクリックします。
![スクリーンショット 2024-07-24 17.26.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/3ea1d089-f70b-c2a4-09dc-2094d69bb1d7.png)

ブラウザで確認URLがオープンされ、以下のような内容が表示されます
![スクリーンショット 2024-07-24 17.27.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/00198fb9-bf8a-3929-7ce5-08b97b2d1e78.png)

サブスクリプションのステータスを確認すると、「確認済み」になりました。
![スクリーンショット 2024-07-24 17.27.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/34552ed2-533c-5790-2a2c-ad63e418455c.png)

確認URLのダイアログの「クラウド・ストア確認プロセスが完了している場合のみチェックします。」のチェックボックスをオンにして、「OK」をクリックします。
![スクリーンショット 2024-07-24 17.28.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/8f55ca6a-c782-1c5a-0296-a9680370bdac.png)

以上で、ライブ表フィードの設定が完了しました。
![スクリーンショット 2024-07-24 17.28.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/a3a0a946-2919-edad-9702-757a0bb1abc9.png)

ここまでの設定をすることで、S3バケットmy-bucket-forlivefeed内のempdataというフォルダに新規にファイルがアップロードされるたびに、アップロードされたファイルの内容が表empdataに自動的にロードされるようになりました。

# 8. 動作確認

設定が完了したので、S3バケットmy-bucket-forlivefeed内のempdataというフォルダにファイルをアップロードして、自動的にデータがロードされるかを確認してみます。

S3バケットmy-bucket-forlivefeed内のempdataフォルダには、先ほど使用したempdata1.txtのみが格納されています。
![スクリーンショット 2024-07-24 17.29.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/995444f9-2756-5c16-5636-8a7d605e650e.png)

S3バケットmy-bucket-forlivefeed内のempdataフォルダに以下の内容のempdata2.txtをアップロードします。
```text:empdata2.txt
4,JACKSON
5,BROWN
6,TURNER
```

![スクリーンショット 2024-07-24 17.29.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/7b915d21-50c6-bb89-5fa3-466dbdf92c21.png)

S3バケットmy-bucket-forlivefeed内のempdataフォルダにempdata2.txtがアップロードできました。
タイムスタンプは2024/7/24 05:30:03PM JST（2024/7/24 08:30.14 UTC）となっています。
![スクリーンショット 2024-07-24 17.30.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/c92acfbc-99c7-5cc9-fff4-5c3d009e3b25.png)

ライブ表フィードの実行の詳細を確認してみます。
![スクリーンショット 2024-07-24 17.30.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/a9ccb5c7-b52e-0ba9-7643-c69594331077.png)

empdata2.txtの内容が表empdataにロードされていることがわかります。
![スクリーンショット 2024-07-24 17.31.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/a1ef39af-84e8-8f7c-0de7-b1caa1d41ff7.png)

S3バケットmy-bucket-forlivefeed内のempdataフォルダにempdata2.txtをアップロードした時間と表empdataにデータがロードされた時間を比較してみます。

S3にファイルをアップロードしたタイムスタンプは2024/7/24 05:30:03PM JST（2024/7/24 08:30.04 UTC）となっています。
![スクリーンショット 2024-07-24 17.32.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/b3c40365-0963-582b-db0f-ba216287d2cc.png)

表にempdata2.txtのデータがロードされたタイムスタンプは2024-08-24T08:30.09.250971Z（2024/7/24 08:30.09 UTC）となっていますので、S3バケットにファイルをロードした5秒後にはロードが完了していたことになります。
![スクリーンショット 2024-07-24 17.33.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/dacef957-4feb-eaf9-8953-733685539d04.png)

以上で、ライブ表フィードを使用してAmazon S3にファイルがアップロードされたら自動的に表にデータをロードできることが確認できました。

# 参考情報
・[Creating a Notification-Based Live Table Feed using Amazon Simple Storage Service (S3)](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/feed.html#GUID-6EA3DA52-C8E0-4986-A587-9D8EF15BD039)