Cách đặt 10.000 tệp trong S3 ở chế độ công khai


92

Tôi có một thư mục trong một nhóm với 10.000 tệp. Dường như không có cách nào để tải chúng lên và công khai chúng ngay lập tức. Vì vậy, tôi đã tải lên tất cả, chúng ở chế độ riêng tư và tôi cần đặt chúng ở chế độ công khai.

Tôi đã thử bảng điều khiển aws, nó chỉ báo lỗi (hoạt động tốt với các thư mục có ít tệp hơn).

Tôi đã thử sử dụng tổ chức S3 trong Firefox, điều tương tự.

Có phần mềm hoặc tập lệnh nào đó mà tôi có thể chạy để công khai tất cả những thứ này không?


4
Mọi công cụ tôi đã thử đều bị lỗi, vì vậy tôi đã viết một tập lệnh PHP mất vài giờ và chỉ lặp qua mọi đối tượng trong thùng và đặt nó ở chế độ công khai.
PeterV

Câu trả lời:


119

Bạn có thể tạo chính sách nhóm (xem ví dụ bên dưới) để cấp quyền truy cập vào tất cả các tệp trong nhóm. Chính sách nhóm có thể được thêm vào nhóm thông qua bảng điều khiển AWS.

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

Cũng xem xét công cụ tạo chính sách sau do Amazon cung cấp.

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


5
Điều này đã không làm việc cho tôi. Một số đối tượng vẫn đang trả lại phản hồi 'quyền truy cập bị từ chối' ngay cả khi có chính sách thùng. Nó được sao chép từ phía trên với chỉ tên nhóm được thay đổi. Tôi đoán đó là thời gian để viết một kịch bản để lặp qua tất cả 1,3 triệu đối tượng ... kinda khó chịu
Blake Miller

bạn cần phải thay đổi "xô" vào tên của bạn xô
karnage

11
Tôi bực bội khi phải làm theo cách này. Đó là một số JSON xấu xí.
siêu thường

