TaskCatを試してみた

投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。

##TaskCatとは
GitHubより

>TaskCat is a tool that tests AWS CloudFormation templates. It deploys your AWS CloudFormation template in multiple AWS Regions and generates a report with a pass/fail grade for each region. You can specify the regions and number of Availability Zones you want to include in the test, and pass in parameter values from your AWS CloudFormation template. TaskCat is implemented as a Python class that you import, instantiate, and run.
TestCat was developed by the AWS QuickStart team to test AWS CloudFormation templates that automatically deploy workloads on AWS. We’re pleased to make the tool available to all developers who want to validate their custom AWS CloudFormation templates across AWS Regions

https://github.com/aws-quickstart/taskcat
> TaskCatは、AWS CloudFormationテンプレートをテストするツールです。複数のAWSリージョンにAWS CloudFormationテンプレートをデプロイし、各地域の合格/不合格グレードのレポートを生成します。テストに含める領域と空き領域の数を指定し、AWS CloudFormationテンプレートからパラメータ値を渡すことができます。 TaskCatは、インポート、インスタンス化、および実行するPythonクラスとして実装されています。
TestCatは、AWSクイックスタートチームによって開発され、AWSにワークロードを自動的にデプロイするAWS CloudFormationテンプレートをテストします。 AWS地域のカスタムAWS CloudFormationテンプレートを検証したいすべての開発者がこのツールを利用できるようになりました

複数リージョンに同じテンプレートでデプロイする際に簡単にテストできるPython製のツールです。AWSは、よくある構成やソリューションごとにQuickStartというCloudFormationテンプレートを提供していますが、元々TaskCatは、QuickStartチームが自身のテンプレートファイルをテストするために開発したものです。

テスト対象のCloudFormationのテンプレートファイル、パラメータファイルとTaskCatの設定ファイルを入力として、TaskCatを実行すると、設定ファイルで指定したリージョンでCloudFormationのStackが作成されます。


