2016-02-29 1 views
0

J'utilise sitemap_generator pour créer un sitemap. J'ai une tâche de rake pour créer un sitemap et le télécharger sur s3.Rails, sitemap_generator, s3, comment écrire un fichier publiquement disponible sur s3?

sitemap.rb

SitemapGenerator::Sitemap.default_host = "https://www.ezpoisk.com" 
SitemapGenerator::Sitemap.create_index = true 
SitemapGenerator::Sitemap.public_path = 'tmp/' 
SitemapGenerator::Sitemap.sitemaps_path = 'sitemaps/' 

SitemapGenerator::Sitemap.create do 
# generating links ... 

tâche Rake

require "aws" 

namespace :sitemap do 
    desc "Upload the sitemap files to S3" 
    task upload_to_s3: :environment do 
    puts "Starting sitemap upload to S3..." 

    s3 = AWS::S3.new(access_key_id: ENV["AWS_ACCESS_KEY_ID"], 
        secret_access_key: ENV["AWS_SECRET_ACCESS_KEY"]) 

    bucket = s3.buckets[ENV["S3_BUCKET_NAME"]] 

    Dir.entries(File.join(Rails.root, "tmp", "sitemaps")).each do |file_name| 
     next if ['.', '..', '.DS_Store'].include? file_name 
     path = "sitemaps/#{file_name}" 
     file = File.join(Rails.root, "tmp", "sitemaps", file_name) 

     begin 
     object = bucket.objects[path] 
     object.write(file: file) 
     rescue Exception => e 
     raise e 
     end 
     puts "Saved #{file_name} to S3" 
    end 
    end 

    desc 'Create the sitemap, then upload it to S3 and ping the search engines' 
    task create_upload_and_ping: :environment do 
    Rake::Task["sitemap:create"].invoke 

    Rake::Task["sitemap:upload_to_s3"].invoke 

    url = "https://www.ezpoisk.com/sitemaps/sitemap.xml.gz" 
    SitemapGenerator::Sitemap.ping_search_engines(url) 
    end 
end 

et je veux être en mesure de servir si de s3 via mon site afin que dans les voies

get "sitemaps/sitemap(:id).:format.:compression" => "sitemap#show" 

et sitemaps_controller

def show 
    data = open("https://s3.amazonaws.com/#{ENV['S3_BUCKET_NAME']}/sitemaps/sitemap#{params[:id]}.xml.gz") 
    send_data data.read, :type => data.content_type 
    end 

Maintenant. Le problème.

lorsque j'exécute une tâche de rake et que j'essaie d'accéder au fichier via le lien 403 je suis interdit. Je vais ensuite à la console s3 et fais manuellement "Make it public" sur le dossier "sitemaps". Maintenant, quand j'essaie d'accéder au fichier, il est correctement téléchargé ... le problème est - que lorsque je réexécute la tâche (j'ai un travail sidekiq qui le fait une fois par jour) je reçois à nouveau 403 ... Mes hypothèses sont mon écriture opération modifie les autorisations sur ceci.

le compartiment lui-même dispose de l'autorisation «autoriser la liste à tout le monde».

J'ai essayé

bucket = s3.buckets[ENV["S3_BUCKET_NAME"]] 
bucket.acl = :public_read 

dans la tâche de râteau, mais il ne semble pas prendre effet. Il me manque quelque chose, il doit y avoir une façon ou l'autre de mettre un drapeau en écriture pour le rendre public, ou peut-être, je ne l'initialise pas correctement.

Répondre