如何导出现有AWS ELB策略?未定义的方法'减少'

时间:2015-01-21 19:25:59

标签: ruby amazon-web-services fog

我们想要导出我们的ELB配置以便重复使用。我可以通过以下方式获得ELB配置:

all_elbs = Fog::AWS::ELB.load_balancers.all()

但这会导致失败:

all_policies = Fog::AWS::ELB.policies.all()
#=> /Library/Ruby/Gems/2.0.0/gems/fog-aws-0.0.6/lib/fog/aws/models/elb/policies.rb:20:
#=> in `munged_data': undefined method `reduce' for nil:NilClass (NoMethodError)

最终,我希望能够基于现有的ELB重新创建ELB。

1 个答案:

答案 0 :(得分:0)

该错误消息表示在policies.rb的第20行,有foo.reducefoo等代码恰好是nil

如果我们查看gem的源代码,我们会看到:

def munged_data
  data.reduce([]){ |m,e|  # line 20

因此,问题是调用data方法时nilmunged_data。我们在同一文件的第8行看到data是通过简单的attr_accessor调用定义的。我无法确定应该在哪里设置。 (gem中有227个@data =data =个实例。)这似乎是AWS gem中的一个错误,除非您在调用.all policies之前调用某个方法。 1}}。


进一步追踪,我们发现第154行的policies中定义load_balancer.rb为:

def policies
  Fog::AWS::ELB::Policies.new({
    :data => policy_descriptions,
    :service => service,
    :load_balancer => self
  })
end

假设传递给方法的data直接用作@data实例变量,那么问题是policy_descriptions返回nil

policy_descriptions的实施是:

def policy_descriptions
  requires :id
  @policy_descriptions ||= service.describe_load_balancer_policies(id).body["DescribeLoadBalancerPoliciesResult"]["PolicyDescriptions"]
end

如果service.describe_load_balancer_policies(id).body["DescribeLoadBalancerPoliciesResult"]返回nil(或任何没有[]方法的对象),则此方法会抛出错误。所以,我的推论是,这返回了类似哈希的东西,但该哈希没有"PolicyDescriptions"密钥。

从那里......我不知道。