用 Taskcat 測試 CloudFormation

2019-09-30 AWS

最近在寫 AWS CloudFormation Template,這些 Template 是準備給公司其他單位更快速上手專案的範本,所以當這個 Template 要被 release 之前一定要萬無一失,不然就會是災難 … 而其中重要的一環設計就是「測試」。

這段時間找了好幾個 CloudFormation 測試工具,包含 cfn_nagcfn-lint .. 等工具,最後看到官方推出的 taskcat 還蠻符合 CloudFormation Template 的測試情境

介紹 Taskcat

Taskcat 是 AWS 官方在 2019 年部落格公開的 CloudFormation Testing Tool

Up your AWS CloudFormation testing game using TaskCat

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: [email protected]
  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。

執行過程會歷經幾個階段:

  1. taskcat 跑 Test task 的 container (所以一定要有 Docker 環境)
  2. taskcat 執行 lint 測試每個 CloudFormation Template
  3. 呼叫 CloudFormation API 建立 CloudFormation Stack
  4. 等待 CloudFormation Stack Event 狀態更新
  5. 確認 CloudFormation Stack Event 成功或失敗
  6. Destory CloudFormation Stack

已知問題

  • taskcat#339 當 taskcat 建立的 S3 bucket 內還有 Objects 時,跑 destory 後 CloudFormation 無法強制刪除 S3 bucket 造成 CloudFormation Stack 卡在 `DELETE_FAILED` 狀態。
  • taskcat#278 taskcat 執行 lint 時無法 ignore rule,必須全數通過。

參考

給 Mr. 沙先生一點建議

彙整

分類

展開全部 | 收合全部

License

訂閱 Mr. 沙先生 的文章

輸入你的 email 用於訂閱