S3에서 10,000 개의 파일을 공개하는 방법


92

10,000 개의 파일이있는 버킷에 폴더가 있습니다. 업로드하여 즉시 공개 할 방법이없는 것 같습니다. 그래서 나는 그것들을 모두 업로드했고, 그것들은 비공개이며, 모두 공개해야합니다.

aws 콘솔을 사용해 보았지만 오류가 발생합니다 (파일이 적은 폴더에서는 잘 작동 함).

Firefox에서 S3 구성을 사용해 보았습니다.

이 모든 것을 공개하기 위해 실행할 수있는 소프트웨어 나 스크립트가 있습니까?


4
내가 시도한 모든 도구가 충돌했기 때문에 몇 시간이 걸리고 버킷의 모든 객체를 반복하여 공개하는 PHP 스크립트를 작성했습니다.
— PeterV

답변:


119

버킷의 모든 파일에 대한 액세스 권한을 부여하는 버킷 정책 (아래 예 참조)을 생성 할 수 있습니다. 버킷 정책은 AWS 콘솔을 통해 버킷에 추가 할 수 있습니다.

{
    "Id": "...",
    "Statement": [ {
        "Sid": "...",
        "Action": [
            "s3:GetObject"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::bucket/*",
        "Principal": {
            "AWS": [ "*" ]
        }
    } ]
}

Amazon에서 제공하는 다음 정책 생성기 도구도 살펴보십시오.

http://awspolicygen.s3.amazonaws.com/policygen.html


5
이것은 나를 위해 작동하지 않았습니다. 일부 객체는 버킷 정책이 적용 되어도 여전히 '액세스 거부'응답을 반환합니다. 버킷 이름 만 변경하여 위에서 복사하여 붙여 넣습니다. 나는 좀 자극적 ... 모두 130 만 개체를 통해 루프하는 스크립트를 작성하는 그것의 시간을 추측
— 블레이크 밀러

"bucket"을 버킷 이름으로 변경해야합니다
— karnage

11
나는 이런 식으로해야하는 것을 분개한다. 그것은 추악한 JSON입니다.
— superluminary

6
그냥 참고 : 그것은 명백한 보일지도 모르지만, 당신은 또한 특정의 액세스를 제한하도록 선택할 수 폴더 : bucket/avatars/*. 합니다 (잊지 마세요 *말에 나는 내가 잠시 동안 빙빙 실행했다..)
— bschaeffer

2
@Benjamin 모든 사람의 보안 요구 사항이 다르기 때문에 "기본"구성은 다른 사람에게 적합하지 않습니다. AWS는 이러한 정책을 사용자 지정하는 일관된 방법을 제공합니다. 따라서 보안 정책을 제대로 배우는 데 시간을 할애해야하며 몇 줄의 간단한 JSON에서 벗어나지 않아야합니다.
— afilina dec

69

처음으로 업로드하는 경우 명령 줄에서 업로드시 파일을 공개로 설정할 수 있습니다.

aws s3 sync . s3://my-bucket/path --acl public-read

AWS 명령 줄 인터페이스와 함께 고급 s3 명령 사용에 설명 된대로

불행히도 파일이 업로드 될 때만 ACL을 적용합니다. 내 테스트에서는 이미 업로드 된 파일에 ACL을 적용하지 않습니다.

기존 객체를 업데이트하려는 경우 버킷을 자체적으로 동기화 할 수 있었지만 작동이 중지 된 것 같습니다.

[더 이상 작동하지 않음]이 작업은 명령 줄에서 수행 할 수 있습니다.

aws s3 sync s3://my-bucket/path s3://my-bucket/path --acl public-read

(따라서 이것은 더 이상 질문에 대한 답변이 아니지만 예전에 작동했던 것처럼 참조를 위해 답변을 남깁니다.)


이 명령이 이미 업로드되었지만 아직 공개되지 않은 파일에 영향을 줍니까?
— Alston

10
테스트했을 때 새로 동기화 된 파일에만 ACL을 추가하는 것 같습니다.
— 데이비드 Roussel은

다시 해주셔서 감사합니다. 업로드 된 파일의 권한을 일괄 변경하는 방법이 있습니까?
— Alston

오, 당연합니다. 나는 이것에 혼란 스러웠다. 명확히 해주셔서 정말 감사합니다.
— Sridhar Sarnobat

기존 파일을 변경하는 방법을 포함하도록 답변이 업데이트되었습니다.
— David Roussel

34

수십만 개의 물건을 바꿔야했습니다. 이를 실행하기 위해 EC2 인스턴스를 실행하여 모든 작업이 더 빨라졌습니다. aws-sdk먼저 gem 을 설치하고 싶을 것 입니다.

코드는 다음과 같습니다.

require 'rubygems'
require 'aws-sdk'


# Change this stuff.
AWS.config({
    :access_key_id => 'YOURS_HERE',
    :secret_access_key => 'YOURS_HERE',
})
bucket_name = 'YOUR_BUCKET_NAME'


s3 = AWS::S3.new()
bucket = s3.buckets[bucket_name]
bucket.objects.each do |object|
    puts object.key
    object.acl = :public_read
end

1
간단한 방법은 처음에 public_read 플래그를 설정하여 업로드하는 것이지만 실패하면 좋은 옵션입니다.
— superluminary 2013

이 코드가 잘린가 오래된되고, 내 참조 대답
— ksarunas

26

새 버전의 SDK가 나오기 때문에 @DanielVonFange의 솔루션이 오래되었습니다.

AWS Ruby SDK를 사용하여 지금 저에게 적합한 코드 조각 추가 :

require 'aws-sdk'

Aws.config.update({
  region: 'REGION_CODE_HERE',
  credentials: Aws::Credentials.new(
    'ACCESS_KEY_ID_HERE',
    'SECRET_ACCESS_KEY_HERE'
  )
})
bucket_name = 'BUCKET_NAME_HERE'

s3 = Aws::S3::Resource.new
s3.bucket(bucket_name).objects.each do |object|
  puts object.key
  object.acl.put({ acl: 'public-read' })
end

1
환상적인 대답 - 내가 꽉 자리에 필요한 단지 스크립트
— Phantomwhale

@ksarunas 제 경우에는 공개를 비공개 권한으로 변경해야하므로 public-read를 비공개로 바꾸고 액세스가 변경되었지만 여전히 URL에 액세스 할 수 있습니까?
— Rahul

19

새 S3 콘솔을 사용하여 폴더를 선택 Make public하고 폴더 내의 모든 파일을 공개하도록 선택할 수 있습니다. 백그라운드 작업으로 작동하므로 여러 파일을 처리해야합니다.

공개하자


5
불행히도 시간이 오래 걸리고 명령이 실행되는 동안 브라우저를 닫을 수 없습니다. 귀하의 브라우저는 각 파일에 대해 2 개의 요청을 보내고 있습니다. 제 경우에는 두 개의 요청에 500ms가 걸렸습니다. 당신은 많은 파일이있는 경우는 (= 시간이 오래 걸릴 수 있습니다
— Herlon Aguiar에게

2
그리고 또 다른 문제가 있습니다. 이것은 완전히 공개 될 것입니다. 공개 읽기 액세스 만 원하는 경우 문제가됩니다.
— Marcelo Agimóvel 2018

매우주의하십시오-저는 이것을 공개적으로 만들었고 팝업되는 "진행률 표시 줄"이 너무 미묘해서 끝났다고 생각했습니다. Make Public을 클릭하고 작은 미묘한 "진행률 표시 줄이 나타납니다."라는 사실을 깨닫기 전에 확인하고 한 시간을 보냈습니다. . 지금 실행 중입니다. 매우 빠릅니다. 120k 이미지의 경우 20 분 정도
— Scott

11

CLI 사용 :

aws s3 ls s3://bucket-name --recursive > all_files.txt && grep .jpg all_files.txt > files.txt && cat files.txt | awk '{cmd="aws s3api put-object-acl --acl public-read --bucket bucket-name --key "$4;system(cmd)}'


3
모든 files.txt로 디스크에 쓰는 대신 파이프를 grep에 사용할 수 없습니까? 이것은 될 수 있습니다aws s3 ls s3://bucket-name --recursive | grep .jpg | awk '{cmd="aws s3api put-object-acl --acl public-read --bucket bucket-name --key "$4;system(cmd)}'
— sakurashinken

3

이것이 나 자신이 필요했지만 파일 수가 많으면 직렬로 처리하는 것이 느려집니다. 그래서 iron.io 의 IronWorker 서비스 에서이를 수행 하는 스크립트 를 작성 했습니다 . 매달 500 시간의 무료 컴퓨팅 시간은 큰 버킷도 처리하기에 충분합니다 (가격이 합리적 일 경우). 병렬로 수행되기 때문에 내가 가지고있는 32,000 개의 개체에 대해 1 분 이내에 완료됩니다. 또한 서버가 EC2에서 실행되므로 작업과 S3 간의 통신이 빠르다고 생각합니다.

누구나 내 스크립트를 자신의 필요에 맞게 사용할 수 있습니다.


2

BucketExplorer 를 살펴보면 대량 작업을 매우 잘 관리하고 견고한 S3 클라이언트입니다.


3
이제 정보 팔레트를 통해 Cyberduck (무료)에서 권한을 대량으로 변경할 수도 있습니다.
— Taylor Edmiston

BucketExplorer는 모든 버킷을 나열 할 권한이있는 경우에만 유용합니다. 이 작업에 CLI 또는 SDK를 사용하고 사용자에게 제한된 권한을 남겨 두는 것이 훨씬 좋습니다.
— perilandmishap 17:07에

0

당신은 그들이 공개적으로 기본 동작을 읽도록 만들 것이라고 생각할 것입니다. 그렇지 않습니까? :) C # 솔루션에서 S3와 상호 작용하는 사용자 지정 API를 구축하는 동안 좌절감을 공유했습니다. 다음은 S3 객체를 업로드하고 기본적으로 공개 읽기 액세스로 설정하는 코드입니다.

public void Put(string bucketName, string id, byte[] bytes, string contentType, S3ACLType acl) {
     string uri = String.Format("https://{0}/{1}", BASE_SERVICE_URL, bucketName.ToLower());
     DreamMessage msg = DreamMessage.Ok(MimeType.BINARY, bytes);
     msg.Headers[DreamHeaders.CONTENT_TYPE] = contentType;
     msg.Headers[DreamHeaders.EXPECT] = "100-continue";
     msg.Headers[AWS_ACL_HEADER] = ToACLString(acl);
     try {
        Plug s3Client = Plug.New(uri).WithPreHandler(S3AuthenticationHeader);
        s3Client.At(id).Put(msg);
     } catch (Exception ex) {
        throw new ApplicationException(String.Format("S3 upload error: {0}", ex.Message));
     }
}

ToACLString (acl) 함수는 public-read를 반환 하고 BASE_SERVICE_URL은 s3.amazonaws.com 이고 AWS_ACL_HEADER 상수는 x-amz-acl 입니다. http 커뮤니케이션을 간소화하기 위해 Dream 프레임 워크를 사용하고 있으므로 플러그 및 DreamMessage 관련 내용이 이상하게 보일 것입니다. 기본적으로 우리는 지정된 헤더와 aws 사양 별 특수 헤더 서명을 사용하여 http PUT를 수행하고 있습니다 ( 권한 헤더를 구성하는 방법에 대한 예제 는 aws 문서 의이 페이지 참조 ).

기존 1000 개 객체 ACL을 변경하려면 스크립트를 작성할 수 있지만 GUI 도구를 사용하여 즉각적인 문제를 해결하는 것이 더 쉬울 것입니다. 지금까지 제가 사용한 최고의 제품 은 S3 용 클라우드 베리 라는 회사의 제품입니다 . 적어도 하나의 제품에 대해 15 일 무료 평가판이있는 것 같습니다. 한 번에 여러 개체를 선택하고 컨텍스트 메뉴를 통해 ACL을 공개로 설정할 수 있다는 것을 방금 확인했습니다. 클라우드를 즐기십시오!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.