ようへいの日々精進XP

よかろうもん

手作業で構築した AWS リソースの管理には awspec が良いと思ったのでメモ

tl;dr

手作業で構築した AWS リソースの管理には以前から気になっていた awspec が良いと思ったのでメモ。

二台、三台のインスタンスなら...とうっかりと手作業で構築したインスタンスや、どんな設定で作ったか判らないけど、なんとなく利用されている S3 Bucket の管理をどうしようかなと思っていたら awspec の generate コマンドがリソース情報を生成してくれるので試してみた。


参考

github.com

qiita.com


memo

インストール

$ cat Gemfile
source "https://rubygems.org"

gem 'awspec'
gem 'rake'

$ bundle

初期化

$ bundle exec awspec init
 + spec/
 + spec/spec_helper.rb
 + Rakefile
 + spec/.gitignore
 + .rspec

awspec generate

以下のようにサポートされているリソースであれば各リソースの情報を利用してテストを生成してくれるという有り難い機能。

$ bundle exec awspec generate
Commands:
  awspec generate cloudwatch_alarm                    # Generate cloudwatch_alarm spec
  awspec generate directconnect                       # Generate directconnect spec
  awspec generate ebs                                 # Generate attached ebs spec
  awspec generate ec2 [vpc_id]                        # Generate ec2 spec from VPC ID (or VPC "Name" tag)
  awspec generate elb [vpc_id]                        # Generate elb spec from VPC ID (or VPC "Name" tag)
  awspec generate help [COMMAND]                      # Describe subcommands or one specific subcommand
  awspec generate iam_policy                          # Generate attached iam_policy spec
  awspec generate nat_gateway [vpc_id]                # Generate nat_gateway spec from VPC ID (or VPC "Name" tag)
  awspec generate network_acl [vpc_id]                # Generate network_acl spec from VPC ID (or VPC "Name" tag)
  awspec generate rds [vpc_id]                        # Generate rds spec from VPC ID (or VPC "Name" tag)
  awspec generate route53_hosted_zone [example.com.]  # Generate route53_hosted_zone spec from Domain name
  awspec generate route_table [vpc_id]                # Generate route_table spec from VPC ID (or VPC "Name" tag)
  awspec generate s3_bucket [backet_name]             # Generate s3_bucket spec from S3 bucket name. if NO args, Generate all.
  awspec generate security_group [vpc_id]             # Generate security_group spec from VPC ID (or VPC "Name" tag)
  awspec generate subnet [vpc_id]                     # Generate subnet spec from VPC ID (or VPC "Name" tag)
  awspec generate vpc [vpc_id]                        # Generate vpc spec from VPC ID (or VPC "Name" tag)

Options:
  [--profile=PROFILE] 

EC2 の情報を生成する

以下のように generate コマンドを利用して vpc-xxxxxxxx 内の EC2 情報を生成してみる。

$ echo "require 'spec_helper'" > spec/ec2_spec.rb
$ bundle exec awspec generate ec2 vpc-xxxxxxxx >> spec/ec2_spec.rb

以下のような内容が出力される。

require 'spec_helper'
describe ec2('oreno-instance01') do
  it { should exist }
  it { should be_stopped }
  its(:instance_id) { should eq 'i-xxxxxxxxx' }
  its(:image_id) { should eq 'ami-xxxxxxxx' }
  its(:private_dns_name) { should eq 'ip-10-0-x-xxx.ap-northeast-1.compute.internal' }
  its(:public_dns_name) { should eq '' }
  its(:instance_type) { should eq 't1.micro' }
  its(:private_ip_address) { should eq '10.0.x.xxx' }
  it { should have_security_group('test') }
  it { should belong_to_vpc('vpc-xxxxxxxx') }
  it { should belong_to_subnet('subnet-xxxxxxxxxxx') }
  it { should have_ebs('vol-xxxxxxxxxx') }
end

生成された情報を元にテストしてみる。

$ bundle exec rake spec

以下のように出力される。

f:id:inokara:20160221112941p:plain

おお。

このバケットってどんな設定だっけ

S3 バケットの設定も生成しておく。

$ echo "require 'spec_helper'" > spec/s3_bucket_spec.rb
$ bundle exec awspec generate s3 inokara-sandbox >> spec/s3_bucket_spec.rb

以下のように生成される。

$ cat spec/s3_bucket_spec.rb 
require 'spec_helper'
describe s3_bucket('inokara-sandbox') do
  it { should exist }
  its(:acl_owner) { should eq 'xxxxxxxxx' }
  its(:acl_grants_count) { should eq 1 }
  it { should have_acl_grant(grantee: 'xxxxxxxx', permission: 'FULL_CONTROL') }
end

テストしてみる。

f:id:inokara:20160221120110p:plain

VPC の設定も見てみよう

VPC の設定も生成しておく。

$ echo "require 'spec_helper'" > spec/vpc_spec.rb
$ bundle exec awspec generate vpc vpc-xxxxxxxx >> spec/vpc_spec.rb

以下のように生成される。

$ cat spec/vpc_spec.rb 
require 'spec_helper'
describe vpc('vpc-xxxxxxxxx') do
  it { should exist }
  it { should be_available }
  its(:vpc_id) { should eq 'vpc-xxxxxxxxx' }
  its(:cidr_block) { should eq '10.0.0.0/16' }
  it { should have_route_table('rtb-xxxxxxxxx') }
  it { should have_route_table('rtb-xxxxxxxxx') }
  it { should have_network_acl('acl-xxxxxxxxx') }
end

テストしてみる。

f:id:inokara:20160221120122p:plain


最後に

generate がとても有り難い

手作業で構築した AWS リソースは generate コマンドを利用してリソースをコードに吐き出すことでテキストベースで管理出来るのが嬉しい。手で修正を加えたら generate で吐き出すような運用をすれば良さそう。(generate で吐き出すのを忘れる可能性が...)

ということで

構築前にテストを書いて、構築後のチェックで利用という側面もあると思うが、手作業で構築したリソースの資産管理として awspec を使っていきたいと思った。

以上。