S3에서 10,000 개의 파일을 공개하는 방법
10,000 개의 파일이있는 버킷에 폴더가 있습니다. 업로드하여 즉시 공개 할 방법이없는 것 같습니다. 그래서 나는 그것들을 모두 업로드했고, 그것들은 비공개이며, 모두 공개해야합니다.
aws 콘솔을 사용해 보았지만 오류가 발생합니다 (파일이 적은 폴더에서 잘 작동합니다).
Firefox에서 S3 구성을 사용해 보았습니다.
이 모든 것을 공개하기 위해 실행할 수있는 소프트웨어 나 스크립트가 있습니까?
버킷의 모든 파일에 대한 액세스 권한을 부여하는 버킷 정책 (아래 예 참조)을 생성 할 수 있습니다. 버킷 정책은 AWS 콘솔을 통해 버킷에 추가 할 수 있습니다.
{
"Id": "...",
"Statement": [ {
"Sid": "...",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::bucket/*",
"Principal": {
"AWS": [ "*" ]
}
} ]
}
Amazon에서 제공하는 다음 정책 생성기 도구도 살펴보십시오.
http://awspolicygen.s3.amazonaws.com/policygen.html
처음으로 업로드하는 경우 명령 줄에서 업로드시 파일을 공개로 설정할 수 있습니다.
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의 솔루션이 오래되었습니다.
Adding code snippet that works for me right now with 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
Just wanted to add that with the new S3 Console you can select your folder(s) and select Make public
to make all files inside the folders public. It works as a background task so it should handle any number of files.
Using the 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)}'
Have a look at BucketExplorer it manages bulk operations very well and is a solid S3 Client.
Had this need myself but the number of files makes it WAY to slow to do in serial. So I wrote a script that does it on iron.io's IronWorker service. Their 500 free compute hours per month are enough to handle even large buckets (and if you do exceed that the pricing is reasonable). Since it is done in parallel it completes in less than a minute for the 32,000 objects I had. Also I believe their servers run on EC2 so the communication between the job and S3 is quick.
Anybody is welcome to use my script for their own needs.
You would think they would make public read the default behavior, wouldn't you? : ) I shared your frustration while building a custom API to interface with S3 from a C# solution. Here is the snippet that accomplishes uploading an S3 object and setting it to public-read access by default:
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));
}
}
The ToACLString(acl) function returns public-read, BASE_SERVICE_URL is s3.amazonaws.com and the AWS_ACL_HEADER constant is x-amz-acl. The plug and DreamMessage stuff will likely look strange to you as we're using the Dream framework to streamline our http communications. Essentially we're doing an http PUT with the specified headers and a special header signature per aws specifications (see this page in the aws docs for examples of how to construct the authorization header).
To change an existing 1000 object ACLs you could write a script but it's probably easier to use a GUI tool to fix the immediate issue. The best I've used so far is from a company called cloudberry for S3; it looks like they have a free 15 day trial for at least one of their products. I've just verified that it will allow you to select multiple objects at once and set their ACL to public through the context menu. Enjoy the cloud!
참고URL : https://stackoverflow.com/questions/3142388/how-to-make-10-000-files-in-s3-public
'Development Tip' 카테고리의 다른 글
자바 : 텍스트 파일 읽는 방법 (0) | 2020.09.25 |
---|---|
WebView에서 스크롤을 비활성화 하시겠습니까? (0) | 2020.09.25 |
Solarized를 사용하는 iTerm2의 vim에서 잘못된 색상 (0) | 2020.09.25 |
VS2017 / VS 2019 작업 표시 줄에서 관리자 권한으로 실행 (0) | 2020.09.25 |
Windows에서 GPG 파일을 해독하기 위해 개인 / 비밀 ASC 키를 내보내는 방법 (0) | 2020.09.25 |