تخزين بيانات الاعتماد الأمازون S3 في المتغيرات البيئية .bashrc يسبب القضبان التطبيق للفشل
-
20-09-2019 - |
سؤال
وأنا تطوير القضبان التطبيق الذي يستخدم مشبك لتخزين الاشياء على الأمازون 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'] %>,
وأي بمعنى. لا يتم تفسير الواجبات.