將資料從 RDS for PostgreSQL 資料庫執行個體匯出至 Amazon S3 - Amazon Relational Database Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

將資料從 RDS for PostgreSQL 資料庫執行個體匯出至 Amazon S3

您可以從 RDS for PostgreSQL 資料庫執行個體中查詢資料,然後將資料直接匯出至 Amazon S3 儲存貯體中存放的檔案中。若要這麼做,首先要安裝 RDS for PostgreSQL aws_s3 擴充功能。此擴充功能提供函數,可用於匯出資料至 Amazon S3。接著,您可以了解如何安裝擴充功能,以及如何將資料匯出至 Amazon S3。

注意

不支援跨帳戶匯出至 Amazon S3。

所有目前可用的 RDS for PostgreSQL 版本都支援將快照資料匯出至 Amazon 簡單儲存服務。如需詳細版本資訊,請參閱《Amazon RDS for PostgreSQL 版本資訊》中的 Amazon RDS for PostgreSQL 版本更新

如果您沒有為匯出設定儲存貯體,請參閱下列主題 Amazon Storage Service 使用者指南

根據預設,從 RDS 匯出到 Amazon S3 PostgreSQL 料會使用伺服器端加密與. AWS 受管金鑰如果您使用儲存貯體加密,Amazon S3 儲存貯體必須使用 AWS Key Management Service (AWS KMS) 金鑰 (SSE-KMS) 加密。目前不支援使用 Amazon S3 受管金鑰 (SSE-S3) 加密的儲存貯體。

注意

您可以使用 AWS Management Console、 AWS CLI或 Amazon RDS API 將資料庫快照資料儲存到 Amazon S3。如需詳細資訊,請參閱 將資料庫快照資料匯出至 Amazon S3

安裝 aws_s3 擴充功能

在您可以使用 Amazon Simple Storage Service 搭配 RDS for PostgreSQL 資料庫執行個體之前,您需要安裝 aws_s3 擴充功能。此擴充功能提供從 ,RDS for PostgreSQL 資料庫執行個體匯出資料至 Amazon S3 儲存貯體的功能。它還提供可從 Amazon S3 匯入資料的函數。如需詳細資訊,請參閱 將資料從 Amazon S3 匯入 RDS for PostgreSQL 資料庫執行個體aws_s3 擴充功能取決於 aws_commons 擴充功能中的一些輔助函數,需要時會自動安裝。

安裝 aws_s3 擴充功能
  1. 使用 psql (或 pgAdmin) 以具有 rds_superuser 權限的使用者身分連接到 RDS for PostgreSQL 資料庫執行個體。若您在安裝程序期間保留預設名稱,則連接為 postgres

    psql --host=111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password
  2. 若要安裝擴充功能,請執行下列命令。

    postgres=> CREATE EXTENSION aws_s3 CASCADE; NOTICE: installing required extension "aws_commons" CREATE EXTENSION
  3. 若要驗證是否已經安裝擴充功能,可以使用 psql \dx 中繼命令。

    postgres=> \dx List of installed extensions Name | Version | Schema | Description -------------+---------+------------+--------------------------------------------- aws_commons | 1.2 | public | Common data types across AWS services aws_s3 | 1.1 | public | AWS S3 extension for importing data from S3 plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language (3 rows)

現在可以使用從 Amazon S3 匯入和匯出資料的功能。

請確認您的 RDS for PostgreSQL 版本支援匯出至 Amazon S3

您可以使用 describe-db-engine-versions 命令,驗證您的 RDS for PostgreSQL 版本是否支援匯出至 Amazon S3。下列範例會驗證 10.14 版本的支援。

aws rds describe-db-engine-versions --region us-east-1 --engine postgres --engine-version 10.14 | grep s3Export

如果輸出包含字串 "s3Export",則引擎支援 Amazon S3 匯出。否則,引擎不支援它們。

將資料匯出至 Amazon S3 的概觀

