ALBになってから ALB -> ( Listener ) -> Target group -> EC2インスタンス
というつながりになりました。
「ALB配下のEC2インスタンスについてテストをしたい」というときに少し遠いです。
こういうときに awsrm を使うと直感的にEC2のインスタンスIDを取得できます。
require 'awsrm'
instance_ids = Awsrm::AlbTargetGroup.all(alb: 'my-alb-load-balancer-name').map do |target|
target.instance_ids
end.flatten
これで、ALB配下の複数のTarget groupの下に紐付いているEC2インスタンスのIDを取得できます。
「ALBはTagで管理している」というときにも、
require 'awsrm'
alb_id = Awsrm::Alb.one(tags: {Role: 'web'}).id
instance_ids = Awsrm::AlbTargetGroup.all(alb: alb_id).map do |target|
target.instance_ids
end.flatten
「複数のALB(VPC内のALB全て、など)」というときにも、
require 'awsrm'
instance_ids = Awsrm::Alb.all(vpc: 'my-vpc').map do |alb|
Awsrm::AlbTargetGroup.all(alb: alb.id).map do |target|
target.instance_ids
end.flatten
end.flatten
と、直感的に記述できます。
インスタンスIDが取得できれば、awspecで「ALB配下のEC2インスタンスにスケジュールイベントがないこと」というテストを書くのも簡単です。
require 'awspec'
require 'awsrm'
instance_ids = Awsrm::AlbTargetGroup.all(alb: 'my-alb-load-balancer-name').map do |target|
target.instance_ids
end.flatten
instance_ids.each do |id|
describe ec2(id) do
it { should be_running }
it { should_not have_events }
end
end
awsrmはawspecとは独立していますので、テスト以外にも様々な用途で活用できると思います。
もし、awsrmに実装して欲しいリソースがありましたら、PR/IssueやTwitterでのメンションなどよろしくお願いします。