10,000 개의 파일이있는 버킷에 폴더가 있습니다. 업로드하여 즉시 공개 할 방법이없는 것 같습니다. 그래서 나는 그것들을 모두 업로드했고, 그것들은 비공개이며, 모두 공개해야합니다.
aws 콘솔을 사용해 보았지만 오류가 발생합니다 (파일이 적은 폴더에서는 잘 작동 함).
Firefox에서 S3 구성을 사용해 보았습니다.
이 모든 것을 공개하기 위해 실행할 수있는 소프트웨어 나 스크립트가 있습니까?
10,000 개의 파일이있는 버킷에 폴더가 있습니다. 업로드하여 즉시 공개 할 방법이없는 것 같습니다. 그래서 나는 그것들을 모두 업로드했고, 그것들은 비공개이며, 모두 공개해야합니다.
aws 콘솔을 사용해 보았지만 오류가 발생합니다 (파일이 적은 폴더에서는 잘 작동 함).
Firefox에서 S3 구성을 사용해 보았습니다.
이 모든 것을 공개하기 위해 실행할 수있는 소프트웨어 나 스크립트가 있습니까?
답변:
버킷의 모든 파일에 대한 액세스 권한을 부여하는 버킷 정책 (아래 예 참조)을 생성 할 수 있습니다. 버킷 정책은 AWS 콘솔을 통해 버킷에 추가 할 수 있습니다.
{
"Id": "...",
"Statement": [ {
"Sid": "...",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::bucket/*",
"Principal": {
"AWS": [ "*" ]
}
} ]
}
Amazon에서 제공하는 다음 정책 생성기 도구도 살펴보십시오.
bucket/avatars/*
. 합니다 (잊지 마세요 *
말에 나는 내가 잠시 동안 빙빙 실행했다..)
처음으로 업로드하는 경우 명령 줄에서 업로드시 파일을 공개로 설정할 수 있습니다.
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
(따라서 이것은 더 이상 질문에 대한 답변이 아니지만 예전에 작동했던 것처럼 참조를 위해 답변을 남깁니다.)
수십만 개의 물건을 바꿔야했습니다. 이를 실행하기 위해 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
새 버전의 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
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)}'
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)}'
이것이 나 자신이 필요했지만 파일 수가 많으면 직렬로 처리하는 것이 느려집니다. 그래서 iron.io 의 IronWorker 서비스 에서이를 수행 하는 스크립트 를 작성 했습니다 . 매달 500 시간의 무료 컴퓨팅 시간은 큰 버킷도 처리하기에 충분합니다 (가격이 합리적 일 경우). 병렬로 수행되기 때문에 내가 가지고있는 32,000 개의 개체에 대해 1 분 이내에 완료됩니다. 또한 서버가 EC2에서 실행되므로 작업과 S3 간의 통신이 빠르다고 생각합니다.
누구나 내 스크립트를 자신의 필요에 맞게 사용할 수 있습니다.
BucketExplorer 를 살펴보면 대량 작업을 매우 잘 관리하고 견고한 S3 클라이언트입니다.
당신은 그들이 공개적으로 기본 동작을 읽도록 만들 것이라고 생각할 것입니다. 그렇지 않습니까? :) 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을 공개로 설정할 수 있다는 것을 방금 확인했습니다. 클라우드를 즐기십시오!