Amazon RDS for Oracle と Amazon S3 を統合する際の問題をトラブルシューティングするにはどうすればよいですか?

最終更新日: 2021 年 10 月 29 日

Amazon Relational Database Service (Amazon RDS) for Oracle と Amazon Simple Storage Service (Amazon S3) を統合する際の問題とエラーをトラブルシューティングしたいと考えています。

簡単な説明

Amazon RDS for Oracle DB インスタンスと Amazon S3 バケット間でファイルを転送する場合は、次の点を確認してください。

  • DB インスタンスと S3 バケットが同じ AWS リージョンにあること。
  • S3 バケットに対する必要なアクセス権が DB インスタンスに付与されていること。
  • DB インスタンスが S3_INTEGRATION オプションを含むオプショングループに関連付けられていること。
  • Oracle ディレクトリオブジェクトからのみファイルをアップロードしていること。このディレクトリは、ユーザーが作成したディレクトリまたは DATA_PUMP_DIR ディレクトリです。
  • ユーザーが作成したディレクトリを使用している場合、アップロードおよびダウンロードを実行するユーザーは、ディレクトリに対する必要な読み取りおよび書き込み権限を有している必要があります。詳細については、ソースデータベースのユーザーに特権を付与するを参照してください。
  • サブディレクトリ内のデータをコピーする場合は、rdsadmin パッケージを使用するときにサブディレクトリの名前を明示的に指定します。S3_INTEGRATION オプションを使用してサブディレクトリをコピーすることはできません。

解決方法

S3 バケットに対する必要なアクセス権が DB インスタンスに確実に付与されているようにする

DB インスタンスに、S3 からアップロードおよびダウンロードするための最小の権限を持つ AWS Identity and Access Management (IAM) ロールがあるかどうかを確認するには、次の手順を実行します。

  1. Amazon RDS コンソールを開きます。
  2. ナビゲーションペインで、[Databases] (データベース) を選択します。
  3. チェックする DB インスタンスを選択します。
  4. [Connectivity & security] (接続とセキュリティ) タブを選択します。
  5. [Manage IAM roles] (IAM ロールの管理) セクションまで下方向にスクロールして、次の権限を持つアクティブな IAM ロールがあるかどうかを確認します。
    S3:ListBucket
    S3:PutObject
    S3:GetObject

また、DB インスタンスに以下の最小権限を持つ IAM ロールがあるかどうかを確認するために、AWS Command Line Interface (AWS CLI) の describe-db-instances コマンドを使用することもできます。

aws rds describe-db-instances \
--db-instance-identifier example-db-instance \
--query 'DBInstances[*].[AssociatedRoles[*]]'
注: AWS CLI コマンドの実行時にエラーが発生した場合は、 AWS CLI の最新バージョンを使用していることを確認してください

IAM ロールが存在するかどうかを確認した後、確認結果に基づいて次のいずれかを実行します。

  • IAM ロールが存在するが、これらの最小権限を持っていない場合は、ロールを変更してこれらの許可を含めます。
  • 必要な許可を持つ IAM ロールがない場合は、S3 バケットから Amazon RDS にファイルを転送するために必要な許可を持つ IAM ポリシーを作成します。詳細については、Amazon RDS for Oracle と Amazon S3 を統合する前提条件を参照してください。IAM ポリシーを作成するときは、必ずバケットレベルの許可をバケットに追加し、オブジェクトレベルの許可をオブジェクトに追加してください。

