本連載では、以下のイメージの構成にあるAWSリソース基盤自動化環境の構築を実践しています。

本連載で構築していく基盤自動化環境のイメージ

前回は、CloudFormationテンプレートの簡単なサンプルを作成し、テンプレート記述の基本を解説した上で、実行するためのヘルパースクリプトや実行エラーの確認方法などを説明しました。それを踏まえて今回は、AWSから提供されているマルチリージョンで複数のテンプレートのテストを同時に実行できるオープンソースツール「taskcat」を使って、作成したテンプレートをテストする環境を構築し、結果を出力する方法の解説を進めていきます。

なお、実際のソースコードはGitHub上にコミットしています。以降のソースコードでは本質的でない記述を一部省略しているので、実行コードを作成する場合は、必要に応じて適宜GitHub上のソースコードも参照してください。

また、taskcatの実行環境は以下のバージョンで実施しています。バージョンの差異により実行するコマンドが異なる場合がある点に留意してください。

動作対象 バージョン
MacOS Mojave 10.14.16
Python 3.6.5
pip 10.0.1
taskcat 0.9.8

taskcatの概要

AWS Quickstart Teamがオープンソースで提供するtaskcatは、CloudFormationテンプレートをテストするためのツールです。複数のリージョンで複数のテンプレートを任意にテスト実行でき、テストパラメータなどを細かく設定しながら、正常/失敗終了したかどうかのレポートを証跡としてHTML出力することができます。taskcatでは、指定したリージョンのAWS環境で実際にスタックを構築し、テストを実行しますが、終了後にそのスタックは自動的に削除されます。

taskcat自体はPythonを使って実装されたツールですが、2020年1月現在でサポートされているのは、Pythonおよびパッケージ管理ツールである「pip」がインストールされたMacOSX、もしくはLinuxOSが対象です。Windowsはサポートされていませんが、Windows Subsystem for Linux(WSL)がインストールされたWindows10環境であれば、LinuxOSと同様の手順で実行が可能です。また、将来的には「docker」を使った実行環境の提供も予定されているようです。

事前準備:taskcatのインストールと認証情報の設定

taskcatの公式手順と全く同じになりますが、ここでは、MacOSXにPython3およびpip3がインストールされていることを前提にtaskcatをインストールしてみましょう。taskcatのインストールはpip3を使って実行でき、非常に簡単です。

# pip3 install taskcat --user

Collecting taskcat
Downloading https://files.pythonhosted.org/packages/fe/a7/cc58c276c77b0e15529fcf5d67d2f3004deed8003667b6dec50e76d6138f/taskcat-0.9.8-py3-none-any.whl (73kB)
100% |████████████████████████████████| 81kB 2.4MB/s

// omit

Successfully installed backports.shutil-get-terminal-size-1.0.0 dataclasses-0.7 dataclasses-jsonschema-2.12.0 docker-3.7.3 dulwich-0.19.14 mock-2.0.0 mypy-extensions-0.4.3 pbr-5.4.4 reprint-0.5.2 requests-2.22.0 tabulate-0.8.6 taskcat-0.9.8 typing-extensions-3.7.4.1

ちなみに公式の手順では、—userオプションがない手順も紹介されていますが、それはAdministrator権限を持つrootユーザーがインストールする場合です。MacOSXでは、ユーザーディレクトリ側にインストールするように—userオプションを使用しましょう。

さて、インストールが完了したら「taskcat —verison」とコマンドを実行してみます。バナーのアスキーアートとバージョンが表示されれば、無事インストールは成功です。

# taskcat --version
 _            _             _
