はじめに
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
実行
以下のメッセージが出力され、失敗しました。
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テンプレートの自動テスト的なものと組み合わせてみたいと感じています。
この記事がどなたかのお役に立てれば幸いです。