1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

TaskCatをCodeBuildで動かして、CFnを自動でテスト

Posted at

はじめに

CloudFormation(CFn)の自動テストの方法を調べていたら、TestCatというツールを知ったので、CodeBuildで使ってみた内容を記事にします。
また前回、CodeBuildでConftestを使ってみたので、

  1. Conftestを実行してポリシーチェックを行って
  2. TaskCatを実行して作成できるかテスト

というようにしてみました。

参考

やったこと

Cloud9上で動かす

まずはCloud9で動かしてみます。インストールコマンドは以下になります。

python3 -m pip install --upgrade pip
pip3 install taskcat --use-feature=2020-resolver
taskcat -v

チェックするCFnテンプレート

Conftestの際にも使った公式の例を使います。

Actionだけ、以前の記事で使用したConftestのポリシーチェックをパスさせるため、少し変えました。

sampleCreateRole.yaml
AWSTemplateFormatVersion: "2010-09-09"
Resources:
  RootRole:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      Path: /
      Policies:
        - PolicyName: root
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action: 's3:*Object'
                Resource: '*'
  RootInstanceProfile:
    Type: 'AWS::IAM::InstanceProfile'
    Properties:
      Path: /
      Roles:
        - !Ref RootRole

.taskcat.ymlの作成

TaskCatの設定ファイル.taskcat.ymlを記述します。ここでは2つのリージョンで作ってみます。自動テストする際は「本番は東京リージョンなので、テスト作成は大阪リージョンで行う」のようにするといいかもしれません。

.taskcat.yml
project:
  name: sample-taskcat-project
  package_lambda: false
  regions:
    - ap-northeast-1
    - ap-northeast-3
tests:
  test-my-role:
    template: sampleCreateRole.yaml

実行

動かすのは、以下のコマンドになります。

taskcat test run

実行の状況は標準出力に出てきます。結果は同ディレクトリに作成されるtaskcat_outputs\以下にファイルが生成されます。
実行中に作成されたS3バケット(バケット名の先頭が"tcat"で始まっている)は、自動では削除されませんので、必要に応じて自分で削除してください。

CodeBuildに組み込む

CodeBuild環境一式作成

以前作ったCodeBuild環境を参考にします。

クリックで表示

TaskCatでは、S3バケットを作ったり、CFnを実行したりなどなど、いろいろやっているので、CodeBuildにアタッチさせるIAMロールはAdministratorAccessにしています。

AWSTemplateFormatVersion: 2010-09-09

Parameters:
  ProjectName:
    Type: String
    Default: testTaskcatBuild
  RepositoryName:
    Type: String
    Default: forTaskcatBuild

Resources:
  MyCodeCommitRepo:
    Type: AWS::CodeCommit::Repository
    Properties:
      RepositoryName: !Ref RepositoryName

  MyS3Bucket:
    Type: AWS::S3::Bucket

  LogGroupForCB:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub "/aws/codebuild/${ProjectName}"
      RetentionInDays: 3653   # 未指定時は「失効しない」

  RoleForCB:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - codebuild.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      Path: /
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AdministratorAccess

  CBProject:
    Type: AWS::CodeBuild::Project
    Properties:
      Name: !Ref ProjectName
      ServiceRole: !GetAtt RoleForCB.Arn
      Artifacts:
        Type: S3
        Location: !Ref MyS3Bucket
        EncryptionDisabled: true
      Environment:
        Type: LINUX_CONTAINER
        ComputeType: BUILD_GENERAL1_SMALL
        # 以下の Image identifier を参照
        ## https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-available.html
        Image: aws/codebuild/amazonlinux2-x86_64-standard:5.0
      Source:
        Type: CODECOMMIT
        Location: !GetAtt MyCodeCommitRepo.CloneUrlHttp
        GitCloneDepth: 1 # 指定しないと、フル
      SourceVersion: refs/heads/main
      LogsConfig:
        CloudWatchLogs:
          Status: ENABLED
        S3Logs:
          Status: DISABLED

各ファイルを追加

.taskcat.ymlsampleCreateRole.yamlをCodeCommitに追加します。
またConftestも一緒に実行したいので、以下の記事で作ったpolicy/rolePolicy.regoも追加しました。

buildspec.ymlは以下のようにし、追加。

buildspec.yaml
version: 0.2

phases:
  install:
    commands:
      - echo Entered the install phase...
      - echo Installing Conftest on `date`
      - LATEST_VERSION=$(wget -O - "https://api.github.com/repos/open-policy-agent/conftest/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/' | cut -c 2-)
      - wget "https://github.com/open-policy-agent/conftest/releases/download/v${LATEST_VERSION}/conftest_${LATEST_VERSION}_Linux_x86_64.tar.gz"
      - tar xzf conftest_${LATEST_VERSION}_Linux_x86_64.tar.gz
      - sudo mv conftest /usr/local/bin
      - echo Installing Conftest on `date`
      - python3 -m pip install --upgrade pip
      - pip3 install taskcat
  pre_build:
    commands:
      - echo Conftest started on `date`
      - conftest test sampleCreateRole.yaml
      - echo TascCat started on `date`
      - taskcat test run
    finally:
      - aws s3 ls | awk '{print $3}' | grep "^tcat" | xargs -I {} aws s3 rb s3://{} --force
artifacts:
  files:
    - 'taskcat_outputs/*'
  • TaskCatの結果を、アーティファクトの保存先のS3バケットに持ってくるようにしました。
  • 以下を参考に、作成されるS3バケットを削除するようにしてみました。

CodeCommitに4つのファイルを追加して、以下のようになりました。
image.png

実行

あとはCodeBuildを開始します。
image.png

問題なければ、ステータスが成功になります。
image.png

片付け

環境はCFnテンプレートで作成したため、S3バケットを空にした後にスタックの削除を行ってください。

  • S3
    • バケットを空にしてから
  • CodeCommit
  • CodeBuild
  • IAMロール
  • CloudWatchロググループ

おわりに

CodeBuildでTaskCatやConftestなどを動かして、CFnのテストやポリシーチェックを自動化することで、開発の負担が減らせることが期待できます。
この記事がどなたかのお役に立てれば幸いです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?