S3에서 대용량 파일의 메타데이터 덮어쓰기

7684 단어 AWSRubyAPItech

배경.


식단을 연구하다에서 이미지를 S3에 놓고 Cloudflare(CDN) 캐시로 Cache-Controlmax-age를 한 달로 설정합니다.CDN에 있어서 더 빠른 캐시로 전송량을 절약하기 위해max-age를 1년의 기분으로 설정하고 싶다.
S3에서 기존 메타데이터를 다시 쓸 수 없기 때문에copy-object로 덮어쓰고 복사한 다음 새 메타데이터를 설정합니다.극소수의 경우 콘솔이나 aws 지령을 사용할 수 있지만 대량의 지령이 있으면 차단하지 않기 때문에 AWS의 API를 직접 두드리기로 했다.aws 명령 호출 시 성능이 나타나지 않음) 이하는 * 입니다.webp, *.jpg, *.pngCache-Control의 예를 다시 쓰다.
총 64개의 파일이 실행됐으며 약 215만 개의 파일은 5500초에 처리할 수 있다.그러고도 아무런 착오가 없었던 AWS는 역시.참고로 COPY의 요구는 1000개의 점방이고 비용은 0.0047달러이기 때문에 10개의 USD가 필요하다.
야옹

루비 스크립트


필요aws-sdk-s3,parallel,dotenv,gem로 입력하거나 Bundler를 사용합니다.
#! /usr/bin/env ruby

require "dotenv"
require "aws-sdk-s3"
require "parallel"

Dotenv.load

pp ENV["ASSETS_HOST"]

list_file = ARGV.shift
fh = File.open(list_file)

puts Time.now.iso8601(6)

Parallel.each_with_index(fh.each_line, in_threads: 64) do |line, index|
  next unless line =~ /\.(?:webp|jpeg|png)/
  path = line.chomp.sub(/.* /, "")
  ext = path.sub(/.*\./, "")
  s3 = Aws::S3::Client.new

  begin
    s3.copy_object(
      bucket: ENV["ASSETS_HOST"],
      copy_source: "/#{ENV['ASSETS_HOST']}/#{path}",
      key: path,
      content_type: "image/#{ext}",
      cache_control: "public, max-age=31536000",
      metadata_directive: "REPLACE"
    )
  rescue Aws::Errors::ServiceError => error
    pp [path, index, error]
  end

  pp [path, index, Time.now.iso8601(6)] if index%10000 == 0
end

puts Time.now.iso8601(6)

사용법

  • 는 환경 변수AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,AWS_REGION 또는 ASSETS_HOST를 설정한다.쓰기 env

  • 결과를 서류에 떨어뜨리다.(API로 받아서 순서대로 처리해도 되지만 중도에 실패하면 곤란합니다.)
    aws s3 ls --recuesive s3://$ASSET_HOST > s3.list
    
  • 스크립트에 서류를 일람해 주다.
    ruby update-max-age.rb s3.list
    

    좋은 웹페이지 즐겨찾기