本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 LocalStack 和 Terraform Tests 來測試 AWS 基礎設施
由 Ivan Girardi (AWS) 和 Ioannis Kalyvas (AWS) 建立
Summary
此模式可協助您在 Terraform AWS 中以程式碼 (IaC) 形式對基礎設施進行本機測試,而無需在您的 AWS 環境中佈建基礎設施。它將 Terraform Tests 架構
此解決方案提供下列優點:
成本最佳化 – 對 執行測試 LocalStack ,不需要使用 AWS 服務。這可避免產生與建立、操作和修改這些 AWS 資源相關的成本。
速度和效率 – 在本機測試通常也比部署 AWS 資源更快。此快速回饋迴圈可加速開發和偵錯。因為 會在本機 LocalStack 執行,所以您可以在沒有網際網路連線的情況下開發和測試 Terraform 組態檔案。您可以在本機偵錯 Terraform 組態檔案,並立即接收意見回饋,以簡化開發程序。
一致性和重現性 – LocalStack 提供一致的測試環境。此一致性有助於確保測試產生相同的結果,無論外部 AWS 變更或網路問題為何。
隔離 – 使用 進行測試 LocalStack 可避免意外影響即時 AWS 資源或生產環境。此隔離可安全地實驗和測試各種組態。
自動化 – 與持續整合和持續交付 (CI/CD) 管道整合,可協助您自動測試 Terraform 組態檔案
。管道會在部署之前徹底測試 IaC。 彈性 – 您可以模擬不同的 AWS 區域 AWS 帳戶和服務組態,以更接近您的生產環境。
先決條件和限制
先決條件
啟用預設 Docker 通訊端的存取
( /var/run/docker.sock
)。如需詳細資訊,請參閱 LocalStack 文件。 安裝
Docker Compose 安裝
Terraform 1.6.0 版或更新版本 安裝
Terraform CLI 設定
Terraform AWS 提供者 (選用) 安裝和設定 AWS Command Line Interface (AWS CLI)。如需如何 AWS CLI 搭配 使用 的範例 LocalStack,請參閱 GitHub 使用 的測試 AWS 基礎設施 LocalStack 和 Terraform Tests
儲存庫。
限制
此模式提供測試 Amazon Simple Storage Service (Amazon S3) AWS Lambda AWS Step Functions和 Amazon DynamoDB 資源的明確範例。不過,您可以擴展此解決方案以包含其他 AWS 資源。
此模式提供在本機執行 Terraform Tests 的指示,但您可以將測試整合到任何 CI/CD 管道。
此模式提供使用 LocalStack 社群映像的指示。如果您使用的是 LocalStack Pro 映像,請參閱 LocalStack Pro 文件
。 LocalStack 為不同的 提供模擬服務 AWS APIs。如需完整清單,請參閱AWS 服務功能涵蓋
範圍。有些進階功能可能需要訂閱 LocalStack Pro。
架構
下圖顯示此解決方案的架構。主要元件是原始程式碼儲存庫、CI/CD 管道和 Docker LocalStack 容器。Docker LocalStack 容器在 AWS 服務 本機託管下列項目:
用於存放檔案的 Amazon S3 儲存貯體
Amazon CloudWatch 用於監控和記錄
執行無伺服器程式碼的 AWS Lambda 函數
用於協調多步驟工作流程 AWS Step Functions 的狀態機器
用於儲存無SQL資料的 Amazon DynamoDB 資料表
該圖顯示以下工作流程:
您可以將 Terraform 組態檔案新增並遞交至原始程式碼儲存庫。
CI/CD 管道會偵測變更,並啟動靜態 Terraform 程式碼分析的建置程序。管道會建置並執行 Docker LocalStack 容器。然後,管道會開始測試程序。
管道會將物件上傳至託管在 Docker 容器中的 Amazon S3 LocalStack 儲存貯體。
上傳物件會叫用 AWS Lambda 函數。
Lambda 函數會將 Amazon S3 事件通知存放在 CloudWatch 日誌中。
Lambda 函數會啟動 AWS Step Functions 狀態機器。
狀態機器會將 Amazon S3 物件的名稱寫入 DynamoDB 資料表。
CI/CD 管道中的測試程序會驗證上傳物件的名稱是否符合 DynamoDB 資料表中的項目。它也會驗證 S3 儲存貯體是否以指定的名稱部署,以及 AWS Lambda 函數是否已成功部署。
工具
AWS 服務
Amazon CloudWatch 可協助您 AWS 即時監控 AWS 資源的指標,以及您在 上執行的應用程式。
Amazon DynamoDB 是全受管無SQL資料庫服務,可提供快速、可預測且可擴展的效能。
AWS Lambda 是一項運算服務,可協助您執行程式碼,無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展,因此您只需支付您使用的運算時間。
Amazon Simple Storage Service (Amazon S3) 是一種雲端型物件儲存服務,可協助您儲存、保護和擷取任何數量的資料。
AWS Step Functions 是一種無伺服器協調服務,可協助您結合 AWS Lambda 函數和其他 AWS 服務 來建置業務關鍵型應用程式。
其他工具
Docker
是一組平台即服務 (PaaS) 產品,在作業系統層級使用虛擬化在容器中交付軟體。 Docker Compose
是一種用於定義和執行多容器應用程式的工具。 LocalStack
是在單一容器中執行的雲端服務模擬器。透過使用 LocalStack,您可以在使用的本機電腦上執行工作負載 AWS 服務,而無需連線到 AWS 雲端。 Terraform
是 的 IaC 工具 HashiCorp ,可協助您建立和管理雲端和內部部署資源。 Terraform Tests
可協助您透過類似整合或單元測試的測試來驗證 Terraform 模組組態更新。
程式碼儲存庫
此模式的程式碼可在 GitHub 使用 LocalStack 和 Terraform Tests 儲存庫的 測試 AWS 基礎設施
最佳實務
此解決方案會測試 Terraform 組態檔案中指定的 AWS 基礎設施,而且不會在 中部署這些資源 AWS 雲端。如果您想要部署資源,請遵循最低權限 (IAM 文件) 原則,並正確設定 Terraform 後端
(Terraform 文件)。 在 CI/CD 管道 LocalStack 中整合時,建議您不要在權限模式下執行 LocalStack Docker 容器。如需詳細資訊,請參閱執行期權限和 Linux 功能
(Docker 文件) 和自我管理執行器的安全性 (GitLab 文件)。
史詩
任務 | 描述 | 所需的技能 |
---|---|---|
複製儲存庫。 | 在 bash shell 中,輸入下列命令。這會使用 LocalStack 和 Terraform Tests 儲存庫從下列位置複製測試 AWS 基礎設施
| DevOps 工程師 |
執行 LocalStack 容器。 |
| DevOps 工程師 |
初始化 Terraform。 | 輸入下列命令以初始化 Terraform:
| DevOps 工程師 |
執行 Terraform 測試。 |
| DevOps 工程師 |
清除資源。 | 輸入下列命令來銷毀 LocalStack 容器:
| DevOps 工程師 |
故障診斷
問題 | 解決方案 |
---|---|
|
|
相關資源
其他資訊
與 GitHub 動作整合
您可以使用 GitHub 動作,在 CI/CD 管道中整合 LocalStack 和 Terraform Tests。如需詳細資訊,請參閱GitHub 動作文件
name: LocalStack Terraform Test on: push: branches: - '**' workflow_dispatch: {} jobs: localstack-terraform-test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Build and Start LocalStack Container run: | docker compose up -d - name: Setup Terraform uses: hashicorp/setup-terraform@v3 with: terraform_version: latest - name: Run Terraform Init and Validation run: | terraform init terraform validate terraform fmt --recursive --check terraform plan terraform show - name: Run Terraform Test run: | terraform test - name: Stop and Delete LocalStack Container if: always() run: docker compose down