

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

# 使用基礎設施做為程式碼，在 AWS 雲端上部署和管理無伺服器資料湖
<a name="deploy-and-manage-a-serverless-data-lake-on-the-aws-cloud-by-using-infrastructure-as-code"></a>

*Kirankumar Chandrashekar 和 Abdel Jaidi，Amazon Web Services*

## 總結
<a name="deploy-and-manage-a-serverless-data-lake-on-the-aws-cloud-by-using-infrastructure-as-code-summary"></a>

此模式說明如何使用[無伺服器運算](https://aws.amazon.com/serverless/)和[基礎設施做為程式碼](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/infrastructure-as-code.html) (IaC)，在 Amazon Web Services (AWS) 雲端上實作和管理資料湖。此模式是以 AWS 開發的[無伺服器資料湖架構 (SDLF)](https://sdlf.workshop.aws/) 研討會為基礎。

SDLF 是可重複使用的資源集合，可加速在 AWS 雲端上交付企業資料湖，並有助於更快速地部署至生產環境。它用於遵循最佳實務來實作資料湖的基礎結構。

SDLF 使用 AWS CodePipeline、AWS CodeBuild 和 AWS CodeCommit 等 AWS 服務，在整個程式碼和基礎設施部署中實作持續整合/持續部署 (CI/CD) 程序。

此模式使用多個 AWS 無伺服器服務來簡化資料湖管理。其中包括用於儲存的 Amazon Simple Storage Service (Amazon S3) 和 Amazon DynamoDB、用於運算的 AWS Lambda 和 AWS Glue，以及用於協同運作的 Amazon CloudWatch Events、Amazon Simple Queue Service (Amazon SQS) 和 AWS Step Functions。

AWS CloudFormation 和 AWS 程式碼服務可充當 IaC 層，以輕鬆操作和管理的方式提供可重複且快速的部署。

## 先決條件和限制
<a name="deploy-and-manage-a-serverless-data-lake-on-the-aws-cloud-by-using-infrastructure-as-code-prereqs"></a>

**先決條件**
+ 作用中的 AWS 帳戶
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)，已安裝並設定。 
+ 安裝和設定的 Git 用戶端。
+ [SDLF 研討會](https://sdlf.workshop.aws/)，在 Web 瀏覽器視窗中開啟並準備使用。 

## Architecture
<a name="deploy-and-manage-a-serverless-data-lake-on-the-aws-cloud-by-using-infrastructure-as-code-architecture"></a>

![\[在 AWS 雲端上實作和管理資料湖。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/f4fc3ad2-1c4f-45ea-bc86-2db13105a173/images/e0cfff30-f0f8-4fc1-8e84-a152ef615c58.png)


 架構圖說明事件驅動的程序，步驟如下。 

1. 將檔案新增至原始資料 S3 儲存貯體後，Amazon S3 事件通知會放置在 SQS 佇列中。每個通知會以 JSON 檔案形式傳送，其中包含中繼資料，例如 S3 儲存貯體名稱、物件金鑰或時間戳記。

1. Lambda 函數會使用此通知，此函數會根據中繼資料將事件路由至正確的擷取、轉換和載入 (ETL) 程序。Lambda 函數也可以使用存放在 Amazon DynamoDB 資料表中的內容式組態。此步驟可對資料湖中的多個應用程式進行解耦和擴展。

1. 事件會路由至 ETL 程序中的第一個 Lambda 函數，該函數會將資料從原始資料區域轉換和移動到資料湖的暫存區域。第一步是更新全面型錄。這是包含資料湖所有檔案中繼資料的 DynamoDB 資料表。此資料表中的每一列都會保留儲存在 Amazon S3 中單一物件的操作中繼資料。在 S3 物件上，同步呼叫執行輕度轉換的 Lambda 函數，這是運算上便宜的操作 （例如將檔案從一種格式轉換為另一種格式）。由於已將新物件新增至預備 S3 儲存貯體，因此會更新完整目錄，並傳送訊息至等待 ETL 中下一個階段的 SQS 佇列。

1. CloudWatch Events 規則每 5 分鐘觸發一次 Lambda 函數。此函數會檢查訊息是否已從上一個 ETL 階段傳遞至 SQS 佇列。如果訊息已傳遞，Lambda 函數會從 ETL 程序的 [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/sample-start-workflow.html) 開始第二個函數。

1. 然後，大量轉換會套用至一批檔案。這種繁重的轉換是一種運算昂貴的操作，例如同步呼叫 AWS Glue 任務、AWS Fargate 任務、Amazon EMR 步驟或 Amazon SageMaker 筆記本。資料表中繼資料會使用更新 AWS Glue 目錄的 AWS Glue 爬蟲程式，從輸出檔案擷取。檔案中繼資料也會新增至 DynamoDB 中完整的目錄資料表。最後，也會執行利用 [Deequ](https://github.com/awslabs/deequ) 的資料品質步驟。

**技術堆疊**
+ Amazon CloudWatch Events
+ AWS CloudFormation
+ AWS CodePipeline
+ AWS CodeBuild
+ AWS CodeCommit
+ Amazon DynamoDB
+ AWS Glue
+ AWS Lambda
+ Amazon S3
+ Amazon SQS
+ AWS Step Functions

## 工具
<a name="deploy-and-manage-a-serverless-data-lake-on-the-aws-cloud-by-using-infrastructure-as-code-tools"></a>
+ [Amazon CloudWatch Events](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html) – CloudWatch Events 提供近乎即時的系統事件串流，說明 AWS 資源的變更。
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) – CloudFormation 有助於以可預測且重複的方式建立和佈建 AWS 基礎設施部署。
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) – CodeBuild 是一種全受管的建置服務，可編譯您的原始程式碼、執行單元測試，並產生準備好部署的成品。
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) – CodeCommit 是由 AWS 託管的版本控制服務，可用來私下存放和管理資產 （例如原始碼和二進位檔案）。
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) – CodePipeline 是一種持續交付服務，可用來建立模型、視覺化和自動化持續發佈軟體變更所需的步驟。
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) – DynamoDB 是全受管的 NoSQL 資料庫服務，可提供快速且可預測的效能與可擴展性。 
+ [AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/what-is-glue.html) – AWS Glue 是一種全受管 ETL 服務，可讓您更輕鬆地準備和載入資料以供分析。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) – Lambda 支援執行程式碼，無需佈建或管理伺服器。Lambda 只有在需要時才會執行程式碼，可自動從每天數項請求擴展成每秒數千項請求。 
+ [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/gsg/GetStartedWithS3.html) – Amazon Simple Storage Service (Amazon S3) 是一種高度可擴展的物件儲存服務。Amazon S3 可用於各種儲存解決方案，包括網站、行動應用程式、備份和資料湖。
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html) - AWS Step Functions 是一種無伺服器函數協調器，可讓您輕鬆地將 AWS Lambda 函數和多個 AWS 服務排序為業務關鍵應用程式。
+ [Amazon SQS](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html) – Amazon Simple Queue Service (Amazon SQS) 是一種全受管訊息佇列服務，可協助您解耦和擴展微服務、分散式系統和無伺服器應用程式。
+ [Deequ](https://github.com/awslabs/deequ) – Deequ 是一種工具，可協助您運算大型資料集的資料品質指標、定義和驗證資料品質限制，並隨時掌握資料分佈的變更。

**程式碼儲存庫**

SDLF 的原始碼和資源可在 [AWS Labs GitHub 儲存庫](https://github.com/awslabs/aws-serverless-data-lake-framework/)中使用。

## 史詩
<a name="deploy-and-manage-a-serverless-data-lake-on-the-aws-cloud-by-using-infrastructure-as-code-epics"></a>

### 設定 CI/CD 管道來佈建 IaC
<a name="set-up-the-ci-cd-pipeline-to-provision-iac"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定 CI/CD 管道來管理資料湖的 IaC。 | 登入 AWS 管理主控台，並遵循 SDLF 研討會[初始設定](https://sdlf.workshop.aws/en/10-deployment/100-setup.html)一節中的步驟。這會建立初始 CI/CD 資源，例如 CodeCommit 儲存庫、CodeBuild 環境，以及為資料湖佈建和管理 IaC 的 CodePipeline 管道。 | DevOps 工程師 | 

### 版本控制 IaC
<a name="version-control-the-iac"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 在本機電腦上複製 CodeCommit 儲存庫。 | 請遵循 SDLF [研討會部署基礎](https://sdlf.workshop.aws/en/10-deployment/200-foundations.html)一節中的步驟。這可協助您將託管 IaC 的 Git 儲存庫複製到本機環境。 如需詳細資訊，請參閱從 [ CodeCommit 文件連線至 CodeCommit 儲存庫](https://docs.aws.amazon.com/codecommit/latest/userguide/how-to-connect.html)。 CodeCommit  | DevOps 工程師 | 
| 修改 CloudFormation 範本。 | 使用您的本機工作站和程式碼編輯器，根據您的使用案例或需求修改 CloudFormation 範本。將它們遞交至本機複製的 Git 儲存庫。 如需詳細資訊，請參閱 [ AWS CloudFormation 文件中的使用](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-guide.html) AWS CloudFormation 範本。 | DevOps 工程師 | 
| 將變更推送至 CodeCommit 儲存庫。 | 您的基礎設施程式碼現在受到版本控制，並且會追蹤對程式碼基礎的修改。當您將變更推送至 CodeCommit 儲存庫時，CodePipeline 會自動將其套用至您的基礎設施，並將其交付至 CodeBuild。 如果您在 CodeBuild 中使用 AWS SAM CLI，請執行 `sam package`和 `sam deploy`命令。如果您使用 AWS CLI，請執行 `aws cloudformation package`和 `aws cloudformation deploy`命令。 | DevOps 工程師 | 

## 相關資源
<a name="deploy-and-manage-a-serverless-data-lake-on-the-aws-cloud-by-using-infrastructure-as-code-resources"></a>

**設定 CI/CD 管道以佈建 IaC**
+ [SDLF 研討會 – 初始設定](https://sdlf.workshop.aws/en/10-deployment/100-setup.html)

**版本控制 IaC**
+ [SDLF 研討會 – 部署基礎](https://sdlf.workshop.aws/en/10-deployment/200-foundations.html)
+ [連線至 CodeCommit 儲存庫](https://docs.aws.amazon.com/codecommit/latest/userguide/how-to-connect.html)
+ [使用 AWS CloudFormation 範本](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-guide.html)

**其他資源**
+ [AWS 無伺服器資料分析管道參考架構](https://aws.amazon.com/blogs/big-data/aws-serverless-data-analytics-pipeline-reference-architecture/)
+ [SDLF 文件](https://sdlf.readthedocs.io/en/latest/)