建立 S3 事件整合,以自動從 Amazon S3 儲存貯體複製檔案 - Amazon Redshift

Amazon Redshift 自 2025 年 11 月 1 日起不再支援建立新的 Python UDF。如果您想要使用 Python UDF,請在該日期之前建立 UDF。現有 Python UDF 將繼續正常運作。如需詳細資訊,請參閱部落格文章

建立 S3 事件整合,以自動從 Amazon S3 儲存貯體複製檔案

注意

自動複製的預覽版已結束。因此,預覽叢集將在預覽版結束後的 30 天自動移除。如果您打算繼續使用自動複製,建議您在另一個 Amazon Redshift 叢集上重新建立現有的自動複製任務。不支援將預覽叢集升級至最新的 Amazon Redshift 版本。

您可以使用自動複製將資料從儲存在 Amazon S3 中的檔案載入您的 Amazon Redshift 資料表。Amazon Redshift 會偵測新的 Amazon S3 檔案何時新增至 COPY 命令中指定的路徑。然後,COPY 命令會自動執行,您不必建立外部資料擷取管道。Amazon Redshift 會追蹤哪些檔案已載入完成。Amazon Redshift 會決定每個 COPY 命令批次處理的檔案數量。您可以在系統檢視中看到產生的 COPY 命令。

建立自動 COPY JOB 的第一步,是建立 S3 事件整合。當新檔案出現在 Amazon S3 來源儲存貯體中時,Amazon Redshift 便會管理使用 COPY 命令將檔案載入資料庫。

建立 S3 事件整合的先決條件

