使用 Fog/Carrierwave 和 IAM 实例配置文件进行本地(EC2 外部)测试?

Local (outside EC2) testing with Fog/Carrierwave and IAM instance profiles?

我知道我可以通过传递 use_iam_profile => true 来配置 fog 以使用 IAM 实例配置文件(我通过 fog/carrierwave 上传到 S3)。我还没有弄清楚如何在 EC2 实例之外测试我的代码,就像在我的本地机器上一样。是否有人们正在使用的策略?

我不知道其他人是怎么做到的,但这是我想出的策略。我有一个看起来像这样的 config.yml:

default: &default
  aws:
    s3:
      bucket: 'my-production-bucket'
  fog: &fog
    credentials: &credentials
      provider: 'AWS'
      region: 'us-east-1'

development: &development
  <<: *default
  aws:
    s3:
      bucket: 'my-dev-bucket'
  fog:
    <<: *fog
    credentials:
      <<: *credentials
      aws_access_key_id: 'ID_WITH_DEV_BUCKET_ACCESS_ONLY'
      aws_secret_access_key: 'CORRESPONDING_SECRET'

test:
  <<: *development

production:
  <<: *default
  fog:
    <<: *fog
    credentials:
      <<: *credentials
      use_iam_profile: true

我也在 app_config.rb 中使用这个技巧来加载我的 config.yml 文件(这个解决方案不需要,但它会让下一部分对你更有意义):

require 'ostruct'
require 'yaml'

all_config = YAML.load_file(Rails.root.join('config', 'config.yml')) || {}
env_config = all_config[Rails.env] || {}
AppConfig = OpenStruct.new(env_config)

然后,在我的 config/initializers/carrier_wave.rb 文件中:

CarrierWave.configure do |config|
  config.fog_credentials = AppConfig.fog['credentials'].symbolize_keys
  config.fog_directory  = AppConfig.aws['s3']['bucket']
end

备注:

  1. 那里的symbolize_keys调用是必要的,因为默认情况下我 最后得到一个以字符串为键的散列,Fog 正在寻找 符号。
  2. 是的,我正在签入应用 ID 和密码,但你没有 不得不;您可以改用环境变量来执行此操作。 个人选择,以后可能会改
  3. 这作为 预计在本地,但我还没有在 EC2 中尝试过。由于在每个 Rails 环境 CarrierWave::Uploader::Base.fog_credentials 哈希结果完全符合我的预期,它应该可以正常工作 当我到达那里时。

最终结果是,在所有环境中,AppConfig.fog['credentials'] 哈希得到相同的 :region:provider。在开发中,它还包含 ID 和 secret。在生产中它不包含 ID 或秘密,而是获取 :use_iam_profile => true