はじめに
特定のS3バケットに新規にファイルがアップロードされたら、自動的にAutonomous Database内の表にデータをロードする方法がマニュアルに記載されたので、検証してみました。
仕組みとしては、S3バケットのイベント通知をAmazon SNS経由でAutonomos Databaseが受信し、データのロード(ライブ表フィード)を行うというものです。
1. S3バケットの作成とファイルのアップロード
今回は、my-bucket-forlivefeedというS3バケットを作成し、その中にempdataというフォルダを用意しました。

初期データとして、empdataフォルダにこちらのempdata1.txtをアプロードします。
1,SMITH
2,ALLEN
3,WARD
2. Amazon S3に対するクラウド・ストレージ・リンク(クラウドストアの場所)の作成
Amazon S3に対するクラウド・ストレージ・リンク(クラウドストアの場所)作成を作成します。
Autonomous DatatabaseのDatabase Actionのデータ・ロードにアクセスします。
「作成」をクリックし、「新規クラウド・ストアの場所」を選択します。

ここでは、クラウド・ストアの名前を「S3_empdata」とし、資格証明としてあらかじめ作成したARNベースのクレデンシャル「AWS_S3_CRED」を指定しました。
ARNベースのクレデンシャルの作成については、こちらの記事を参照ください。
また、バケットURIとして、1.で作成したフォルダのURIを指定しました。
入力が完了したら、「次」をクリックします。

使用可能なオブジェクトとして、先ほどアップロードしたempdata1.txtが確認できたら、「作成」をクリックします。

クラウド・ストアの場所「S3_empdata」が作成できました。

3. ライブ表フィードの作成
Database Actionsのデータ・ロードからライブ表フィードを作成します。
「データ・ロード」をクリックします。

クラウド・ストアの場所として、2.で作成した「S3_empdata」を選択し、「次」をクリックします。

今回はターゲット表名を「EMPDATA」に変更し、empdata1.txtのデータに合わせて、プロパティ・セクションの「列ヘッダー行」のチェックをオフにしました。

マッピング・セクションでは、ターゲット列名をそれぞれempno、empnameに変更しました。
変更が完了したら、「次」をクリックします。

プレビューが表示されるので、内容に問題がなければ「次」をクリックします。

「通知に対して有効」のチェックをオンにし、「スケジュール済」のチェックをオフにします。

データをロードする際に使用するコンシューマ・グループを指定し、「作成」をクリックします。

「今すぐライブ表フィードを実行」というダイアログが表示されるので、「はい」をクリックします。

少し待つと、S3_EMPDATA_FEEDにデータがロードされた旨が表示されます。
この時点で、S3バケット内にあるempdata1.txtがロードされます。

S3_EMPDATA_FEEDの右上にある3つの点の部分をクリックし、「通知URLの表示」をクリックします。

S3_EMPDATA_FEEDの通知URLが表示されるので、この後の手順のために通知URLをコピーしてメモしておきます。

4. Amazon SNSのトピックの作成
AWSコンソールからAmazon SNS(Simple Notification Service)にアクセスし、「トピックの作成」をクリックします。

タイプは「スタンダード」を選択し、任意の名前を指定します。
今回は「s3_empdata_feed」としました。

今回はこちらのようなポリシーを設定しました。
{
"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"
}
}
}
]
}
トピック「s3_empdata_feed」が作成できました。

5. S3バケットのイベント通知の有効化
S3バケットのフォルダに新しいファイルがアップロードされた時に通知を行うように、イベント通知を有効化します。
任意のイベント名を入力します。ここでは「NewObjectCreated」としました。
プレフィックスとして、フォルダ名を入力します。

イベントタイプのセクションでは「全てのオブジェクト作成イベント」のチェックをオンにします。

送信先のセクションでは、送信先として「SNSトピック」を選択し、送信先トピックとして先ほど作成した「s3_empdata_feed」を選択します。
入力が完了したら、「変更の保存」をクリックします。

イベント通知「NewObjectCreated」が作成されました。

6. Amazon SNSのサブスクリプションの作成
先ほど作成したAmazon SNSのトピック「s3_empdata_feed」の詳細画面に移動し、「サブスクリプションの作成」をクリックします。

トピックARNはデフォルトのままにし、プロトコルに「HTTPS」を選択します。
エンドポイントには、3.で確認したライブ表フィードS3_EMPDATA_FEEDの通知URLを入力します。

他の項目はそのままでOKですが必要に応じて変更してください。
入力が完了したら、「サブスクリプションの作成」をクリックします。

トピックs3_empdata_feedのサブスクリプションが作成できました。

7. 通知が受信できるかの確認
ライブ表フィードS3_EMPDATA_FEEDの右上にある3つの点の部分をクリックし、「確認URLを表示」をクリックします。

「S3_EMPDATA_FEEDの確認URL」のダイアログが表示されるので、表示されたリンクをクリックします。

ブラウザで確認URLがオープンされ、以下のような内容が表示されます

サブスクリプションのステータスを確認すると、「確認済み」になりました。

確認URLのダイアログの「クラウド・ストア確認プロセスが完了している場合のみチェックします。」のチェックボックスをオンにして、「OK」をクリックします。

ここまでの設定をすることで、S3バケットmy-bucket-forlivefeed内のempdataというフォルダに新規にファイルがアップロードされるたびに、アップロードされたファイルの内容が表empdataに自動的にロードされるようになりました。
8. 動作確認
設定が完了したので、S3バケットmy-bucket-forlivefeed内のempdataというフォルダにファイルをアップロードして、自動的にデータがロードされるかを確認してみます。
S3バケットmy-bucket-forlivefeed内のempdataフォルダには、先ほど使用したempdata1.txtのみが格納されています。

S3バケットmy-bucket-forlivefeed内のempdataフォルダに以下の内容のempdata2.txtをアップロードします。
4,JACKSON
5,BROWN
6,TURNER
S3バケットmy-bucket-forlivefeed内のempdataフォルダにempdata2.txtがアップロードできました。
タイムスタンプは2024/7/24 05:30:03PM JST(2024/7/24 08:30.14 UTC)となっています。

empdata2.txtの内容が表empdataにロードされていることがわかります。

S3バケットmy-bucket-forlivefeed内のempdataフォルダにempdata2.txtをアップロードした時間と表empdataにデータがロードされた時間を比較してみます。
S3にファイルをアップロードしたタイムスタンプは2024/7/24 05:30:03PM JST(2024/7/24 08:30.04 UTC)となっています。

表にempdata2.txtのデータがロードされたタイムスタンプは2024-08-24T08:30.09.250971Z(2024/7/24 08:30.09 UTC)となっていますので、S3バケットにファイルをロードした5秒後にはロードが完了していたことになります。

以上で、ライブ表フィードを使用してAmazon S3にファイルがアップロードされたら自動的に表にデータをロードできることが確認できました。
参考情報
・Creating a Notification-Based Live Table Feed using Amazon Simple Storage Service (S3)














