はじめに
CloudFormation(CFn)の自動テストの方法を調べていたら、TestCatというツールを知ったので、CodeBuildで使ってみた内容を記事にします。
また前回、CodeBuildでConftestを使ってみたので、
- Conftestを実行してポリシーチェックを行って
- TaskCatを実行して作成できるかテスト
というようにしてみました。
参考
やったこと
Cloud9上で動かす
まずはCloud9で動かしてみます。インストールコマンドは以下になります。
python3 -m pip install --upgrade pip
pip3 install taskcat --use-feature=2020-resolver
taskcat -v
チェックするCFnテンプレート
Conftestの際にも使った公式の例を使います。
Actionだけ、以前の記事で使用したConftestのポリシーチェックをパスさせるため、少し変えました。
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つのリージョンで作ってみます。自動テストする際は「本番は東京リージョンなので、テスト作成は大阪リージョンで行う」のようにするといいかもしれません。
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.yml
とsampleCreateRole.yaml
をCodeCommitに追加します。
またConftestも一緒に実行したいので、以下の記事で作ったpolicy/rolePolicy.rego
も追加しました。
buildspec.yml
は以下のようにし、追加。
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つのファイルを追加して、以下のようになりました。
実行
片付け
環境はCFnテンプレートで作成したため、S3バケットを空にした後にスタックの削除を行ってください。
- S3
- バケットを空にしてから
- CodeCommit
- CodeBuild
- IAMロール
- CloudWatchロググループ
おわりに
CodeBuildでTaskCatやConftestなどを動かして、CFnのテストやポリシーチェックを自動化することで、開発の負担が減らせることが期待できます。
この記事がどなたかのお役に立てれば幸いです。