如果要將儲存在 RDS for PostgreSQL 資料庫中的資料匯出至 Amazon S3 儲存貯體,請使用以下程序。

RDS for PostgreSQL 資料匯出至 S3
  1. 識別用於匯出資料的 Amazon S3 檔案路徑。如需此程序的詳細資訊,請參閱指定要匯出的 Amazon S3 檔案路徑

  2. 提供許可,以存取 Amazon S3 儲存貯體。

    如果要將資料匯出至 Amazon S3 檔案,請為 RDS for PostgreSQL 資料庫執行個體提供許可,以便存取匯出將用來儲存的 Amazon S3 儲存貯體。這麼做包括以下步驟︰

    1. 建立 IAM 政策來為您要匯出的 Amazon S3 儲存貯體提供存取權。

    2. 建立 IAM 角色。

    3. 請將您建立的政策連接到您建立的角色。

    4. 將此 IAM 角色新增至您的 資料庫叢集

    如需此程序的詳細資訊,請參閱設定對 Amazon S3 儲存貯體的存取權

  3. 識別資料庫查詢以取得資料。呼叫 aws_s3.query_export_to_s3 函數來匯出查詢資料。

    完成上述的準備工作後,請使用 aws_s3.query_export_to_s3 函數將查詢結果匯出至 Amazon S3。如需此程序的詳細資訊,請參閱使用 aws_s3.query_export_to_s3 函數匯出查詢資料

指定要匯出的 Amazon S3 檔案路徑

指定下列資訊來識別 Amazon S3 中您要匯出資料的位置:

  • 儲存貯體名稱 – 儲存貯體是 Amazon S3 物件或檔案的容器。

    如需使用 Amazon S3 儲存資料的詳細資訊,請參閱《Amazon Simple Storage Service 使用者指南》中的建立儲存貯體檢視物件

  • 檔案路徑 – 檔案路徑會識別匯出項目儲存在 Amazon S3 儲存貯體中的位置。檔案路徑由以下項目組成:

    • 識別虛擬資料夾路徑的選擇性路徑字首。

    • 識別一或多個要儲存檔案的檔案字首。較大的匯出項目會儲存在多個檔案中,每個檔案的大小上限約為 6 GB。其他檔案名稱具有相同的檔案字首,但會加上 _partXXXX 代表 2,接著是 3,以此類推

    舉例來說,具有 exports 資料夾和 query-1-export 檔案字首的檔案路徑為 /exports/query-1-export

  • AWS 區域 (選用) — Amazon S3 儲存貯體所在的 AWS 區域。如果您未指定 AWS 區域值,則 Amazon RDS 會將您的檔案儲存到與匯出執行個體位於相同 AWS 區域的 Amazon S3。

    注意

    目前,該 AWS 區域必須與匯出執行個體的區域相同。

    如需「 AWS 區域」名稱與相關值的清單,請參閱區域、可用區域和 Local Zones

如果要保留匯出項目儲存之位置的 Amazon S3 檔案資訊,可以使用 aws_commons.create_s3_uri 函數建立 aws_commons._s3_uri_1 複合結構,如下所示。

psql=> SELECT aws_commons.create_s3_uri( 'DOC-EXAMPLE-BUCKET', 'sample-filepath', 'us-west-2' ) AS s3_uri_1 \gset

您稍後可以在對 s3_uri_1 函數的呼叫中以參數形式提供此 aws_s3.query_export_to_s3 值。如需範例,請參閱「使用 aws_s3.query_export_to_s3 函數匯出查詢資料」。

設定對 Amazon S3 儲存貯體的存取權

如果要將資料匯出至 Amazon S3,請為 PostgreSQL DB 執行個體提供許可,以便存取用來放置檔案的 Amazon S3 儲存貯體。

若要執行此操作,請使用下列程序。