若要設定 s3 事件整合,請確認已完成下列先決條件。

  • 您的 Amazon S3 儲存貯體必須具有允許數個 Amazon S3 許可的儲存貯體政策。例如,下列範例政策允許在 us-east-1 中託管的資源儲存貯體 amzn-s3-demo-bucket 的許可。Amazon S3 儲存貯體和整合位於相同 AWS 區域 中。

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Sid": "Auto-Copy-Policy-01", "Effect": "Allow", "Principal": { "Service": "redshift.amazonaws.com" }, "Action": [ "s3:GetBucketNotification", "s3:PutBucketNotification", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::amzn-s3-demo-bucket:*", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:redshift:us-east-1:111122223333:integration:*" }, "StringEquals": { "aws:SourceAccount": "111122223333" } } } ] }
  • 您的目標 Amazon Redshift 佈建叢集或 Redshift Serverless 命名空間必須具有儲存貯體的許可。確認與叢集或無伺服器命名空間相關聯的 IAM 角色具有允許適當許可的 IAM 政策。此政策必須同時允許針對儲存貯體資源的 s3:GetObject (例如 amzn-s3-demo-bucket) 和針對儲存貯體資源及其內容的 s3:ListBucket (例如 amzn-s3-demo-bucket/*)。

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Sid": "AutoCopyReadId", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket", "arn:aws:s3:::amzn-s3-demo-bucket/*" ] } ] }

    將您的政策新增至與角色擁有信任關係的 IAM 角色,如下所示。

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "redshift.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }

    如果您的目標資料倉儲是佈建叢集,您可以使用 Amazon Redshift 主控台,於叢集詳細資訊中的叢集許可索引標籤將 IAM 角色與佈建叢集建立關聯。如需如何將角色與佈建叢集建立關聯的相關資訊,請參閱《Amazon Redshift 管理指南》中的將 IAM 角色與叢集建立關聯

    如果您的目標資料倉儲是 Redshift Serverless,您可以使用 Redshift Serverless 主控台,於命名空間詳細資訊中的安全和加密索引標籤將 IAM 角色與無伺服器命名空間建立關聯。如需如何將角色與無伺服器命名空間建立關聯的相關資訊,請參閱《Amazon Redshift 管理指南》中的授與許可給 Amazon Redshift Serverless

  • 您的 Amazon Redshift 資料倉儲也必須具有允許 Amazon S3 儲存貯體的資源政策。如果您使用 Amazon Redshift 主控台,當您建立 s3 事件整合時,Amazon Redshift 會提供為我修正選項,以便將此政策新增至您的 Amazon Redshift 資料倉儲。若要自行更新資源政策,您可以使用 put-resource-policy AWS CLI 命令。例如,若要將資源政策連接至 Amazon Redshift 佈建叢集,以便與 Amazon S3 儲存貯體進行 S3 事件整合,請執行類似以下的 AWS CLI 命令。下列範例顯示使用者帳戶 123456789012us-east-1 AWS 區域 中的佈建叢集命名空間的政策。儲存貯體名為 amzn-s3-demo-bucket

    aws redshift put-resource-policy \ --policy file://rs-rp.json \ --resource-arn "arn:aws:redshift: us-east-1:123456789012:namespace/cc4ffe56-ad2c-4fd1-a5a2-f29124a56433"

    其中 rs-rp.json 包含:

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "redshift.amazonaws.com" }, "Action": "redshift:AuthorizeInboundIntegration", "Resource": "arn:aws:redshift:us-east-1:123456789012:namespace:cc4ffe56-ad2c-4fd1-a5a2-f29124a56433", "Condition": { "StringEquals": { "aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-bucket", "aws:SourceAccount": 111122223333 } } }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/myRedshiftRole" }, "Action": "redshift:CreateInboundIntegration", "Resource": "arn:aws:redshift:us-east-1:123456789012:namespace:cc4ffe56-ad2c-4fd1-a5a2-f29124a56433", "Condition": { "StringEquals": { "aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-bucket", "aws:SourceAccount": 111122223333 } } } ] }

    若要將資源政策連接至 Redshift Serverless 命名空間,以便與 Amazon S3 儲存貯體進行 S3 事件整合,請執行類似以下的 AWS CLI 命令。下列範例顯示使用者帳戶 123456789012us-east-1 AWS 區域 中的無伺服器命名空間的政策。儲存貯體名為 amzn-s3-demo-bucket

    aws redshift put-resource-policy \ --policy file://rs-rp.json \ --resource-arn "arn:aws:redshift-serverless:us-east-1:123456789012:namespace/namespace-1"

    其中 rs-rp.json 包含:

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "redshift.amazonaws.com" }, "Action": "redshift:AuthorizeInboundIntegration", "Resource": "arn:aws:redshift-serverless:us-east-1:123456789012:namespace/namespace-1", "Condition": { "StringEquals": { "aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-bucket", "aws:SourceAccount": 111122223333 } } }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/myUser" }, "Action": "redshift:CreateInboundIntegration", "Resource": "arn:aws:redshift-serverless:us-east-1:123456789012:namespace/namespace-1", "Condition": { "StringEquals": { "aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-bucket", "aws:SourceAccount": 111122223333 } } } ] }

建立 S3 事件整合

若要設定複製任務,請先定義 S3 事件整合。

Amazon Redshift console
在 Amazon Redshift 主控台上建立 Amazon S3 事件整合
  1. 登入 AWS 管理主控台,開啟位於 https://console.aws.amazon.com/redshiftv2/ 的 Amazon Redshift 主控台。

  2. 在左側導覽窗格中,選擇 S3 事件整合

  3. 選擇建立 Amazon S3 事件整合以開啟精靈來建立 S3 事件整合,以搭配自動複製使用。您的來源 Amazon S3 儲存貯體和目標 Amazon Redshift 資料倉儲必須位於相同的 AWS 區域 中。逐步完成建立整合的步驟時,請指定下列資訊:

    • 整合名稱 - 是您的 AWS 帳戶 在目前 AWS 區域 中擁有的所有整合中的唯一識別碼。

    • 說明 - 描述 Amazon S3 事件整合的文字,以供日後參考。

    • 來源 S3 儲存貯體 - 是目前 AWS 帳戶 和 AWS 區域 中的 Amazon S3 儲存貯體,也是將資料擷取至 Amazon Redshift 的來源。

    • Amazon Redshift 資料倉儲 - 是從整合接收資料的目標 Amazon Redshift 佈建叢集或 Redshift Serverless 工作群組。

      如果您的目標 Amazon Redshift 位於相同的帳戶中,您就可以選取目標。如果目標位於不同的帳戶中,您可以指定 Amazon Redshift 資料倉儲 ARN。目標必須具有包含授權主體和整合來源的資源政策。如果您的目標上沒有正確的資源政策,且您的目標位於相同的帳戶中,您可以選取為我修正選項,以便在建立整合程序期間自動套用資源政策。如果您的目標位於不同的 AWS 帳戶 中,則須在 Amazon Redshift 倉儲上手動套用資源政策。

  4. 最多可輸入 50 個標籤索引鍵和選用的 - 提供有關整合的其他中繼資料。

  5. 此時會出現檢閱頁面,您可以在此選擇建立 S3 事件整合

AWS CLI

若要使用 AWS CLI 建立 Amazon S3 事件整合,請使用 create-integration 命令搭配下列選項:

  • integration-name - 指定整合的名稱。

  • source-arn - 指定 Amazon S3 來源儲存貯體的 ARN。

  • target-arn - 指定 Amazon Redshift 佈建叢集或 Redshift Serverless 工作群組目標的命名空間 ARN。

下列範例藉由提供整合名稱、來源 ARN 和目標 ARN 來建立整合。整合不會經過加密。

aws redshift create-integration \ --integration-name s3-integration \ --source-arn arn:aws:s3:us-east-1::s3-example-bucket \ --target-arn arn:aws:redshift:us-east-1:123456789012:namespace:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222 { "IntegrationArn": "arn:aws:redshift:us-east-1:123456789012:integration:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111", "IntegrationName": "s3-integration", "SourceArn": "arn:aws:s3:::s3-example-bucket", "SourceType": "s3-event-notifications", "TargetArn": "arn:aws:redshift:us-east-1:123456789012:namespace:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222", "Status": "creating", "Errors": [], "CreateTime": "2024-10-09T19:08:52.758000+00:00", "Tags": [] }

您也可以使用下列 AWS CLI 命令來管理您的 S3 事件整合。

  • delete-integration - 指定整合 ARN 以刪除 S3 事件整合。

  • modify-integration - 指定整合 ARN 以變更 S3 事件整合的名稱或說明 (或兩者)。

  • describe-integrations - 指定整合 ARN 以檢視 S3 事件整合的屬性。

如需這些命令的詳細資訊,請參閱《Amazon Redshift CLI 指南》

接著 Amazon Redshift 會建立 S3 事件整合,包含其相關聯的來源和目標、狀態,以及相關聯自動複製任務的狀態相關資訊。您可以在 Amazon Redshift 主控台上檢視 S3 事件整合的相關資訊,方法是選擇 S3 事件整合,然後選擇整合以顯示其詳細資訊。整合會以在我的帳戶中從其他帳戶建立的整合加以區分。在我的帳戶中清單顯示來源和目標位於相同帳戶中的整合。從其他帳戶清單顯示來源為其他帳戶擁有的整合。

如果您刪除 S3 事件整合,對應的 COPY JOB 狀態會從 1 (作用中) 變更為 0 (非作用中/待定)。不過,不會自動捨棄對應的 COPY JOB。如果您之後嘗試建立同名的 COPY JOB,則可能會發生衝突。

建立和監控 COPY JOB

建立整合後,在您所建立整合的 S3 事件整合詳細資訊頁面上,選擇建立自動複製任務以前往 Amazon Redshift 查詢編輯器 v2,您可在此建立整合的自動複製任務。Amazon Redshift 會將 COPY JOB CREATE 陳述式的 FROM 子句中的儲存貯體,與 S3 事件整合中使用的儲存貯體進行比對。如需如何使用 Amazon Redshift 查詢編輯器 v2 相關資訊,請參閱《Amazon Redshift 管理指南》中的使用 Amazon Redshift 查詢編輯器 v2 來查詢資料庫。例如,在查詢編輯器 v2 中執行下列 COPY 命令,以建立將 Amazon S3 儲存貯體 s3://amzn-s3-demo-bucket/staging-folder 與 Amazon S3 事件整合進行比對的自動 COPY JOB。

COPY public.target_table FROM 's3://amzn-s3-demo-bucket/staging-folder' IAM_ROLE 'arn:aws:iam::123456789012:role/MyLoadRoleName' JOB CREATE my_copy_job_name AUTO ON;

您只會定義 COPY JOB 一次。之後的執行會使用相同參數。

若要定義和管理 COPY JOB,您必須具有許可。如需授與和撤銷 COPY JOB 相關許可的詳細資訊,請參閱 GRANTREVOKE。如需授與和撤銷 COPY JOB 限定範圍許可的詳細資訊,請參閱 授予限定範圍權限 撤銷限定範圍權限

您可以使用 CREATE、LIST、SHOW、DROP、ALTER 和 RUN 工作的選項來管理載入操作。如需更多詳細資訊,請參閱 COPY JOB

您可以查詢系統檢視以查看 COPY JOB 狀態和進度。提供的視圖如下:

如需有關 S3 事件整合故障診斷的資訊,請參閱 故障診斷 S3 事件整合和 COPY JOB 錯誤

若要取得由 COPY JOB 載入的檔案清單,請執行下列 SQL,但請先取代 <job_id>

SELECT job_id, job_name, data_source, copy_query, filename, status, curtime FROM sys_copy_job copyjob JOIN stl_load_commits loadcommit ON copyjob.job_id = loadcommit.copy_job_id WHERE job_id = <job_id>;

建立 S3 事件整合以進行自動複製時的考量事項

使用自動複製時,請注意下列事項。

  • 您可以為 AWS 帳戶 中的每個叢集或工作群組建立最多 200 個 COPY JOB。

  • 您可以為每個 Amazon Redshift 目標建立最多 50 個 S3 事件整合。

  • 您無法在來源 Amazon S3 儲存貯體的儲存貯體名稱中包含句號 (.) 時,建立 S3 事件整合。

  • 您只能在相同來源和目標之間建立一個 S3 事件整合。也就是說,Amazon S3 儲存貯體與 Amazon Redshift 資料倉儲之間一次只能有一個 S3 事件整合。

  • 您無法在來源 Amazon S3 儲存貯體上定義事件類型 S3_OBJECT_CREATED 的任何現有事件通知。不過,在 S3 事件整合建立之後,您可以使用範圍較窄的字首/字尾來更新 Amazon S3 儲存貯體事件通知。如此一來,您也可以設定 S3_OBJECT_CREATED 作為其他目標的另一個字首/字尾,並避免與 S3 事件整合發生衝突。如果您遇到自動複製未如預期執行的問題,請在聯絡 AWS 支援 時,備妥發生問題的時間範圍內 S3 儲存貯體上 s3:PutBucketNotificationConfiguration 動作的 AWS CloudTrail 日誌。

支援的地區

以下是自動複製可用的區域。

區域 自動複製
非洲 (開普敦) 可用性
亞太區域 (香港) 可用性
亞太區域 (台北) 可用性
亞太地區 (東京) 可用性
亞太地區 (首爾) 可用性
亞太地區 (大阪) 可用性
亞太區域 (孟買) 可用性
亞太區域 (海德拉巴) 可用性
亞太區域 (新加坡) 可用性
亞太區域 (悉尼) 可用性
亞太區域 (雅加達) 可用性
亞太區域 (墨爾本) 可用性
亞太地區 (馬來西亞) 可用性
亞太區域 (紐西蘭)
亞太區域 (泰國) 可用性
加拿大 (中部) 可用性
加拿大西部 (卡加利) 可用性
中國 (北京) 可用性
中國 (寧夏) 可用性
歐洲 (法蘭克福) 可用性
歐洲 (蘇黎世) 可用性
歐洲 (斯德哥爾摩) 可用性
歐洲 (米蘭) 可用性
歐洲 (西班牙) 可用性
歐洲 (愛爾蘭) 可用性
歐洲 (倫敦) 可用性
歐洲 (巴黎) 可用性
以色列 (特拉維夫) 可用性
中東 (阿拉伯聯合大公國) 可用性
中東 (巴林) 可用性
墨西哥 (中部) 可用性
南美洲 (聖保羅) 可用性
美國東部 (維吉尼亞北部) 可用性
美國東部 (俄亥俄) 可用性
美國西部 (加利佛尼亞北部) 可用性
美國西部 (奧勒岡) 可用性
AWS GovCloud (美國東部) 可用性
AWS GovCloud (美國西部) 可用性