AWS Summit Tokyo 2017が開催されている中、皆さんいかがお過ごしでしょうか?
弊社も IoT開発のためのテストサービスであるmockmockを出展しています。
皆さん、是非ブースに遊びに来てください。
ちなみに、私は金曜日のAWS Dev Dayに一般参加者として参加予定です。
さて、本エントリは、以下のエントリに対しての実装です。
いよいよAWSリソースの一意特定が難しくなってきた
awspecで上げられたIssueで、現行awspecだとテストが書きにくいものとして
- Auto Scaling GroupをTerraformで作っているので名前をつけていない。タグでリソースを特定したい
- Route Tableをテストする際にVPCでフィルタリングしたい
- SubnetをCIDRでテストを書きたい(名前やIDで特定していない)(必然的にVPCでフィルタリング)
などがありました。
ただ、様々なリソースの様々な特定方法をawspecの各リソースタイプに実装するのは、実装が複雑になりそうなのであまり乗り気ではありませんでした。
とはいえ、「awspecを使う人にSDKを駆使してもらうのを強いるのもなー」と思っていまして、思考が紆余曲折した結果ライブラリとして切り出しました。
awsrm
awsrmはシンプルで統一したAWSリソース情報の取得方法の提供を目指すライブラリです。
(Relational Mappingとは言えない実装ですが、情報取得の仕方を少し世の中ののORMに似せているので、名前の末尾に rm
を付けてみました。)
SDKを直接使うよりも簡単に(でも、できることは少ない)
「統一したAWSリソース情報の取得方法」というのが結構重要で、実はAWSリソースの取得方法はSDKレベルだとそれぞれ似ているけどちょっと違います。
そこらへんを強引に統一することで、awspecを利用するときにあまり考えることなく必要最低限のAWSリソース情報を取得できるようにしています。
例えば、SubnetをVPCでフィルタリングしつつCIDRブロックでテストを書きたいときは one
メソッドが使えます。
require 'awspec' require 'awsrm' describe route_table(Awsrm::Subnet.one(cidr: '10.0.0.1/24', vpc: 'my-vpc').id) do it { should exist } it { should belong_to_vpc('my-vpc') } end
あるVPC内のRoute Tableのテストを一気にしたいときは all
メソッドを利用します。
require 'awspec' require 'awsrm' Awsrm::RouteTable.all(vpc: 'my-vpc').each do | route | describe route_table(route.id) do it { should exist } it { should belong_to_vpc('my-vpc') } end end
find(:first)
とちょっと違う動きの one
awsrmのユースケースは、awspecにおけるリソースの特定ですので、SQLでいう LIMIT = 1
ではリソースの一意な特定ができているとは言えません。
なので、awsrmで提供している one
メソッドは、取得結果が0件だったり2件以上だった場合はエラーになります。
というわけで
「awspecでこんな感じでリソースをまとめてテストしたいんだけどなー」と思いましたら awsrm へPull Requestをよろしくお願いいたします!
最後になりますがawspecと一緒じゃなくても使えますよ?