透過 IAM 角色授與 PostgreSQL 資料庫執行個體的 Amazon S3 存取權
  1. 建立 IAM 政策。

    此政策可提供儲存貯體及物件許可,讓 PostgreSQL 資料庫執行個體能夠存取 Amazon S3。

    在建立此原則的過程中,請採取下列步驟:

    1. 在政策中納入下列必要動作,以允許從 PostgreSQL 資料庫叢集執行個體傳輸檔案至 Amazon S3 儲存貯體:

      • s3:PutObject

      • s3:AbortMultipartUpload

    2. 包含用於識別 Amazon S3 儲存貯體和物件的 Amazon Resource Name (ARN)。存取 Amazon S3 的 ARN 格式為︰arn:aws:s3:::DOC-EXAMPLE-BUCKET/*

    如需如何建立 Amazon RDS for PostgreSQL IAM 政策的詳細資訊,請參閱建立並使用 IAM 政策進行 IAM 資料庫存取。另請參閱《IAM 使用者指南》中的教學:建立和連接您的第一個客戶受管原則

    下列 AWS CLI 命令會建立以這些選項命名rds-s3-export-policy的 IAM 政策。它授予一個名為文檔示例桶的訪問權限。

    警告

    建議您在設有可存取特定儲存貯體之端點原則的私有 VPC 中設定資料庫。如需詳細資訊,請參閱《Amazon VPC 使用者指南》中的對 Amazon S3 使用端點政策

    強烈建議您不要建立具有全資源存取權的政策。這個存取權可能會對資料安全構成威脅。如果您建立的原則能為 S3:PutObject 提供使用 "Resource":"*" 存取所有資源的存取權,則具有匯出許可的使用者可將資料匯出至您帳戶中的所有儲存貯體。此外,使用者可以將資料匯出至您 AWS 區域內可公開寫入的所有儲存貯體

    政策建立後,請記下政策的 Amazon Resource Name (ARN)。在後續步驟中將政策附加至 IAM 角色時,您會需要此 ARN。

    aws iam create-policy --policy-name rds-s3-export-policy --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Sid": "s3export", "Action": [ "s3:PutObject*", "s3:ListBucket", "s3:GetObject*", "s3:DeleteObject*", "s3:GetBucketLocation", "s3:AbortMultipartUpload" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ] } ] }'
  2. 建立 IAM 角色。

    您會執行此動作,使得 Amazon RDS 可以代表您擔任此 IAM 角色,以存取您的 Amazon S3 儲存貯體。如需更多詳細資訊,請參閱《IAM 使用者指南》中的建立角色以將許可委派給 IAM 使用者

    建議您在資源型政策中使用 aws:SourceArnaws:SourceAccount 全域條件內容金鑰,將服務的許可限定於特定資源。這是防止混淆代理人問題最有效的方式。

    如果同時使用這兩個全域條件內容索引鍵,且 aws:SourceArn 值包含帳戶 ID,則在相同政策陳述式中使用 aws:SourceAccount 值和 aws:SourceArn 值中的帳戶時,必須使用相同的帳戶 ID。

    • 如果您想要跨服務存取單一資源,請使用 aws:SourceArn

    • 如果您想要允許該帳戶中的任何資源與跨服務使用相關聯,請使用 aws:SourceAccount

    在政策中,請務必搭配資源的完整 ARN 來使用 aws:SourceArn 全域條件內容金鑰。下列範例示範如何使用 AWS CLI 命令來建立名為的角色rds-s3-export-role

    範例

    對於LinuxmacOS、或Unix:

    aws iam create-role \ --role-name rds-s3-export-role \ --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "rds.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:SourceAccount": "111122223333", "aws:SourceArn": "arn:aws:rds:us-east-1:111122223333:db:dbname" } } } ] }'

    在 Windows 中:

    aws iam create-role ^ --role-name rds-s3-export-role ^ --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "rds.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:SourceAccount": "111122223333", "aws:SourceArn": "arn:aws:rds:us-east-1:111122223333:db:dbname" } } } ] }'
  3. 將您建立的 IAM 政策附加至您建立的 IAM 角色。

    下列 AWS CLI 命令會將先前建立的原則附加至您在先前步驟中所記錄的名為「以原則 ARN rds-s3-export-role. 取代your-policy-arn」的角色。

    aws iam attach-role-policy --policy-arn your-policy-arn --role-name rds-s3-export-role
  4. 將 IAM 角色新增至資料庫執行個體。您可以使用 AWS Management Console 或來執行此操作 AWS CLI,如下所述。

使用主控台為 PostgreSQL 資料庫執行個體新增 IAM 角色
  1. 登入 AWS Management Console 並開啟 Amazon RDS 主控台,網址為 https://console.aws.amazon.com/rds/

  2. 選擇 PostgreSQL 資料庫執行個體名稱以顯示其詳細資訊。

  3. Connectivity & security (連線能力與安全性) 標籤上的 Manage IAM roles (管理 IAM 角色) 區段中,選擇要在 Add IAM roles to this instance (新增 IAM 角色到此執行個體) 下新增的角色。

  4. 請在 Feature (功能) 下,選擇 s3Export

  5. 選擇 Add role (新增角色)

使用 CLI 為 PostgreSQL 資料庫執行個體新增 IAM 角色
  • 使用下列命令將角色新增至名為 my-db-instance 的 PostgreSQL 資料庫執行個體。將 your-role-arn 替換為您前個步驟記下的角色 ARN。使用 s3Export 作為 --feature-name 選項的值。

    範例

    對於LinuxmacOS、或Unix:

    aws rds add-role-to-db-instance \ --db-instance-identifier my-db-instance \ --feature-name s3Export \ --role-arn your-role-arn \ --region your-region

    在 Windows 中:

    aws rds add-role-to-db-instance ^ --db-instance-identifier my-db-instance ^ --feature-name s3Export ^ --role-arn your-role-arn ^ --region your-region

使用 aws_s3.query_export_to_s3 函數匯出查詢資料

呼叫 aws_s3.query_export_to_s3 函數來將 PostgreSQL 資料匯出至 Amazon S3。

必要條件

使用 aws_s3.query_export_to_s3 函數前,請先完成下列必要條件:

下列範例會使用稱為 sample_table 的資料庫資料表。這些範例會將資料匯出至名為 DOC/ EXAMPLE 值區的值區。範例資料表和資料會以下列 psql 形式的 SQL 陳述式建立。

psql=> CREATE TABLE sample_table (bid bigint PRIMARY KEY, name varchar(80)); psql=> INSERT INTO sample_table (bid,name) VALUES (1, 'Monday'), (2,'Tuesday'), (3, 'Wednesday');

正在呼叫 aws_s3.query_export_to_s3

以下示範呼叫 aws_s3.query_export_to_s3 函數的基本方式。

這些範例會使用變數 s3_uri_1 來識別包含識別 Amazon S3 檔案資訊的結構。使用 aws_commons.create_s3_uri 函數來建立結構。

psql=> SELECT aws_commons.create_s3_uri( 'DOC-EXAMPLE-BUCKET', 'sample-filepath', 'us-west-2' ) AS s3_uri_1 \gset

雖然下列兩個 aws_s3.query_export_to_s3 函數呼叫的參數有所不同,但這些範例的結果是相同的。sample_table表中的所有行都導出到一個名為 DOC/ EXAMPLEY 桶的存儲桶中。

psql=> SELECT * FROM aws_s3.query_export_to_s3('SELECT * FROM sample_table', :'s3_uri_1'); psql=> SELECT * FROM aws_s3.query_export_to_s3('SELECT * FROM sample_table', :'s3_uri_1', options :='format text');

參數說明如下:

  • 'SELECT * FROM sample_table' – 第一個字串是包含 SQL 查詢的文字字串。PostgreSQL 引擎會執行此查詢。查詢結果會複製到其他參數中識別的 S3 儲存貯體。

  • :'s3_uri_1' – 此參數是識別 Amazon S3 檔案的結構。此範例使用變數來識別先前建立的結構。您可以改為透過在 aws_commons.create_s3_uri 函數呼叫中包含內嵌 aws_s3.query_export_to_s3 函數呼叫來建立結構,如下所示。

    SELECT * from aws_s3.query_export_to_s3('select * from sample_table', aws_commons.create_s3_uri('DOC-EXAMPLE-BUCKET', 'sample-filepath', 'us-west-2') );
  • options :='format text'options 是包含 PostgreSQL COPY 引數的選用文字字串。複製程序使用 PostgreSQL COPY 命令的引數及格式。

如果指定的檔案不存在於 Amazon S3 儲存貯體內,就會建立。如果檔案已存在,即會遭到覆寫。以下是存取 Amazon S3 中已匯出資料的語法。

s3-region://bucket-name[/path-prefix]/file-prefix

較大的匯出項目會儲存在多個檔案中,每個檔案的大小上限約為 6 GB。其他檔案名稱具有相同的檔案字首,但會加上 _partXXXX 代表 2,接著是 3,以此類推 舉例來說,假設您要指定儲存資料檔案的路徑,如下所示。

s3-us-west-2://DOC-EXAMPLE-BUCKET/my-prefix

如果匯出必須建立三個資料檔案,則 Amazon S3 儲存貯體會包含下列資料檔案。

s3-us-west-2://DOC-EXAMPLE-BUCKET/my-prefix s3-us-west-2://DOC-EXAMPLE-BUCKET/my-prefix_part2 s3-us-west-2://DOC-EXAMPLE-BUCKET/my-prefix_part3

如需此函數的完整參考以及其他呼叫方式,請參閱 aws_s3.query_export_to_s3。如需存取 Amazon S3 中檔案的詳細資訊,請參閱《Amazon Simple Storage Service 使用者指南》中的檢視物件

匯出至使用自訂分隔符號的 CSV 檔案

下列範例示範如何呼叫使用自訂分隔符號來將資料匯入檔案的 aws_s3.query_export_to_s3 函數。範例使用了 PostgreSQL COPY 命令的引數,來指定逗號分隔值 (CSV) 格式和冒號 (:) 分隔符號。

SELECT * from aws_s3.query_export_to_s3('select * from basic_test', :'s3_uri_1', options :='format csv, delimiter $$:$$');

利用編碼匯出至二進位檔案

下列範例示範如何呼叫 aws_s3.query_export_to_s3 函數來將資料匯出至使用 Windows-1253 編碼的二進位檔案。

SELECT * from aws_s3.query_export_to_s3('select * from basic_test', :'s3_uri_1', options :='format binary, encoding WIN1253');

對 Amazon S3 的存取進行故障診斷

如果您在嘗試將資料匯出至 Amazon S3 時遇到連線問題,請先確認與資料庫執行個體關聯之 VPC 安全群組的輸出存取規則允許網路連線。明確的說,安全群組必須擁有允許資料庫執行個體傳至連接埠 443 和任何 IPv4 地址 (0.0.0.0/0)。如需詳細資訊,請參閱 建立安全群組以存取在您的 VPC 中您的資料庫執行個體

另請參閱以下內容中的建議:

函數參考

aws_s3.query_export_to_s3

將 PostgreSQL 查詢結果匯出至 Amazon S3 儲存貯體。aws_s3 延伸提供 aws_s3.query_export_to_s3 函數。

兩個必要參數為 querys3_info。這些參數會定義要匯出的查詢,以及要匯出至的 Amazon S3 儲存貯體。名為 options 的選用參數會提供來定義各種匯出參數。如需使用 aws_s3.query_export_to_s3 函數的範例,請參閱 使用 aws_s3.query_export_to_s3 函數匯出查詢資料

語法

aws_s3.query_export_to_s3( query text, s3_info aws_commons._s3_uri_1, options text, kms_key text )
輸入參數
query

包含 PostgreSQL 引擎執行之 SQL 查詢的必要文字字串。此查詢的結果會複製到 s3_info 參數中識別的 S3 儲存貯體。

s3_info

aws_commons._s3_uri_1 複合類型,含有下列 S3 物件相關資訊:

  • bucket – 包含檔案的 Amazon S3 儲存貯體名稱。

  • file_path – Amazon S3 檔案名稱和路徑。

  • region— 值 AWS 區所在的區域。如需「 AWS 區域」名稱與相關值的清單,請參閱區域、可用區域和 Local Zones

    目前,此值必須與匯出執行個體的 AWS 區域相同。預設值為匯出執行個體的 AWS 區域。

如果要建立 aws_commons._s3_uri_1 複合結構,請參閱 aws_commons.create_s3_uri 函數。

options

選用的文字字串,含有 PostgreSQL COPY 命令引數。這些引數指定資料要如何在匯出時複製。詳細資訊請參閱 PostgreSQL COPY 文件

替代輸入參數

為了協助進行測試,您可使用一組更大的參數取代 s3_info 參數。以下是 aws_s3.query_export_to_s3 函數的其他語法變化。

請不要使用 s3_info 參數識別 Amazon S3 檔案,而是使用 bucketfile_pathregion 參數組合進行。

aws_s3.query_export_to_s3( query text, bucket text, file_path text, region text, options text, )
query

包含 PostgreSQL 引擎執行之 SQL 查詢的必要文字字串。此查詢的結果會複製到 s3_info 參數中識別的 S3 儲存貯體。

bucket

必要文字字串,其中含有包含檔案的 Amazon S3 儲存貯體名稱。

file_path

包含 Amazon S3 檔案名稱 (包括檔案路徑) 的必要文字字串。

region

包含值區所在 AWS 區域的選擇性文字字串。如需「 AWS 區域」名稱與相關值的清單,請參閱區域、可用區域和 Local Zones

目前,此值必須與匯出執行個體的 AWS 區域相同。預設值為匯出執行個體的 AWS 區域。

options

選用的文字字串,含有 PostgreSQL COPY 命令引數。這些引數指定資料要如何在匯出時複製。詳細資訊請參閱 PostgreSQL COPY 文件

輸出參數

aws_s3.query_export_to_s3( OUT rows_uploaded bigint, OUT files_uploaded bigint, OUT bytes_uploaded bigint )
rows_uploaded

指定查詢成功上傳至 Amazon S3 的資料表列數。

files_uploaded

上傳至 Amazon S3 的檔案數。建立的檔案大小約為 6 GB。每個額外建立的檔案,名稱都會加上 _partXXXX 代表 2,接著是 3,視需要以此類推。

bytes_uploaded

上傳至 Amazon S3 的總位元組數。

範例

psql=> SELECT * from aws_s3.query_export_to_s3('select * from sample_table', 'DOC-EXAMPLE-BUCKET', 'sample-filepath'); psql=> SELECT * from aws_s3.query_export_to_s3('select * from sample_table', 'DOC-EXAMPLE-BUCKET', 'sample-filepath','us-west-2'); psql=> SELECT * from aws_s3.query_export_to_s3('select * from sample_table', 'DOC-EXAMPLE-BUCKET', 'sample-filepath','us-west-2','format text');

aws_commons.create_s3_uri

建立 aws_commons._s3_uri_1 結構以保留 Amazon S3 檔案資訊。您使用 aws_commons.create_s3_uri 函數 s3_info 參數之中的 aws_s3.query_export_to_s3 函數結果。如需使用 aws_commons.create_s3_uri 函數的範例,請參閱 指定要匯出的 Amazon S3 檔案路徑

語法

aws_commons.create_s3_uri( bucket text, file_path text, region text )
輸入參數
bucket

必要的文字字串,其中含有檔案的 Amazon S3 儲存貯體名稱。

file_path

包含 Amazon S3 檔案名稱 (包括檔案路徑) 的必要文字字串。

region

包含檔案所在 AWS 區域的必要文字字串。如需「 AWS 區域」名稱與相關值的清單,請參閱區域、可用區域和 Local Zones