ども、cloudpackかっぱ (@inokara) です。

そもそも

構築した EC2 インスタンスや AWS の各種サービスの状態をテストする必要があるか否かについては検討する必要があるかと思いますが、以下のようにメタデータや aws-cli を利用することで状態をテストすることは出来そうな気がして試してみました…

あと、動作確認の結果を以って納品しなければいけない状況の場合には何らかの方法で「エビデンス」を残さなければいけませんので、そのエビデンスとして Serverspec の出力結果が利用出来ないか考えた次第です。

例えば…

Amazon EC2 のメタデータを利用して…

require 'spec_helper'

types={
  'instance-type' => 't2.micro',
  'security-groups' => "hogenfuga",
  'iam/info' => "instance-profile/foo",
}
types.each do |type, value|
  describe command("curl http://169.254.169.254/latest/meta-data/#{type}") do
    its(:stdout) { should match /#{value}/ }
  end
end

上記では…

  • インスタンスタイプは t2.micro であること
  • Security Group は hoge と fuga が適用されていること
  • IAM Policy は foo が適用されていること

をテストすることが出来そうです。

Amazon RDS の設定がちゃんと適用されているか…

以下のように多少強引な感じですが aws-cli を叩いて出力をチェックするとかでイケそうです。

types={
  'DBInstances[*].DBParameterGroups[*].DBParameterGroupName' => 'foo',
  'DBInstances[*].DBSubnetGroup.Subnets[*].SubnetAvailabilityZone' => "ap-northeast-1anap-northeast-1c",
}
types.each do |type, value|
  describe command("aws rds describe-db-instances --region ap-northeast-1 --db-instance-identifier foo-db --query #{type} --output text") do
    its(:stdout) { should match /#{value}/ }
  end
end

上記では…

  • パラメータグループが foo であること
  • サブネットの AZ が ap-northeast-1a と ap-northeast-1c(Mulit-AZ であることを確認する)

をテストできそうです。

デモ

手元の環境の Amazon EC2Amazon RDS のテストを流してみると以下のようになります。
SeaverspecでAmazon EC2などをのインスタンスのテスト: 動作確認
うーん、ちょっと強引(^^)

最後に

ちょっと強引さが拭えませんし、マネジメントコンソール見ればいいんぢゃね?って意見もいただきそうですが、あらかじめパラメータが決められた状態で構築した場合に、正しくパラメータが適用出来てるか否かを第三者の目でチェックする方法の一つとして Serverspec でテストするのも悪くないかな…と。

元記事はこちらです。
俺のメモ – ちょっと強引だけど Serverspec で EC2 のメタ情報や aws-cli を利用してインスタンスのテスト出来ないか考えてみた – Qiita