使用雾创建带有user_data的ec2时处理空字节

时间:2013-12-25 13:09:36

标签: ruby-on-rails ruby amazon-web-services amazon-ec2 fog

我正在尝试使用雾来配置ec2实例,这是我正在使用的代码:

compute = Fog::Compute.new provider: 'AWS',
            region: 'us-east-1', aws_access_key_id: ACCESS_KEY,
            aws_secret_access_key: SECRET_ACCESS_KEY
options = {
          image_id: 'ami-xxxxxx',
          flavor_id: 'm1.small',
          #custom security group created in AWS Account with open ports
          groups: ['myGroup'],
          private_key_path: '~/.ssh/id_rsa',
          public_key_path: '~/.ssh/id_rsa.pub',
          username: 'ec2-user',
          user_data: File.read(Rails.root.join('public', 'somefile.zip'))
        }
compute.servers.bootstrap options

什么时候,我跑这个。我收到以下错误:

Fog::JSON::EncodeError: string contains null byte
from /home/gaurish/.rvm/gems/ruby-2.0.0-p247/gems/multi_json-1.8.2/lib/multi_json/adapters/oj.rb:20:in `dump'

正如您可能注意到的,上面。我正在为user_data选项提供ZIP文件。这就是我认为问题的发生。我的猜测是,zip文件或将其编码为base64会以某种方式添加一个空字节("\0"),因为Oj无法将其编码为JSON格式。

现在,

  • 任何人都可以验证它是雾中的错误还是我做错了什么?
  • 避免空字节的任何变通方法?

使用的版本:

  • Fog 1.19
  • multi_json-1.8.2
  • OJ-2.2.3

1 个答案:

答案 0 :(得分:2)

我已经解决了这个问题。这是如何:

file = File.open(path, 'rb') #path => path to zip file
contents = file.read
file.close
user_data = Base64.encode64 contents

现在,这个user_data可以安全地传递到options[:user_data]哈希,而不会出现空字节错误。这个问题正在跟踪中:

https://github.com/fog/fog/issues/2506