| |_ __ _ ___| | _____ __ _| |_
| __/ _` / __| |/ / __/ _` | __|
| || (_| \__ \   < (_| (_| | |_
\__\__,_|___/_|\_\___\__,_|\__|

version 0.9.8
0.9.8

なお、taskcatではCloudFormationを実行する際にAWS認証情報を使用するので、本連載の第22回と同様に、認証情報を~/.aws/Credential配下に保存しておいてください。

taskcatの設定とテスト実行

環境構築が終わったところで、前回で、サンプルとして作成した、下記のようなVPCを構築するテンプレートをテストしてみましょう。

AWSTemplateFormatVersion: '2010-09-09'

Description: Sample CloudFormation template with YAML - VPC

Parameters:
  VPCName:
    Description: Target VPC Stack Name
    Type: String
    MinLength: 1
    MaxLength: 255
    AllowedPattern: ^[a-zA-Z][-a-zA-Z0-9]*$
    Default: mynavi-sample-cloudformation-vpc
  VPCCiderBlock:
    Description: CiderBlock paramater for VPC
    Type: String
    MinLength: 9
    MaxLength: 18
    AllowedPattern: (\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})
    Default: 172.0.0.0/16

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Sub ${VPCCiderBlock}
      InstanceTenancy: default
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: !Sub ${VPCName}

Outputs:
  VPCID:
    Description: VPC ID
    Value: !Ref VPC
    Export:
      Name: !Sub ${AWS::StackName}-VPCID

テンプレートを作成したプロジェクトのルートと同じディレクトリに「.taskcat.yml」という名前の設定ファイルを作成します。以下のサンプルでは、最低限実行に必要なシンプルな設定で構成します。

project:                                   #(1)
  name: sample-aws-cloudformation          #(2)
  regions:
    - us-west-1                            #(3)
tests:                                     #(4)
  vpc-test:                                #(5)
    template: ./test-cfn.yaml              #(6)

なお、設定ファイルはユーザールートディレクトリに配置するグローバルな設定ファイルと、プロジェクトごとに作成する設定ファイルの2種類が同じ名前で存在しますが、各々設定が異なります。指定可能なパラメータはtaskcat GitHubページの「ConfigFiles」を参照してください。設定ファイルの最低限の記述ポイントとしては、下表の通りです。

No. 説明
1 Project要素配下にはプロジェクトに関する固有の設定を行います
2 Project/Name要素にはプロジェクト名称を設定します。アウトプットをS3にアップロードするときはキープレフィクスとして使用されます
3 Project/regions要素には、テストを実行するAWSリージョン識別子を配列で指定します
4 tests要素配下には、実行する各テストに関する固有の設定を行います
5 テストの論理名を任意に設定します。論理名を複数設定することで異なるテストを実行することができます
6 tests/論理名/template要素には、テスト対象のCloudFormationテンプレートを指定します

設定ファイルを作成した後、プロジェクトのルートディレクトリで下記のコマンドを実行します。

# taskcat test run

 _            _             _
| |_ __ _ ___| | _____ __ _| |_
| __/ _` / __| |/ / __/ _` | __|
| || (_| \__ \   < (_| (_| | |_
\__\__,_|___/_|\_\___\__,_|\__|

version 0.9.8
[INFO   ] : Lint passed for test vpc-test on template /Users/xxxxxx/mynavi-sample-aws-cloudformation/test-cfn.yml
[S3: -> ] s3://tcat-mynavi-sample-aws-cloudforma4u25doz5/mynavi-sample-aws-cloudformation/sample-vpc-cfn.yml
[S3: -> ] s3://tcat-mynavi-sample-aws-cloudforma4u25doz5/mynavi-sample-aws-cloudformation/taskcat-test.sh
[S3: -> ] s3://tcat-mynavi-sample-aws-cloudforma4u25doz5/mynavi-sample-aws-cloudformation/sample-sg-cfn.yml
[S3: -> ] s3://tcat-mynavi-sample-aws-cloudforma4u25doz5/mynavi-sample-aws-cloudformation/test-cfn.yml
[S3: -> ] s3://tcat-mynavi-sample-aws-cloudforma4u25doz5/mynavi-sample-aws-cloudformation/create-stack.sh
[S3: -> ] s3://tcat-mynavi-sample-aws-cloudforma4u25doz5/mynavi-sample-aws-cloudformation/delete-stack.sh
[INFO   ] : ┏ stack Ⓜ tCaT-mynavi-sample-aws-cloudformation-vpc-test-22c967cf61da417db274b1d091a4b0e9
[INFO   ] : ┣ region: us-west-1
[INFO   ] : ┗ status: CREATE_COMPLETE
[INFO   ] : Collecting CloudFormation Logs
[INFO   ] : Collecting logs for tCaT-mynavi-sample-aws-cloudformation-vpc-test-22c967cf61da417db274b1d091a4b0e9
[INFO   ] :   |StackName: tCaT-mynavi-sample-aws-cloudformation-vpc-test-22c967cf61da417db274b1d091a4b0e9
[INFO   ] :   |Region: us-west-1
[INFO   ] :   |Logging to: /Users/xxxxxx/mynavi-sample-aws-cloudformation/taskcat_outputs/tCaT-mynavi-sample-aws-cloudformation-vpc-test-22c967cf61da417db274b1d091a4b0e9-us-west-1-cfnlogs.txt
[INFO   ] :   |Tested on: Thursday, 09. January 2020 09:54PM
[INFO   ] : —————————————————————————————————————————————
[INFO   ] : ResourceStatusReason:
[INFO   ] : Stack launch was successful
[INFO   ] : ==========================================================================================
[INFO   ] : Reporting on arn:aws:cloudformation:us-west-1:YYYYYYYYY:stack/tCaT-mynavi-sample-aws-cloudformation-vpc-test-22c967cf61da417db274b1d091a4b0e9/f20ba780-32de-11ea-966b-06aba12266cd
[INFO   ] : Deleting stack: arn:aws:cloudformation:us-west-1:YYYYYYYYY:stack/tCaT-mynavi-sample-aws-cloudformation-vpc-test-22c967cf61da417db274b1d091a4b0e9/f20ba780-32de-11ea-966b-06aba12266cd
[INFO   ] : ┏ stack Ⓜ tCaT-mynavi-sample-aws-cloudformation-vpc-test-22c967cf61da417db274b1d091a4b0e9
[INFO   ] : ┣ region: us-west-1
[INFO   ] : ┗ status: DELETE_COMPLETE
Not in terminal, reprint now using normal build-in print function.

      ┏ stack Ⓜ tCaT-mynavi-sample-aws-cloudformation-vpc-test-22c967cf61da417db274b1d091a4b0e9
      ┣ region: us-west-1
      ┗ status: CREATE_IN_PROGRESS
      ┏ stack Ⓜ tCaT-mynavi-sample-aws-cloudformation-vpc-test-22c967cf61da417db274b1d091a4b0e9
      ┣ region: us-west-1
      ┗ status: CREATE_IN_PROGRESS
      ┏ stack Ⓜ tCaT-mynavi-sample-aws-cloudformation-vpc-test-22c967cf61da417db274b1d091a4b0e9
      ┣ region: us-west-1
      ┗ status: CREATE_IN_PROGRESS
      ┏ stack Ⓜ tCaT-mynavi-sample-aws-cloudformation-vpc-test-22c967cf61da417db274b1d091a4b0e9
      ┣ region: us-west-1
      ┗ status: CREATE_IN_PROGRESS
      ┏ stack Ⓜ tCaT-mynavi-sample-aws-cloudformation-vpc-test-22c967cf61da417db274b1d091a4b0e9
      ┣ region: us-west-1
      ┗ status: CREATE_IN_PROGRESS
      ┏ stack Ⓜ tCaT-mynavi-sample-aws-cloudformation-vpc-test-22c967cf61da417db274b1d091a4b0e9
      ┣ region: us-west-1
      ┗ status: CREATE_IN_PROGRESS
      ┏ stack Ⓜ tCaT-mynavi-sample-aws-cloudformation-vpc-test-22c967cf61da417db274b1d091a4b0e9
      ┣ region: us-west-1
      ┗ status: DELETE_IN_PROGRESS
      ┏ stack Ⓜ tCaT-mynavi-sample-aws-cloudformation-vpc-test-22c967cf61da417db274b1d091a4b0e9
      ┣ region: us-west-1
      ┗ status: DELETE_IN_PROGRESS
      ┏ stack Ⓜ tCaT-mynavi-sample-aws-cloudformation-vpc-test-22c967cf61da417db274b1d091a4b0e9
      ┣ region: us-west-1
      ┗ status: DELETE_IN_PROGRESS
      ┏ stack Ⓜ tCaT-mynavi-sample-aws-cloudformation-vpc-test-22c967cf61da417db274b1d091a4b0e9
      ┣ region: us-west-1
      ┗ status: DELETE_IN_PROGRESS
      ┏ stack Ⓜ tCaT-mynavi-sample-aws-cloudformation-vpc-test-22c967cf61da417db274b1d091a4b0e9
      ┣ region: us-west-1
      ┗ status: DELETE_IN_PROGRESS
      ┏ stack Ⓜ tCaT-mynavi-sample-aws-cloudformation-vpc-test-22c967cf61da417db274b1d091a4b0e9
      ┣ region: us-west-1
      ┗ status: DELETE_IN_PROGRESS

なお、2020年1月現在のtaskcatの最新バージョンは0.9.8ですが、バージョン0.8.x以前とは実行コマンドも設定ファイルの記述要領も異なります。詳細についてはtaskcat GitHubページの「Migrating from 0.8」を参照してください。

実行結果ログを見ると、指定したリージョンでスタックが正常に作成された後、レポートが作成され、プロジェクトルートに生成されたtaskcat_outputsディレクトリに証跡が格納されたことがわかります。その後、スタックは削除されています。HTML形式で出力される証跡は、以下のようなイメージです。

HTML形式で出力される証跡

実行結果ログ

続いて、パラメータを変更してテスト実行してみましょう。tests/vpc-test要素配下にparameters要素を作り、パラメータをハッシュ形式で指定します。

project:                                   #(1)
  name: sample-aws-cloudformation          #(2)
  regions:
    - us-west-1                            #(3)
tests:                                     #(4)
  vpc-test:                                #(5)
    parameters:
      VPCCiderBlock: 172.255.0.0/16        # New!
    template: ./test-cfn.yaml              #(6)

再びコマンドを実行すると、パラメータが変更されてスタックが構築されていることがわかります。下記はテスト実行中に作成されたVPCをマネジメントコンソールから確認した際のイメージです。

実行中に作成されたVPCをマネジメントコンソールから確認

なお、テストが完了するとスタックは削除されるため、どのようなパラメータでリソースが作成されたのかを後から確認したい場合は、CloudTrailで、スタック構築のなかで発生したイベントを取得して確認すると良いでしょう。

CloudTrailで、スタック構築のなかで発生したイベントを取得して確認

このように、taskcatを使用すると、本番と同様に、複数の別のリージョンで、複数のテンプレートの、複数のテストケースを任意に実行し、結果をエビデンスとして残すことが可能です。加えて、taskcatのようにCloudFormationテンプレートの自動テストが可能なツールがあることは、テンプレートコード自体をCI/CDの対象として管理/運用することを可能にします。CodeBuildやCodePipelineを使ったCloudFormationテンプレートのCI/CD環境の構築方法については、今後の連載で解説していく予定です。

次回以降は、実際にCloudFormationを使って、連載「AWSで作るクラウドネイティブアプリケーションの基本」で手動で構築してきた以下のようなAWSリソースを構築するテンプレートの解説を進めていきます。

次回以降、テンプレートについて解説するAWSリソース

次回は、前回作成したVPCに加え、パブリック/プライベートサブネット、ルートテーブル、およびインターネットゲートウェイを構築するスタックテンプレートについて解説します。

著者紹介


川畑 光平(KAWABATA Kohei) - NTTデータ 課長代理

金融機関システム業務アプリケーション開発・システム基盤担当を経て、現在はソフトウェア開発自動化関連の研究開発・推進に従事。

Red Hat Certified Engineer、Pivotal Certified Spring Professional、AWS Certified Solutions Architect Professional等の資格を持ち、アプリケーション基盤・クラウドなどさまざまな開発プロジェクト支援にも携わる。2019 APN AWS Top Engineers & Ambassadors選出。

本連載の内容に対するご意見・ご質問は Facebook まで。