インフラ

InSpecでローカルからawsのCloudwatchアラームをテストしてみる

InSpec

こんにちは、ちゃりおです。

手動管理している環境では、Cloudwatchアラームの設定が漏れてしまいがちです。
しかし、アラームの数が多く一つ一つ確認するのは辛いです。

そこで、テスト向けフレームワークであるInSpecを使って自動でテストしてみようと思います。

InSpecとは

インフラ環境のテスト向けフレームワークです。
OSやクラウド環境のテストができます。

AWS,GCP,Azureなどに対応しています。

Chef InSpec is an open-source framework for testing and auditing your applications and infrastructure. Chef InSpec works by comparing the actual state of your system with the desired state that you express in easy-to-read and easy-to-write Chef InSpec code. Chef InSpec detects violations and displays findings in the form of a report, but puts you in control of remediation.

Chef InSpecは、アプリケーションとインフラストラクチャをテストおよび監査するためのオープンソースフレームワークです。 Chef InSpecは、システムの実際の状態を、読みやすく書きやすいChefInSpecコードで表現した目的の状態と比較することで機能します。 Chef InSpecは違反を検出し、結果をレポートの形式で表示しますが、修復を制御できます。

引用元 Chef Documentation「An Overview of Chef InSpec

InSpecインストール・AWSクレデンシャル設定(Mac)

ローカルにInSpecインストールして、AWSリソースをテストできる環境を作ります。

brewでInSpecをインストールします。

$ brew install chef/chef/inspec
$ inspec --version
4.26.4

以下コマンドでAWSアカウントを検出できるか確認します。

$ inspec detect -t aws://

 ────────────────────────────── Platform Details ────────────────────────────── 

Name:      aws
Families:  cloud, api
Release:   train-aws: v0.1.35, aws-sdk-core: v3.111.2

Profileを作成します。
以下コマンドを実行すると、inspec実行に必要なファイルが作成されます。

$ inspec init profile --platform aws my-profile

デフォルトで作成されるテストを実行します。
VPCのテストが実行されます。

クレデンシャルが設定されていれば、テストが実行できるはずです。

$ cd my-profile/
$ inspec exec . -t aws://  --attrs attributes.yml

思ったようにクレデンシャルが読み込まれない場合は、「aws://ap-northeast-1/<profile名>」で使用するクレデンシャルを指定できます。
(profileは「~/.aws/config」にあるやつ)

Chef Documentation Install and Uninstall
Chef Documentation Using Chef InSpec on Cloud Platforms
Github inspec/aws-inspec

InSpecでCloudwatchアラームをテストしてみる

環境ができたところで、今回の目的であるCloudwatchのテストです。

「controls/」配下に「cloudwatch-alarm.rb」のようなファイルを作成します。

title "cloudwatch alarm check"

control "aws-cloudwatch-check" do
  impact 1.0
  title "Check in cloudwatch alarm"
  describe aws_cloudwatch_alarm(
    metric_name: "CPUUtilization", 
    metric_namespace: "AWS/EC2",
    dimensions: [{"InstanceId": "i-XXXXXXXXX"}]
  ) do
    it { should exist }
  end  
end

「InstanceId i-XXXXXXXXXのEC2にCPUUtilizationアラームが設定されているか」チェックしています。

同様にテストを実行すると、作成したcloudwatchのテストが実行されます。

$inspec exec . -t aws:// #失敗: アラームが存在しない場合
~~省略~~
Profile: AWS InSpec Profile (my-profile)
Version: 0.1.0
Target:  aws://

  ×  aws-cloudwatch-check: Check in cloudwatch alarm
     ×  CloudWatch Alarm CPUUtilization AWS/EC2 is expected to 
~~省略~~
$ inspec exec . -t aws:// # 成功: アラームが存在する場合
~~省略~~
Profile: AWS InSpec Profile (my-profile)
Version: 0.1.0
Target:  aws://

  ✔  aws-cloudwatch-check: Check in cloudwatch alarm
     ✔  CloudWatch Alarm CPUUtilization AWS/EC2 is expected to exist
~~省略~~

Chef Documentation aws_cloudwatch_alarm resource

まとめ

ローカルのinspecでAWS環境のCloudwatchアラームをテストしてみました。
Chefが提供しているだけあり、ドキュメントしっかりしていて迷わず設定できました。

今回作ったテストでは一つのアラームのチェックですが、複数アラームをシンプルにテストできると思うのでまた試してみます。

Aamzonで「AWS」の本を見てみる

楽天で「AWS」の本をみてみる!!

[ServerSpec入門]Ansilbeで構築したサーバをServerspecで自動テストするServerspecに入門してみました。 Serverspceを使用することで、インフラのテストが自動化できます。 単体テストと呼ばれる...
Vegetaで始める負荷テスト 使い方と目標負荷の求め方こんにちは、ちゃりおです。 Vegetaを使って負荷テストをやってみました。 Vegetaの使い方と目標負荷の計算方法について書きま...
インフラのテストで 使えるコマンド
インフラの結合テスト・負荷テストの時に使えるコマンド(CPU、メモリ、ディスク)サーバの結合テスト・負荷テストをたまに作ることがあります。 新人の頃は、何を作ればよいのか分からない状態でした。 最近作れるようにな...