Локальное (за пределами EC2) тестирование с использованием профилей экземпляров Fog/Carrierwave и IAM?

Я понимаю, что могу настроить fog для использования профилей экземпляров IAM (я загружаю на S3 через fog/carrierwave), передавая use_iam_profile => true. Что я еще не понял, так это как тестировать мой код вне экземпляра EC2, как на моей локальной машине. Есть ли стратегия для этого, которую люди используют?

1 ответ

Решение

Я не знаю, как другие могут это делать, но это стратегия, которую я придумал. У меня есть 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. Да, я проверяю идентификатор приложения и секрет, но вам не нужно; Вы могли бы сделать это с переменными среды вместо этого. Личный выбор здесь, и я могу изменить его позже.
  3. Это работает, как и ожидалось, локально, но я еще не пробовал в EC2. Так как в каждой среде Rails CarrierWave::Uploader::Base.fog_credentialsхэш получается именно так, как я ожидаю, он должен работать очень хорошо, когда я туда доберусь.

Конечным результатом является то, что во всех средах AppConfig.fog['credentials'] хэш получает то же самое :region а также :provider, В разработке, он также содержит идентификатор и секрет. В производстве он не содержит идентификатор или секрет, но вместо этого получает :use_iam_profile => true

Другие вопросы по тегам