目次
はじめに
「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_COMPLETE
とDELETE_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