awspec でAWSリソースの自動テスト

あいにく僕はRubyistではなく、Rubyの環境整備とかうまくやる自信がないので、 Dockerを使います。

Dockerfile

FROM ruby:2.4

RUN gem install awspec  --no-format-exec

WORKDIR /tmp

ENTRYPOINT ["awspec"]
CMD ["--help"]

Docker Hubのあるイメージ の Dockerfile からバージョン指定を消した程度です。 Docker Hubのあるイメージ はかなり古いので、 自前でイメージをビルドしたほうが良いです。あと、ページにのってる説明がちょっと間違ってる。

$ vim Dockerfile
$ docker build -t "local/awspec" .

あとは、おもむろにコンテナ内で awspec を実行すればOKです。

## ヘルプ表示
$ docker run -it --rm -v $(pwd):/tmp local/awspec

## initファイル生成
$ docker run -it --rm -v $(pwd):/tmp local/awspec init

## テスト実行
$ docker run -it --rm -v $(pwd):/tmp --entrypoint rake local/awspec spec

例によって、残念ながら僕はRubyistじゃないので、 rspecは書いたことがない。

spec/spec_helper.rb

require 'awspec'
require 'json'

if File.exist?('secrets.yml')
  creds = YAML.load_file('secrets.yml')
  Aws.config.update({
                      region: creds['region'],
                      credentials: Aws::Credentials.new(
                        creds['aws_access_key_id'],
                        creds['aws_secret_access_key'])
                    })
end

File.open("params.json") do |param_file|
  @params = JSON.load(param_file)
end

File.open("consts.json") do |const_file|
  @consts = JSON.load(const_file)
end

spec/ec2_spec.rb

require 'spec_helper'
params = @params
consts = @consts

describe ec2(params['instance_name']) do
  it { should exist }
  it { should be_running }
  its(:instance_id) { should eq params['instance_id'] }
  its(:image_id) { should eq params['base_ami_id'] }
  its(:instance_type) { should eq consts['instance_type'] }
  it { should have_eip(params['eip']) }
  it { should have_security_groups([params['sg_id']]) }
  it { should belong_to_vpc(consts['vpc_id']) }
end