![TaskCat.png](https://qiita-image-store.s3.amazonaws.com/0/78184/b9b3b5aa-9f29-2a6c-79e7-626a0565c911.png)




##使い方
TaskCatのGitHubレポジトリにサンプルプロジェクトがあるため、そちらを使って試してみたいと思います。

1 TaskCatのインストールと確認

```
$ pip install taskcat
$ taskcat
 _            _             _   
| |_ __ _ ___| | _____ __ _| |_ 
| __/ _` / __| |/ / __/ _` | __|
| || (_| \__ \   < (_| (_| | |_ 
 \__\__,_|___/_|\_\___\__,_|\__|
                               
version 0.7.19

[INFO   ] : A newer version of taskcat is available (0.7.27)
[INFO   ] : To upgrade pip version    [ pip install --upgrade taskcat]
[INFO   ] : To upgrade docker version [ docker pull taskcat/taskcat ]

usage: taskcat [-h] [-c CONFIG_YML] [-P BOTO_PROFILE] [-A AWS_ACCESS_KEY]
```

2 サンプルプロジェクトをgit clone

```
$ git clone https://github.com/aws-quickstart/taskcat.git
```

3 ファイルの確認(設定ファイル)

```
$ cat taskcat/examples/sample-taskcat-project/ci/taskcat.yml 
---
global:
  owner: owner@company.com
  qsname: sample-taskcat-project
  s3bucket: <ログ出力用のS3>
  regions:
    - ap-northeast-1
    - ap-northeast-2
    - ap-southeast-1
    - ap-southeast-2
    - eu-central-1
    - eu-west-1
    - sa-east-1
    - us-east-1
    - us-west-1
    - us-west-2
  reporting: true
tests:
  taskcat-json:
    parameter_input: debug-input.json
    regions:
      - us-east-1
      - ap-northeast-1
    template_file: debug.template
```

testセクションでテストシナリオを記載していきます。上記の例は、CloudFormationのパラメータを「debug-input.json」に記述しています。テスト対象のテンプレートファイルが、「debug.template」になります。リージョンは、CloudFormationを実行するリージョンを指定します。

4 ファイルの確認(パラメータファイル)

```
cat taskcat/examples/sample-taskcat-project/ci/debug-input.json 
[
    {
        "ParameterKey": "AvailabilityZones",
        "ParameterValue": "$[taskcat_genaz_3]"
    },
    {
        "ParameterKey": "StackName",
        "ParameterValue": "TestStack"
    },
```

$[**]は、環境変数で例えばリージョンによってAZ構成に差異がありますが、そういった差異を吸収することができます。詳細は以下に記載があります。
https://aws-quickstart.github.io/input-files.html

5 テスト実行

```
taskcat -c taskcat/examples/sample-taskcat-project/ci/taskcat.yml
 _            _             _   
| |_ __ _ ___| | _____ __ _| |_ 
| __/ _` / __| |/ / __/ _` | __|
| || (_| \__ \   < (_| (_| | |_ 
 \__\__,_|___/_|\_\___\__,_|\__|
                                

version 0.7.19


[INFO   ] : A newer version of taskcat is available (0.7.27)
[INFO   ] : To upgrade pip version    [ pip install --upgrade taskcat]
[INFO   ] : To upgrade docker version [ docker pull taskcat/taskcat ]




[taskcat] :AWS AccountNumber: 	 [xxxxxxxxxxx]
[taskcat] :Authenticated via: 	 [environment]

-略-


[INFO   ] :All stacks deleted successfully. Deep clean-up not required.
[INFO   ] :Retaining assets in s3bucket [***]
```

実行すると、debug-input.jsonで指定したリージョンにCloudFormationのスタックが作成され、完了後削除されます。-nオプションを指定するとスタックが削除されず残ります。

6 実行結果の確認

```
cat taskcat_outputs/tCaT-tag-taskcat-json-517b6132-us-east-1-cfnlogs.txt 
-----------------------------------------------------------------------------
Region: us-east-1
StackName: tCaT-tag-taskcat-json-517b6132
*****************************************************************************
ResourceStatusReason:  
Stack launch was successful
*****************************************************************************
*****************************************************************************
Events:  
ResourceStatus      TimeStamp                         ResourceStatusReason         ResourceType                LogicalResourceId
------------------  --------------------------------  ---------------------------  --------------------------  ------------------------------
CREATE_COMPLETE     2018-11-01 05:35:11.387000+00:00                               AWS::CloudFormation::Stack  tCaT-tag-taskcat-json-517b6132
CREATE_COMPLETE     2018-11-01 05:35:08.638000+00:00                               Custom::GenerateID          GetID
CREATE_IN_PROGRESS  2018-11-01 05:35:08.279000+00:00  Resource creation Initiated  Custom::GenerateID          GetID
CREATE_IN_PROGRESS  2018-11-01 05:35:05.547000+00:00                               Custom::GenerateID          GetID
CREATE_COMPLETE     2018-11-01 05:35:02.450000+00:00                               AWS::Lambda::Function       GenID
CREATE_IN_PROGRESS  2018-11-01 05:35:02.153000+00:00  Resource creation Initiated  AWS::Lambda::Function       GenID
CREATE_IN_PROGRESS  2018-11-01 05:35:01.538000+00:00                               AWS::Lambda::Function       GenID
CREATE_COMPLETE     2018-11-01 05:34:58.447000+00:00                               AWS::IAM::Role              LambdaExecutionRole
CREATE_IN_PROGRESS  2018-11-01 05:34:46.150000+00:00  Resource creation Initiated  AWS::IAM::Role              LambdaExecutionRole
CREATE_IN_PROGRESS  2018-11-01 05:34:45.774000+00:00                               AWS::IAM::Role              LambdaExecutionRole
CREATE_IN_PROGRESS  2018-11-01 05:34:42.088000+00:00  User Initiated               AWS::CloudFormation::Stack  tCaT-tag-taskcat-json-517b6132
*****************************************************************************
-----------------------------------------------------------------------------
Tested on: Thursday, 01. November 2018 02:35PM
-----------------------------------------------------------------------------

```

##参考

https://github.com/aws-quickstart/taskcat

https://aws-quickstart.github.io/input-files.html

https://github.com/aws-quickstart/quickstart-taskcat-ci

https://aws.amazon.com/jp/about-aws/whats-new/2018/10/new-quickstart-builds-cicd-pipeline-to-test-cloudformation-templates-using-taskcat/

https://aws.amazon.com/jp/quickstart/architecture/cicd-taskcat/