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.ioIronWorker 서비스 에서이를 수행 하는 스크립트 를 작성 했습니다 . 매달 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.