バケットの許可の問題が引き続き発生する場合は、IAM ロールを変更して S3 バケットにフルアクセスを許可します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::example-bucket/*",
                "arn:aws:s3:::example-bucket"
            ]
        }
    ]
}

重要: IAM ロールは、問題の原因が IAM 権限によるものであるかどうかをテストするためにのみフルアクセスを付与するように変更されます。問題が解決したら、必要に応じてカスタム権限を調整します。

S3 の特定のフォルダにファイルをアップロードするには、rdsadmin.rdsadmin_s3_tasks.upload_to_s3 プロシージャで p_s3_prefix パラメータを使用します。ファイルをアップロードする前に、必要な許可を持っていることを確認してください。

例えば、S3 バケット example-bucketexample-folder フォルダにファイルをアップロードするには、次の IAM ポリシーをアタッチします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::example-bucket/example-folder/*"
            ]
        }
    ]
}

DB インスタンスが S3_INTEGRATION オプションを含むオプショングループに確実に関連付けられているようにする

RDS DB インスタンスにオプショングループがアタッチされているかどうかを確認するには、次の手順を実行します。

  1. Amazon RDS コンソールを開きます。
  2. ナビゲーションペインで、[Databases] (データベース) を選択します。
  3. チェックする DB インスタンスを選択します。
  4. [Configuration] (設定) タブを選択します。
  5. [Option groups] (オプショングループ) パラメータを書き留めます。

このオプショングループの状態が [valid] (有効) ではない場合に、S3_INTEGRATION オプションの追加を試みても、オプションは正常に追加されません。したがって、オプショングループの状態が [valid] (有効) であることを確認してください。

このオプショングループの状態が [valid] (有効) であるかどうかを確認するには、次の AWS CLI コマンドを実行します。

aws rds describe-db-instances \
--db-instance-identifier example-db-instance \
--query 'DBInstances[*].[OptionGroupMemberships[*]]'

オプショングループの状態が [valid] (有効) でない場合は、データベースの [Logs & events] (ログとイベント) タブを選択し、[Recent events] (最近のイベント) セクションまで下方向にスクロールします。オプショングループを無効にするコンポーネントを特定し、このコンポーネントをデータベースから削除します。

オプショングループの状態が [valid] (有効) である場合は、S3_INTEGRATION オプションがオプショングループに含まれているかどうかを確認します。詳細については、オプショングループのオプションとオプション設定をリスト化するを参照してください。S3_INTEGRATION オプションがオプショングループに含まれていない場合は、オプションを追加します。詳細については、Amazon S3 統合オプションの追加を参照してください。

注: S3_INTEGRATION オプションが DB インスタンスに追加されていない場合、ORA-00904: "RDSADMIN"."RDSADMIN_S3_TASKS"."UPLOAD_TO_S3": invalid identifier” というエラーが表示されます。このエラーは、アップロードとダウンロードに必要なプロシージャが DB インスタンスで作成されていないことを示します。

S3_INTEGRATION オプションを Amazon RDS に追加しても、ダウンタイムは発生しません。[Apply Imediately] (直ちに適用) オプションを使用する場合は、保留中のメンテナンスアクションがないことを確認します。保留中のアクションがある場合、それらのアクションは S3 統合とともに適用されます。詳細については、DB インスタンスのメンテナンスを参照してください。

ファイルのアップロード/ダウンロードが、必ずユーザーが作成した Oracle ディレクトリオブジェクトまたは DATA_PUMP_DIR ディレクトリからのみ実行されているようにする

データベースインスタンスで S3 ファイルに直接アクセスすることはできません。これらのファイルにアクセスするには、ファイルを RDS ホスト内のディレクトリにコピーしてアクセスする必要があります。DB インスタンスから S3 バケットにファイルをアップロード/ダウンロードするには、次の手順を実行します。

  1. Amazon RDS のエクスポートファイルを S3 にコピーするには、必ず expdp コマンドを実行するか、DATA_DUMP_DIR またはカスタムディレクトリの dbms_datapump API を使用して、ダンプファイルを作成します。その後、rdsadmin.rdsadmin_s3_tasks.upload_to_s3 プロシージャを使用して、S3 にファイルをアップロードします。このプロシージャのパラメータと、ファイルをアップロードするためのクエリの例については、Oracle DB インスタンスから Amazon S3 バケットにファイルをアップロードするを参照してください。
  2. rdsadmin. rdsadmin_s3_tasks.download_from_s3 プロシージャを使用して、S3 バケットから DATA_PUMP_DIR フォルダまたはユーザーが作成した任意のディレクトリにファイルをダウンロードします。このプロシージャのパラメータと、ファイルをダウンロードするためのクエリの例については、Amazon S3 バケットから Oracle DB インスタンスにファイルをダウンロードするを参照してください。

ファイル転送のステータスをモニタリングするには、rdsadmin パッケージをアップロードまたはダウンロードする手順を実行したときに生成されるログを表示します。これらのログを表示するには、次の操作を実行します。

  1. Amazon RDS コンソールを開きます。
  2. ナビゲーションペインで、[Databases] (データベース) を選択します。
  3. ログを表示する DB インスタンスを選択します。
  4. [Logs & events] (ログとイベント) タブを選択します。
  5. [Logs] (ログ) セクションで、検索フィルターのプロシージャによって返されたタスク ID を入力します。
  6. 返されるファイルを選択します。
  7. [Watch] (見る) を選択してログを表示します。
    - または -
    [Download] (ダウンロード) を選択してログをダウンロードします。

次のコマンドを実行して、アップロード/ダウンロードプロセス中に生成されたログファイルを読み取ることもできます。

SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-task-id.log'));

注: task-id を、プロシージャによって返されるタスク ID に置き換えてください。