こんにちは、ちゃりおです。
手動管理している環境では、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が提供しているだけあり、ドキュメントしっかりしていて迷わず設定できました。
今回作ったテストでは一つのアラームのチェックですが、複数アラームをシンプルにテストできると思うのでまた試してみます。