تخزين بيانات الاعتماد الأمازون S3 في المتغيرات البيئية .bashrc يسبب القضبان التطبيق للفشل

StackOverflow https://stackoverflow.com/questions/2260957

سؤال

وأنا تطوير القضبان التطبيق الذي يستخدم مشبك لتخزين الاشياء على الأمازون S3. يتم استضافة التطبيق على Heroku. أنا النامية على أوبونتو الكرمية.

والمشكلة التي أنا على وشك أن تصف يحدث في التنمية (على بلدي المضيف المحلي) والإنتاج (على Heroku).


والطريقة القياسية لتمرير creds S3 لمشبك الورق هي من خلال وضعها في التكوين / s3.yml مثل ذلك:

access_key_id: 12345678
secret_access_key: 903490409fdf09fshsfdoif/43432

وعندما أفعل هذا، كل شيء يعمل على ما يرام. ولكن هذا يجعل من الصعب أن يشارك قانون بلدي مع الآخرين حتى Heroku أقترح طريقة بديلة - HTTP: // مستندات. heroku.com/config-vars .

وونصحوا بأن يجب عليك ان تضع S3_KEY وS3_SECRET إلى .bashrc الخاصة بك مثل ذلك:

S3_KEY=12345678
export S3_KEY
S3_SECRET=903490409fdf09fshsfdoif/43432
export S3_SECRET

وبعد ذلك أقترح عليك أن خلق التكوين / المهيآت / s3.yml (لاحظ مسار مختلف قليلا) ووضع التالية في هذا الملف:

AWS::S3::Base.establish_connection!(
  :access_key_id     => ENV['S3_KEY'],
  :secret_access_key => ENV['S3_SECRET']
)

ولكن، عندما أفعل هذا، مشبك يلقي المتذبذب ويبصق رسالة الخطأ التالية:

undefined method `stringify_keys' for #<String:0xb6d6c3f4>

/vendor/plugins/paperclip/lib/paperclip/storage.rb:176:in `parse_credentials'
/vendor/plugins/paperclip/lib/paperclip/storage.rb:138:in `extended'
/vendor/plugins/paperclip/lib/paperclip/storage.rb:137:in `instance_eval'
/vendor/plugins/paperclip/lib/paperclip/storage.rb:137:in `extended'

.... other stuff 

وهكذا بوضوح انها كل مستهلا داخل وحدة storage.rb. التنقل خلال تتبع المكدس:

ويتم وضع طريقة parse_credentials على خط 176 - وهنا الدعوة كما يظهر في التعليمات البرمجية:

def parse_credentials creds
  creds = find_credentials(creds).stringify_keys
  (creds[RAILS_ENV] || creds).symbolize_keys
end

ووparse_credentials محاولات طريقة لاستدعاء طريقة أخرى، find_credentials، وهذا هو المكان الذي وأعتقد أن الأكاذيب المشكلة. هيريس رمز find_credentials:

def find_credentials creds
    case creds
    when File
      YAML::load(ERB.new(File.read(creds.path)).result)
    when String
      YAML::load(ERB.new(File.read(creds)).result)
    when Hash
      creds
    else
      raise ArgumentError, "Credentials are not a path, file, or hash."
    end
end

لا استطيع ان ارى كيف تم تجهيز طريقة find_credentials لقراءة القيم من ملفي .bashrc. انها حصلت على اثنين من الحالات التي يمكن قراءتها من YAML واحد حيث انها تبحث عن التجزئة.

وبلدي المراجع نموذج أوراق اعتماد مثل ذلك:

  has_attached_file :photo,
                (some code removed)
                :s3_credentials => "#{RAILS_ROOT}/config/initializers/s3.yml",

إذا أزيل: s3_credentials التجزئة من نموذج، وغني عن الخطأ stringify_keys بعيدا والقضبان وحدة رميات رسالة الخطأ التي تظهر في نهاية الأسلوب find_credentials: أي "وثائق التفويض ليست مسار أو ملف أو التجزئة" .

وهكذا أنا الحيرة. وأنا أدرك أن هذا هو ربما سؤال للرجال في Heroku (الذي أنا ذاهب فعلا إلى البريد الإلكتروني هذا الرابط ل، على أمل أن يتمكنوا من الإجابة عليه) وانها أيضا ربما سؤال عن النقل البحري في thoughtbot.

وقال وكما قلت في البداية، بلدي التطبيق يعمل بشكل جيد عندما كنت اتخاذ نهج موحد من الالتصاق بلدي المفتاح والسر في التكوين / s3.yml، ولكن أود أن تفضل استخدام الطريقة التي Heroku تشير لأنه يجعل الأمور أسهل WAY بالنسبة لي، وهذا يعني أنني يمكن تخزين بلدي سعر الفائدة على صفحتي جيثب العامة للآخرين لاستخدام دون الحاجة لكتابة أي برامج دمج العملاء في بوابة المعهد للحفاظ على مفاتيح بلدي من المجال العام.

ولقد حاول الالتصاق المتغيرات ENV في الخ / bash.bashrc وكذلك ~ / .bashrc وبعد إعادة التشغيل، وأنا لا تزال لديها نفس المشكلة. تحدث مشاكل على الجهاز التطوير فضلا عن Heroku. لقد حرصت على دفع بلدي التكوين-فار إلى Heroku كذلك.

هل كانت مفيدة؟

المحلول

وبعد الكثير من البحث وجدت الجواب هنا - HTTP: / /tammersaleh.com/posts/managing-heroku-environment-variables-for-local-development

وهو خدعة لإزالة ملف S3.rb تماما ومجرد الإشارة إلى المتغيرات ENV في النموذج مثل ذلك:

has_attached_file :photo, 
                  #...
                  :storage        => :s3, 
                  :bucket         => ENV['S3_BUCKET'],
                  :s3_credentials => { :access_key_id     => ENV['S3_KEY'], 
                                       :secret_access_key => ENV['S3_SECRET'] }

وعلى أي حال، ديفيد، شكرا لاقتراحك. أنا لا أعرف ما إذا كنت تريد تحديث مستندات Heroku أن أقول إن كان بعض المستخدمين لتفعل ذلك بهذه الطريقة. بفضل رغم مرة أخرى.

نصائح أخرى

وإعادة تسمية الملف إلى config/initializers/s3.yml config/initializers/s3.rb ومحاولة إعطائها.

وهنا المشكلة:

:bucket         => ENV['S3_BUCKET'],

ويحتاج إلى أن يكون

:bucket         => <%= ENV['S3_BUCKET'] %>,

وأي بمعنى. لا يتم تفسير الواجبات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top