Rubby: AWS 3이 있는 파일을 다른 통에 모아 복사하는 방법

5481 단어 AWSRuby
다음은 Ruby를 사용하여 AWS S3이 있는 장소의 파일을 다른 통에 모아 복제하는 방법입니다.

컨디션


Rails 중 하나로 해냈지만 Rails 없이도 가능하다.
  • Rails 6.0.2.1
  • Ruby 2.6.5
  • Gem aws-sdk-s3 1.60.1
  • 하고 싶은 일.


    S3의 bucket/folder에 있는 모든 파일another_bucket/folder을 구조를 유지한 상태로 복사하고 싶습니다.

    절차.


    복사할 때 사용하는 프로그램을 소개합니다.
    Rails 중 하나로 완료되었습니다.bundle add aws-sdk-s3를 실행하고 AWS의 SDK를 추가합니다.
    # S3 SDK reference: https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Client.html
    require 'uri'
    
    namespace :s3 do
      namespace :something do
        task copy: :environment do
          s3_client = build_s3_client
          copy_bucket_to_bucket(s3_client, 'bucket', 'another_bucket', 'folder/')
        end
      end
    
      def build_s3_client
        Aws::S3::Client.new(
          access_key_id: Rails.configuration.x.s3_user.access_key,
          secret_access_key: Rails.configuration.x.s3_user.access_secret,
          region: 'ap-northeast-1'
        )
      end
    
      # @param [Aws::S3::Client] s3_client
      # @param [String] source_bucket
      # @param [String] destination_bucket
      # @param, [String] prefix
      def copy_bucket_to_bucket(s3_client, source_bucket, destination_bucket, prefix = '')
        s3_client.list_objects(bucket: source_bucket, prefix: prefix).to_h[:contents].each do |object|
          puts "copy #{object[:key]}"
          option = {
            #acl: 'public-read',
            bucket: destination_bucket,
            copy_source: URI::encode("/#{source_bucket}/" << object[:key]),
            key: object[:key],
          }
          s3_client.copy_object(option)
        end
      end
    end
    
    copy_bucket_to_bucket 실제로 S3 내에서 복제하는 방법

    주의


    기본 Bucket을 설정하면 Access Denied 오류acl: 'public-read',가 발생합니다.
    다음 그림과 같이 Bucket 설정에서 두 개의 확인란을 닫을 때acl: 'public-read' 사용할 수 있습니다.

    좋은 웹페이지 즐겨찾기