[アドカレ2023] TaskCatをつかってみた。

はじめに

「DENET ADVENT CALENDAR 2023」の12/14担当のchiyodaです。

12月14日は「南極の日」だそうで調べてみたらすごい日でした。
それとはあまり関係ありませんがTaskCatを触ったので、それについて記事にしたいと思います。

TaskCatについて

AWSが開発&公開しているCloudFormationのテンプレートのテストツールです。[1]
テンプレートファイルの構文チェックだけではなくテスト時に実際に環境に一時的にデプロイするため、
実行エラーを確認することができます。(テスト完了時に自動で削除)
Windows環境はサポートされてないためWindows利用の場合WSLの準備と、それとは別にPythonとDockerが動く環境が必要になります。

使ってみる

今回は3つのテンプレートファイル (root.yaml. vpc.yaml, sg.yaml) をTaskCatでテストしてVPCにセキュリティグループを設定した環境をデプロイしたいと思います。

実際に環境にデプロイされるため、注意点として以下が挙げられます。

  • 削除されるまでのリソース分の料金は発生
  • テンプレート内で削除保護 (deletionProtection)等有効にしていると自動削除時でエラー
  • 複数ファイルを同時デプロイしているためクロススタック参照に非対応
  • CloudFormation側での削除に対応していないリソースの削除

.taskcat.yml

テストファイルを設定するtaskcat.ymlを準備します。

テストディレクトリ配下のvpc.yamlとsg.yamlはデプロイリージョンのS3にアップロードされます。
TaskCat機能の疑似パラメータを使うことでそのファイルを参照することができます。[2]

.taskcat.yml

project:
  name: test-project
  regions:
    - ap-northeast-1
tests:
  root:
    parameters:
        UrlVpc: https://s3.amazonaws.com/$[taskcat_autobucket]/$[taskcat_project_name]/templates/denet_vpc.yml
        UrlSg: https://s3.amazonaws.com/$[taskcat_autobucket]/$[taskcat_project_name]/templates/denet_sg.yml
    template: root.yml

root.yml

TaskCatの仕様上クロススタック参照できないため橋渡し役としてroot.ymlを設定します。
DependsOn属性設定することでスタックの実行順を指定しています。[3]
sg.ymlとvpc.ymlについては省略しますがsg.ymlにてvpcを参照します。

root.yml

Parameters:
  UrlVpc:
    Type: String
  UrlSg:
    Type: String
Resources:
  VPC:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: !Ref UrlVpc
      Parameters:
        ExportValue: adcale2023-vpc
  SG:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: !Ref UrlSg
      Parameters:
        ExportValue: adcale2023-sg
DependsOn: VPC

実行結果

taskcat test run

CREATE_COMPLETEDELETE_COMPLETEから正常にテスト完了したこと確認できました。

ログ出力

[INFO   ] : l stack ? tCaT-test-project-root-8aa8063127c04f8c94bf9b0dbb2c496b
[INFO   ] : t stack ? tCaT-test-project-root-8aa8063127c04f8c94bf9b0dbb2c496b-VPC-CLGWFHYVBJMZ
[INFO   ] : t stack ? tCaT-test-project-root-8aa8063127c04f8c94bf9b0dbb2c496b-SG-1LJ6EXQLVUNZ8
[INFO   ] : t region: ap-northeast-1
[INFO   ] : m status: CREATE_COMPLETE
[INFO   ] : Reporting on arn:aws:cloudformation:ap-northeast-1:000000000000:stack/tCaT-test-project-root-8aa8063127c04f8c94bf9b0dbb2c496b/7abff020-46dd-11ee-aa70-06a1c746dd97
[INFO   ] : Deleting stack: arn:aws:cloudformation:ap-northeast-1:000000000000:stack/tCaT-test-project-root-8aa8063127c04f8c94bf9b0dbb2c496b/7abff020-46dd-11ee-aa70-06a1c746dd97
[INFO   ] : l stack ? tCaT-test-project-root-8aa8063127c04f8c94bf9b0dbb2c496b
[INFO   ] : t stack ? tCaT-test-project-root-8aa8063127c04f8c94bf9b0dbb2c496b-VPC-CLGWFHYVBJMZ
[INFO   ] : t stack ? tCaT-test-project-root-8aa8063127c04f8c94bf9b0dbb2c496b-SG-1LJ6EXQLVUNZ8
[INFO   ] : t region: ap-northeast-1
[INFO   ] : m status: DELETE_COMPLETE

root.yamlがない場合

補足でテストファイル(.taskcat.yml)にてroot.yamlを参照しない場合、以下のような動作になります。

.taskcat.yml

project:
  name: test-project
  regions:
    - ap-northeast-1
tests:
  vpc:
    parameters:
        ExportValue: adcale2023-vpc
    template: vpc.yml
  sg:
    parameters:
        ExportValue: adcale2023-sg
    template: sg.yml

sg.yamlにて設定する対象のvpc (adcale2023-vpc)が作成中のため参照できずエラーとなりました。

ログ出力

[INFO   ] : l stack ? tCaT-test-project-vpc-0007ff8a245a4b719d80085251ebbfe7
[INFO   ] : t region: ap-northeast-1
[INFO   ] : m status: DELETE_COMPLETE
[INFO   ] : l stack ? tCaT-test-project-sg-0007ff8a245a4b719d80085251ebbfe7
[INFO   ] : t region: ap-northeast-1
[INFO   ] : m status: OUT_OF_ORDER_EVENT
[ERROR  ] : One or more stacks failed to create: {'arn:aws:cloudformation:ap-northeast-1:00000000000:stack/tCaT-test-project-sg-0007ff8a245a4b719d80085251ebbfe7/8e487410-46d7-11ee-9114-0604b3c40ae5': 'COMPLETE event not detected. Potential out-of-band action against the stack.’}

おわりに

テスト時にテスト結果も個別に出力されるため証跡として便利だと思いました。
テスト毎にS3にテンプレートがアップロードされますがAWSアカウントごとにバケット作成可能数が設定されているため、
そこだけご注意ください。[4]
どこかしら参考になれば幸いです。

あと他の方の記事もあがっているのでよければ見てみてください。
DENET 技術ブログ | カテゴリー: アドカレ2023

参考にさせていただいた記事

[1]
taskcat
https://github.com/aws-ia/taskcat

[2]
Psuedo Parameters
https://aws-ia.github.io/taskcat/docs/usage/PSUEDO_PARAMETERS/

[3]
DependsOn 属性
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html

[4]
バケットの制約と制限
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/BucketRestrictions.html

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA