CodeCommit/CodePipeline/CodeBuildで自動awspecしてくれる環境を作ってみました

はじめに

こんにちは植木和樹@上越妙高オフィスです。

みなさん awspec はご存知でしょうか?awspecはAWS環境のVPC/EC2/セキュリティグループ/ルートテーブルが「あるべき設定」になっているかをテストしてくれるツールです。

k1LoW/awspec: RSpec tests for your AWS resources.

本番環境でAWSを使っていくと、どんどん環境が大規模になり複雑になります。とある作業が意図しない変更をしてしまっていないか不安になることがありませんか?そんな時に「あるべき設定」になっているか自動でチェックしてくれる仕組みがあると便利ですよね。

今回はCodeCommitに変更をpushすると、CodeBuildがawspecを使って自動的に環境をテストしてくれる仕組みを作ってみました。

20170913_awspec_002

CodeCommitとCodeBuildはCodePipelineで繋げます。CodeCommitのmasterブランチに変更があると、CodePipelineがソースを固めてS3にアップし、CodeBuildはS3からファイルをダウンロード・展開してからawspecを起動する、という仕掛けです。

CodeCommit/CodePipeline/CodeBuild環境の構築

環境構築するの大変ですよね?私は大変でした。CloudFormationで環境を一発作成できるテンプレートを用意したのでご利用ください。

1クリックでawspec環境を構築

awspecによるテストの準備

CloudFormationで環境が構築できたら、今度はawspecを準備して実際にCodeCommitにpushしてみましょう。

雛形をgithubに用意したので参考にしてください。

classmethod-aws/awspec: Build CodeCommit/CodePipeline/CodeBuild environment for awspec

githubからリポジトリをcloneする

まずはgithubからリポジトリをcloneします。cloneしたらclone元のリポジトリ設定は不要なので消しておきましょう。

git clone https://github.com/classmethod-aws/awspec.git
git remote remove origin

awspec generateでspecファイルの雛形を作成する

awspecはgenerateというコマンドで雛形を作ってくれます。素晴らしい。

今回は90_setup.shという名前で、既存のAWS環境からマルっと雛形を作るシェルスクリプトを用意しました。雛形ができたら00run.sh(中身はbundle exec rake specを実行してる)スクリプトでテストが成功することを確認しましょう。

cd awspec/awspec
export AWS_DEFAULT_PROFILE=default
./90_setup.sh
./00run.sh

なお"default"セキュリティグループはAWSアカウント内で名前が重複しているとテストに失敗します。セキュリティグループ名でなくセキュリティグループ"ID"指定に修正すればOKです。

describe security_group('default') do
↓
describe security_group('sg-XXXXXXXX') do

specファイルをcommitする

テストが成功したら、generateされたspecファイルをcommitしましょう。

git add --all
git commit --all -m'Do awspec generate.'

CodeCommitにpushする

CodeCommitを使うのが初めての方は、AWSのドキュメントの通り認証ヘルパーを設定しておいてください。

AWS CLI 認証情報ヘルパーを使用して Windows 上で AWS CodeCommit リポジトリへの HTTPS 接続の設定手順 - AWS CodeCommit

認証ヘルパーの設定ができたら、CodeCommitのリポジトリを追加してpushします。CodeCommitのパスは作成したCloudFormationスタックの「出力」タブに出力されています。

20170913_awspec_003

git remote add codecommit https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/my-repo
git push codecommit --all

pushするとCodePipelineが動きはじめテストが開始されます。

テスト結果を確認する

CodePipelineのコンソールを開きます。 AWS CodePipeline Management Console

Source, Buildフェーズともに成功になっていれば成功です!

20170913_awspec_001

もしテストが失敗している場合にはCodeBuildコンソールの「ビルド履歴」を確認して原因を確認してください。 AWS CodeBuild Management

環境変更後の再テスト

今後AWS環境を変更した時にはCodeCommitのmasterブランチに対して git push してください。自動的にawspecによるテストが実行されます。

もしテストが失敗した場合には awspec/spec ディレクトリ以下のspecファイルを修正しましょう。(※環境を変更する前にテストを修正すべきですね :))

まとめ

CodeCommit/CodePipeline/CodeBuildを使ったawspecの自動実行についてご紹介しました。

CodeBuildではソースを展開したディレクトリにある buildspec.yml に記述された処理を実行します。 今回はawspecを実行していますが、応用次第ではCodeCommitへのpushをトリガーに様々な処理を組み込めるかと思います。ぜひ色々と試してみてください!