LoginSignup
0
0

ConftestをCodeBuildで実行

Posted at

はじめに

CFnテンプレートをチェックできるConftestについて、以前記事にしました。

これをCodeBuildの中で使ってみようと思います。CodeBuildの簡単な使い方は以下になります。

やってみた

環境

CodeBuild周りの環境は、以前作ったCFnテンプレートをそのまま用います。

ファイル

以下の3ファイルを作成します。

  • sampleCreateRole.yaml
  • policy/rolePolicy.rego
  • buildspec.yml

まずはREGOファイルです。

policy/rolePolicy.rego
package main
import future.keywords

# Actionに * が使われているか
deny[msg] {
  # idに論理IDが格納される
  some id, res in input.Resources
  res.Type == "AWS::IAM::Role"
  
  action = res.Properties.Policies[_].PolicyDocument.Statement[_].Action
  
  is_string(action)
  endswith(action, "*")
  
  msg = sprintf("%s 内でアクションに * が使われています。",[id])
}

チェックするCFnテンプレートは以下を使います。

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: '*'
                Resource: '*'
  RootInstanceProfile:
    Type: 'AWS::IAM::InstanceProfile'
    Properties:
      Path: /
      Roles:
        - !Ref RootRole

最後にbuildspec.ymlです。ビルドファイルなどを作成しているわけではないので、pre_buildでチェックを書いています。どこに書くのが適切なのか、この辺り詳しい方教えてください。

buildspec.yml
version: 0.2

phases:
  install:
    commands:
      - 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
  pre_build:
    commands:
      - conftest test sampleCreateRole.yaml

実行

CodeBuildのビルドを実行します。
image.png

以下のメッセージが出力され、失敗しました。

1 test, 0 passed, 0 warnings, 1 failure, 0 exceptions
Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: conftest test sampleCreateRole.yaml. Reason: exit status 1

成功するように、CFnテンプレートを書き換えコミットします。

ampleCreateLambda.yaml
-                Action: '*'
+                Action: 's3:*Object'

ビルドを再実行して、成功になることが確認できます。

1 test, 1 passed, 0 warnings, 0 failures, 0 exceptions

おわりに

ConftestでCFnテンプレートをチェックできることから、CodeBuildに組み込んでみました。
プログラムのCIのようにできるのでは、と思いやってみて、思っていた以上に簡単にできました。
他のCFnテンプレートの自動テスト的なものと組み合わせてみたいと感じています。

この記事がどなたかのお役に立てれば幸いです。

0
0
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
0
0