6
Chỉ cần một lưu ý: Nó có vẻ hiển nhiên, nhưng bạn cũng có thể chọn để truy cập giới hạn cụ thể thư mục : bucket/avatars/*. (Đừng quên *ở cuối tôi và tôi chạy vòng vòng trong một thời gian..)
bschaeffer

2
@Benjamin Cấu hình "cơ bản" đối với bạn là gì thì không phù hợp với những người khác, vì yêu cầu bảo mật của mọi người là khác nhau. AWS cung cấp một cách thống nhất để tùy chỉnh các chính sách này. Do đó, người ta phải dành thời gian để tìm hiểu các chính sách bảo mật đúng cách và không né tránh một vài dòng JSON đơn giản.
afilina

69

Nếu bạn đang tải lên lần đầu tiên, bạn có thể đặt các tệp ở chế độ công khai khi tải lên trên dòng lệnh:

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

Như đã nêu trong Sử dụng Lệnh s3 Cấp cao với Giao diện Dòng lệnh AWS

Thật không may, nó chỉ áp dụng ACL khi các tệp được tải lên. Nó không (trong thử nghiệm của tôi) áp dụng ACL cho các tệp đã được tải lên.

Nếu bạn muốn cập nhật các đối tượng hiện có, bạn đã từng có thể đồng bộ nhóm với chính nó, nhưng điều này dường như đã ngừng hoạt động.

[Không hoạt động nữa] Điều này có thể được thực hiện từ dòng lệnh:

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

(Vì vậy, điều này không còn trả lời câu hỏi, nhưng để lại câu trả lời để tham khảo như nó đã từng hoạt động.)


Lệnh này có hiệu lực trên các tệp đã được tải lên nhưng chưa được đọc công khai không?
Alston

10
Khi tôi kiểm tra nó, nó dường như chỉ thêm ACL vào các tệp mới được đồng bộ hóa.
David Roussel

Cảm ơn bạn đã phát lại, tôi cũng đã thử nghiệm nó. Có cách nào để thay đổi hàng loạt quyền của các tệp đã tải lên không?
Alston

Ồ, không có gì lạ. Tôi đã bối rối vì điều này. Thực sự đánh giá cao bạn làm rõ.
Sridhar Sarnobat

Đã cập nhật câu trả lời để bao gồm cách thay đổi các tệp hiện có.
David Roussel

34

Tôi đã phải thay đổi vài trăm nghìn đồ vật. Tôi đã kích hoạt một phiên bản EC2 để chạy nó, điều này làm cho tất cả diễn ra nhanh hơn. Bạn sẽ muốn cài đặt aws-sdkgem trước.

Đây là mã:

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
Cách đơn giản là tải chúng lên với cờ public_read được đặt ngay từ đầu, nhưng nếu không, đây là một lựa chọn tốt.
siêu thường

Snipped mã này là lỗi thời, tham khảo của tôi câu trả lời
ksarunas

26

Tôi gặp vấn đề tương tự, giải pháp của @DanielVonFange đã lỗi thời vì phiên bản SDK mới đã ra đời.

Thêm đoạn mã phù hợp với tôi ngay bây giờ với 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
Fantastic câu trả lời - chỉ là kịch bản tôi cần thiết trong hoàn cảnh hiểm nghèo
Phantomwhale

@ksarunas Trong trường hợp của tôi, tôi cần thay đổi quyền công khai thành riêng tư, vì vậy hãy thay quyền đọc công khai bằng riêng tư và quyền truy cập đã được thay đổi nhưng tôi vẫn có thể truy cập URL?
Rahul

19

Chỉ muốn thêm điều đó với Bảng điều khiển S3 mới, bạn có thể chọn (các) thư mục của mình và chọn Make publicđặt tất cả các tệp bên trong các thư mục ở chế độ công khai. Nó hoạt động như một tác vụ nền vì vậy nó sẽ xử lý bất kỳ số lượng tệp nào.

Công bố công khai


5
Thật không may, nó mất nhiều thời gian và bạn không thể đóng trình duyệt trong khi lệnh đang chạy. Trình duyệt của bạn đang gửi 2 yêu cầu cho mỗi tệp, trong trường hợp của tôi, hai yêu cầu mất 500ms. Nếu bạn có rất nhiều các tập tin nó sẽ mất một thời gian dài = (
Herlon Aguiar

2
Và, có một vấn đề khác: điều này sẽ được công khai hoàn toàn. Nếu bạn chỉ muốn truy cập đọc công khai, đó là một vấn đề.
Marcelo Agimóvel,

RẤT HIỂU BIẾT - Tôi đã làm Điều này ở chế độ Công khai và "thanh tiến trình" bật lên rất tinh vi, tôi nghĩ rằng nó đã được thực hiện. Tôi đã kiểm tra và có lẽ đã dành một giờ để làm việc này trước khi tôi nhận ra rằng bạn nhấp vào Đặt ở chế độ công khai và "thanh tiến trình hiển thị" ... grrr ... vì tôi đã đóng cửa sổ trình duyệt khoảng 10 lần, tôi cho rằng điều đó đã giết chết nó mỗi lần . Tôi đang chạy nó bây giờ - nó khá nhanh - có thể 20 phút cho 120k hình ảnh
Scott

11

Sử dụng 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
bạn không thể chỉ sử dụng một đường dẫn để grep thay vì ghi vào đĩa với tất cả files.txt? Điều này có thể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

Bản thân tôi đã cần điều này nhưng số lượng tệp làm cho nó CÓ THỂ làm chậm theo thứ tự. Vì vậy, tôi đã viết một kịch bản nào đó trên iron.io 's ironworker dịch vụ. 500 giờ máy tính miễn phí mỗi tháng của họ đủ để xử lý ngay cả những nhóm lớn (và nếu bạn vượt quá mức giá đó là hợp lý). Vì nó được thực hiện song song nên nó hoàn thành trong vòng chưa đầy một phút cho 32.000 đối tượng mà tôi có. Ngoài ra, tôi tin rằng máy chủ của họ chạy trên EC2 nên giao tiếp giữa công việc và S3 rất nhanh chóng.

Bất kỳ ai cũng được hoan nghênh sử dụng kịch bản của tôi cho nhu cầu của riêng họ.


2

Hãy xem BucketExplorer, nó quản lý các hoạt động hàng loạt rất tốt và là một Ứng dụng khách S3 vững chắc.


3
Giờ đây, cũng có thể thay đổi hàng loạt quyền trong Cyberduck (miễn phí) thông qua bảng Thông tin.
Taylor Edmiston

BucketExplorer chỉ hữu ích nếu bạn có quyền liệt kê tất cả các nhóm. Tốt hơn nhiều nếu sử dụng CLI hoặc SDK cho hoạt động này và để lại cho người dùng của bạn các quyền hạn chế.
perilandmishap

0

Bạn sẽ nghĩ rằng họ sẽ công khai đọc hành vi mặc định, phải không? :) Tôi đã chia sẻ sự thất vọng của bạn khi xây dựng một API tùy chỉnh để giao diện với S3 từ giải pháp C #. Đây là đoạn mã hoàn thành việc tải lên một đối tượng S3 và đặt nó thành quyền truy cập đọc công khai theo mặc định:

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));
     }
}

Hàm ToACLString (acl) trả về public-read , BASE_SERVICE_URL là s3.amazonaws.com và hằng số AWS_ACL_HEADER là x-amz-acl . Trình cắm và nội dung DreamMessage có thể trông lạ lẫm đối với bạn vì chúng tôi đang sử dụng khung công tác Dream để hợp lý hóa liên lạc http của chúng tôi. Về cơ bản, chúng tôi đang thực hiện một http PUT với các tiêu đề được chỉ định và chữ ký tiêu đề đặc biệt theo thông số kỹ thuật aws (xem trang này trong tài liệu aws để biết các ví dụ về cách tạo tiêu đề ủy quyền).

Để thay đổi 1000 ACL đối tượng hiện có, bạn có thể viết một tập lệnh nhưng có thể dễ dàng hơn khi sử dụng công cụ GUI để khắc phục sự cố ngay lập tức. Điều tốt nhất tôi đã sử dụng cho đến nay là từ một công ty có tên cloudberry cho S3; có vẻ như họ có 15 ngày dùng thử miễn phí cho ít nhất một trong các sản phẩm của họ. Tôi vừa xác minh rằng nó sẽ cho phép bạn chọn nhiều đối tượng cùng một lúc và đặt ACL của chúng thành công khai thông qua menu ngữ cảnh. Tận hưởng đám mây!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.