【AWS】TaskCatでCloudFormationのテストをする

<img src = "https://img.shields.io/badge/Python-3.7.16-informational.svg?logo=python">
<img src = "https://img.shields.io/badge/TaskCat-0.9.36-informational.svg">


# はじめに
AWS CloudFormationを作成していくなかでCloudFormationのテストやCICDパイプラインを組むためのツールはあるのかという点が気になりました。その際に知ったのが「TaskCat」です。
そこで、TaskCatのラボを基にハンズオンを実施してみました。今回は環境構築～Cloud Formationのテストまでを実施しています。


## 注意事項
TaskCatは指定された各リージョンに実際にデプロイと削除を実施します。そのため、AWS Configの利用費が発生する可能性がございますのでご注意ください。
また、本記事ではCloud 9で実施しているためCloud 9の使用料が発生する可能性がございます。併せてご注意ください。

# ハンズオン実施環境
* Python：3.7.16
* TaskCat：0.9.36
* Cloud 9

# ハンズオン環境の準備
## Cloud 9の構築
下記の設定でCloud 9を構築しました。
Cloud 9の構築方法は[こちら](https://docs.aws.amazon.com/cloud9/latest/user-guide/environments.html)からご確認ください。
![スクリーンショット 2023-02-27 172140.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024215/c9de0340-4f76-1323-590a-0a6cc2f17db0.png)

![スクリーンショット 2023-02-27 172256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024215/04d8b99c-5984-93df-1a14-dc9bcd49f201.png)

## TaskCatのインストール
TaskCatのインストールを行います。
~~~ 
python3 -m pip install taskcat 
~~~

下記のコマンドでバージョンを確認できます。
~~~
taskcat --version
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024215/c5b85b54-da57-8240-b7ff-31640a9913f9.png)

## 作業用のディレクトリを準備
今回はTaskCatで使用する作業ディレクトリを準備しました。

1.TaskCat用のディレクトリを作成します。
~~~
mkdir taskCatTest 
~~~
2.作業用ディレクトリに移動
~~~
cd taskCatTest
~~~

## EC2の鍵ペアを生成
今回のハンズオンではEC2の鍵ペアを生成しておく必要があります。
今回は東京リージョン（ap-northeast-1）で発行しました。

1.AWSコンソール上でAmazon EC2の画面を開きます。
　[ネットワーク&セキュリティ]>[キーペア]をクリックします。
![スクリーンショット 2023-02-27 204628.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024215/8123f258-7399-96fd-0f4a-a05bc6a66cc3.png)

2.右上の[キーペアを作成]をクリックします。
![スクリーンショット 2023-02-27 204939.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024215/41d8f8e4-ae79-db94-21ca-f90ad7972586.png)

3.名前を入力し、[キーペアを作成]をクリックします。
![スクリーンショット 2023-02-27 205110.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024215/354d10cb-bb27-c7a0-056d-79feb628ab5c.png)


# TaskCatでテストを実行
## テスト対象ファイルの作成
実際にテストしたいCloudFormationを作成します。
今回は[AWS CloudFormationサービステンプレート](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/sample-templates-services-ap-northeast-1.html#w2ab1c35c38c13c13)の
[「Amazon VPC における単一の Amazon EC2」](https://s3.ap-northeast-1.amazonaws.com/cloudformation-templates-ap-northeast-1/VPC_Single_Instance_In_Subnet.template)を使わせていただきました。

下記のコマンドでCloudFormaionに記載されている内容を「basic-VPC-sample.yaml」ファイルに
出力します。

 ~~~
curl https://s3.ap-northeast-1.amazonaws.com/cloudformation-templates-ap-northeast-1/VPC_Single_Instance_In_Subnet.template > basic-VPC-sample.yaml
~~~
## プロジェクトレベルのテスト定義ファイルの追加
.taskcat.ymlを作成します。

```.taskcat.yml
project:
  name: my-project
  regions:
    - ap-northeast-1
    - ap-northeast-3
tests:
 test-vpc-sample:
    parameters:
      InstanceType: t2.micro
      KeyName: taskCatTestKey
    template: ./basic-VPC-sample.yaml

```
* regions : テストしたいリージョンを指定します。
* parameters : CloudFormationテンプレートのParametersセクション項目の値を指定することができます。
* template : テストしたいCloudFormationファイルのパスを指定します。

## テストの実行と結果の確認
下記のコマンドでテストを実行します。
~~~
taskcat test run
~~~
実行後、作業用ディレクトリの配下に「taskcat_ouputs」ディレクトリが作成されます。
ディレクトリ配下に生成されているindex.htmlファイルを右クリックし、[Preview]をクリックします。

![スクリーンショット 2023-02-27 215637.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024215/c784bcd0-ce6a-0c8b-328b-35c5575f61a5.png)

東京リージョン(ap-northeast-1)では成功、大阪リージョン(ap-northeast-3)では失敗していることが分かります。
[View Logs]をクリックすることで失敗した理由を知ることができます。

![スクリーンショット 2023-02-27 220937.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024215/16f144c0-e7e0-7d03-dd0b-aea508c877df.png)

「taskCatTestKey」という名前の鍵が無いと言われています。
EC2の鍵ペアはインポートをしないと別のリージョンで使用することはできません。
そのため失敗しています。
![スクリーンショット 2023-02-27 221036.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024215/20b8174b-5e02-15be-6da6-038a363fb571.png)



# まとめ
今回はTaskCatでCloudFomationのテストを実施しました。
各リージョンで使えるかどうかを確認できるためとても便利だと思いました。
次はCICDパイプラインに組み込むことを試したいと思います。

# 参考にさせていただいた記事・公式ドキュメント
* [GitHub - aws-ia/taskcat](https://github.com/aws-ia/taskcat)
* [TASKCAT WORKSHOP](https://taskcat.github.io/workshop/)
* [リージョンごとにCloudFormationスタックの作成テストを行う「taskcat」を試してみた。](https://dev.classmethod.jp/articles/taskcat_multi_region_test/)
* [AWS CloudFormation 向け TaskCat CI/CD パイプライン](https://aws.amazon.com/jp/solutions/implementations/taskcat-ci/)
* [AWS DevOps - TaskCat を使って CloudFormation テンプレートの自動テストをしよう](https://qiita.com/chacco38/items/59887ad3ed7fba7eb0ca)
* [Cloud Formation サービスサンプルテンプレート](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/sample-templates-services-ap-northeast-1.html#w2ab1c35c38c13c13)