最近在寫 AWS CloudFormation Template,這些 Template 是準備給公司其他單位更快速上手專案的範本,所以當這個 Template 要被 release 之前一定要萬無一失,不然就會是災難 … 而其中重要的一環設計就是「測試」。
這段時間找了好幾個 CloudFormation 測試工具,包含 cfn_nag、cfn-lint .. 等工具,最後看到官方推出的 taskcat 還蠻符合 CloudFormation Template 的測試情境
介紹 Taskcat
Taskcat 是 AWS 官方在 2019 年部落格公開的 CloudFormation Testing Tool
TaskCat is an open source tool developed by the AWS Quick Start team to automate the testing of AWS CloudFormation templates. It tests an AWS CloudFormation template by deploying it in multiple AWS Regions simultaneously and generates a report with a pass/fail result for each Region. You can customize the tests through a test config file. TaskCat is implemented in Python and available as a Docker container and pip module.
由 AWS QuickStart team 所開發的 Automation Tool (我最常關注的 Github Repository 之一),而 taskcat 本身涵蓋的測試:
- Lint style Test
- Acceptance Test
- Cross Region deployment AWS Account
- Multiple Test tasks in Docker
為何選 Taskcat?
選用 taskcat 的原因是,一個好的 CloudFormation Template 少不了 Acceptance Test,尤其是像 S3 這種 Bucket 有 Unique-Id 的服務,在設計 Bucket Naming 時就必須注意到 pre-deployment 時不能重複。
可以做到 Acceptance Test 後,就可以開始嘗試情境:
- 情境1. 拿空的環境部署 New version 確認從無到有可以建立,然後 destory。
- 情境2. 拿空的環境部署 Old version,再拿 New version update stack 確認 Patch 不會有問題,然後 destory。
確保這個 CloudFormation 在 create 或是 update 的情況都不會造成問題。
使用 Taskcat
一個 taskcat 專案的目錄結構:
.
|-- .travis.yml
|-- ci
| |-- input.json
| `-- taskcat.yml
`-- templates
`-- main.yaml
Taskcat 必須由一個 taskcat.yml 作為主要設定檔
global:
owner: shazi7804@gmail.com
qsname: cfn-vpc-module
regions:
- ap-northeast-1
- ap-northeast-2
- ap-south-1
- ap-southeast-1
- ap-southeast-2
- ca-central-1
- eu-central-1
- eu-west-1
- eu-west-2
- sa-east-1
- us-east-1
- us-east-2
- us-west-1
- us-west-2
reporting: true
tests:
test-scenario1:
parameter_input: input.json
template_file: main.yaml
regions:
- ap-northeast-1
- global 內比較特殊的參數為 regions,如果 tests 沒有定義 regions,預設就會用 global regions 都跑一次,如果沒那個必要就不要多花錢了 …
- tests 可以定義多組 Test task,每組都可以有不同的 input.json 和 CloudFormation Template yaml,用法很直覺且簡單。
- paramter_input 這裡的 input.json 必須要放在 /ci/ 這裡面,不然讀不到 …
在 Travis CI 跑 Taskcat
提供一個簡單的 .travis.yml 範例
language: python
services:
- docker
install:
- pip install -r taskcat
- curl -s https://raw.githubusercontent.com/aws-quickstart/taskcat/master/installer/docker-installer.sh
script:
- taskcat -c ci/taskcat.yml
由於 taskcat 會真實的佈署 CloudFormation,所以必須在 Travis CI 設定 AWS IAM User Key。
執行過程會歷經幾個階段:
- taskcat 跑 Test task 的 container (所以一定要有 Docker 環境)
- taskcat 執行 lint 測試每個 CloudFormation Template
- 呼叫 CloudFormation API 建立 CloudFormation Stack
- 等待 CloudFormation Stack Event 狀態更新
- 確認 CloudFormation Stack Event 成功或失敗
- Destory CloudFormation Stack
已知問題
- taskcat#339 當 taskcat 建立的 S3 bucket 內還有 Objects 時,跑 destory 後 CloudFormation 無法強制刪除 S3 bucket 造成 CloudFormation Stack 卡在 `DELETE_FAILED` 狀態。
- taskcat#278 taskcat 執行 lint 時無法 ignore rule,必須全數通過。
參考