class KnuckleCluster::AsgInstanceRegistry

Attributes

asg_name[R]
aws_client_config[R]

Public Class Methods

new(aws_client_config:, asg_name:) click to toggle source
# File lib/knuckle_cluster/asg_instance_registry.rb, line 9
def initialize(aws_client_config:, asg_name:)
  @aws_client_config = aws_client_config
  @asg_name   = asg_name
end

Public Instance Methods

agents() click to toggle source
# File lib/knuckle_cluster/asg_instance_registry.rb, line 14
def agents
  @agents ||= load_agents
end
output_agents() click to toggle source
# File lib/knuckle_cluster/asg_instance_registry.rb, line 18
def output_agents
  tp agents,
    :index,
    :instance_id,
    # :public_ip,
    :private_ip,
    :availability_zone
end

Private Instance Methods

autoscaling_client() click to toggle source
# File lib/knuckle_cluster/asg_instance_registry.rb, line 58
def autoscaling_client
  @autoscaling_client ||= ::Aws::AutoScaling::Client.new(aws_client_config)
end
ec2_client() click to toggle source
# File lib/knuckle_cluster/asg_instance_registry.rb, line 54
def ec2_client
  @ec2_client ||= ::Aws::EC2::Client.new(aws_client_config)
end
load_agents() click to toggle source
# File lib/knuckle_cluster/asg_instance_registry.rb, line 31
def load_agents
  auto_scaling_instances = autoscaling_client.describe_auto_scaling_groups(auto_scaling_group_names: [@asg_name]).to_h

  if auto_scaling_instances[:auto_scaling_groups].empty?
    puts "Could not find auto scaling group '#{asg_name}' in region #{aws_client_config[:region]}."
    exit(0)
  end

  instance_ids = auto_scaling_instances[:auto_scaling_groups][0][:instances].map{|instance| instance[:instance_id]}

  instance_reservations = ec2_client.describe_instances(instance_ids: instance_ids).reservations

  instance_reservations.map(&:instances).flatten.map.with_index do |instance, index|
    Agent.new(
      index:                  index + 1,
      instance_id:            instance[:instance_id],
      public_ip:              instance[:public_ip_address],
      private_ip:             instance[:private_ip_address],
      availability_zone:      instance.dig(:placement, :availability_zone),
    )
  end
end