Bagaimana cara membuat semua Objek di ember AWS S3 publik secara default?


151

Saya menggunakan perpustakaan PHP untuk mengunggah file ke ember saya. Saya telah mengatur ACL ke publik-baca-tulis dan berfungsi baik tetapi file tersebut masih pribadi.

Saya menemukan bahwa jika saya mengubah Penerima Hibah ke Semua Orang, ini membuat file menjadi publik. Yang ingin saya ketahui adalah bagaimana cara membuat Penerima Default pada semua objek di keranjang saya untuk disetel ke "Semua Orang" . Atau apakah ada solusi lain untuk membuat file publik secara default?

Kode yang saya gunakan adalah di bawah ini:

public static function putObject($input, $bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $requestHeaders = array()) {
    if ($input === false) return false;
    $rest = new S3Request('PUT', $bucket, $uri);

    if (is_string($input)) $input = array(
        'data' => $input, 'size' => strlen($input),
        'md5sum' => base64_encode(md5($input, true))
    );

    // Data
    if (isset($input['fp']))
        $rest->fp =& $input['fp'];
    elseif (isset($input['file']))
        $rest->fp = @fopen($input['file'], 'rb');
    elseif (isset($input['data']))
        $rest->data = $input['data'];

    // Content-Length (required)
    if (isset($input['size']) && $input['size'] >= 0)
        $rest->size = $input['size'];
    else {
        if (isset($input['file']))
            $rest->size = filesize($input['file']);
        elseif (isset($input['data']))
            $rest->size = strlen($input['data']);
    }

    // Custom request headers (Content-Type, Content-Disposition, Content-Encoding)
    if (is_array($requestHeaders))
        foreach ($requestHeaders as $h => $v) $rest->setHeader($h, $v);
    elseif (is_string($requestHeaders)) // Support for legacy contentType parameter
        $input['type'] = $requestHeaders;

    // Content-Type
    if (!isset($input['type'])) {
        if (isset($requestHeaders['Content-Type']))
            $input['type'] =& $requestHeaders['Content-Type'];
        elseif (isset($input['file']))
            $input['type'] = self::__getMimeType($input['file']);
        else
            $input['type'] = 'application/octet-stream';
    }

    // We need to post with Content-Length and Content-Type, MD5 is optional
    if ($rest->size >= 0 && ($rest->fp !== false || $rest->data !== false)) {
        $rest->setHeader('Content-Type', $input['type']);
        if (isset($input['md5sum'])) $rest->setHeader('Content-MD5', $input['md5sum']);

        $rest->setAmzHeader('x-amz-acl', $acl);
        foreach ($metaHeaders as $h => $v) $rest->setAmzHeader('x-amz-meta-'.$h, $v);
        $rest->getResponse();
    } else
        $rest->response->error = array('code' => 0, 'message' => 'Missing input parameters');

    if ($rest->response->error === false && $rest->response->code !== 200)
        $rest->response->error = array('code' => $rest->response->code, 'message' => 'Unexpected HTTP status');
    if ($rest->response->error !== false) {
        trigger_error(sprintf("S3::putObject(): [%s] %s", $rest->response->error['code'], $rest->response->error['message']), E_USER_WARNING);
        return false;
    }
    return true;
}

Jawaban:


299

Pergi ke http://awspolicygen.s3.amazonaws.com/policygen.html Isi rincian seperti: masukkan deskripsi gambar di sini Dalam Tindakan pilih "GetObject" Pilih "Tambah Pernyataan" Lalu pilih "Hasilkan Kebijakan"

Salin contoh teks:

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

Sekarang, masuklah ke konsol AWS S3 Anda, Pada level bucket, klik Properties, Expand Izin, lalu Pilih Tambahkan kebijakan bucket. Rekatkan kode yang dibuat di atas ke editor dan tekan save.

Semua item Anda di ember akan publik secara default.


8
Ini jawaban yang benar. Tidak seperti jawaban sebelumnya, posting ini juga mengajari saya cara membuat kebijakan dan apa yang mereka lakukan. Setelah membaca ini saya dapat menulis kebijakan secara manual.
Jason Cheladyn

2
Saya memutakhirkan jawaban ini untuk alasan yang sama dengan @liyicky, instruksi terperincinya adalah pengantar yang bagus dan bukan hanya diserahkan jawabannya.
brendo

Sama disini. AWS cenderung buram di kali dan mungkin karena alasan yang sangat bagus. Bentuk jawaban ini membantu mulai dari nol.
Jerome

Ini berfungsi saat Anda menambahkan file baru ke bucket, tetapi saya perlu mengubah file yang sudah ada di bucket untuk menjadi publik.
Radenko Zec

137

Jika Anda ingin menjadikan semua objek publik secara default, cara termudah adalah melakukannya melalui Kebijakan Bucket alih-alih Daftar Kontrol Akses (ACL) yang ditentukan pada masing-masing objek.

masukkan deskripsi gambar di sini

Anda dapat menggunakan Pembuat Kebijakan AWS untuk menghasilkan kebijakan ember untuk ember Anda.

Misalnya, kebijakan berikut akan memungkinkan siapa saja untuk membaca setiap objek di bucket S3 Anda (cukup ganti <bucket-name>dengan nama bucket Anda):

{
  "Id": "Policy1380877762691",
  "Statement": [
    {
      "Sid": "Stmt1380877761162",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::<bucket-name>/*",
      "Principal": {
        "AWS": [
          "*"
        ]
      }
    }
  ]
}

Kebijakan Bucket berisi daftar Statementsdan setiap pernyataan memiliki Effect(salah satu Allowatau Deny) untuk daftar Actionsyang dilakukan oleh Principal(pengguna) pada yang ditentukan Resource(diidentifikasi oleh Amazon Resource Nameatau ARN).

Ini Idhanya id kebijakan opsional dan Sidid pernyataan unik opsional.

Untuk Kebijakan S3 Bucket, Resource ARN mengambil formulir:

arn:aws:s3:::<bucket_name>/<key_name>

Contoh di atas memungkinkan ( Effect: Allow) siapa saja ( Principal: *) untuk mengakses ( Action: s3:GetObject) objek apa pun dalam ember ( Resource: arn:aws:s3:::<bucket-name>/*).


Apakah tidak ada cara dengan panel kontrol?
ianaz

2
@ianaz Anda dapat menambahkan kebijakan bucket ini ke bucket melalui konsol AWS (panel kontrol)
dcro

@ianaz lihat jawaban saya di bawah ini.
jaxxbo

Perhatikan juga bahwa ada tautan "contoh kebijakan" di tautan di atas yang memberikan informasi persis yang diperlukan untuk memotong dan menempel ke pembuat kebijakan. Saat aws memperbarui API, ini lebih cenderung untuk tetap benar. Bekerja seperti pesona bagiku pagi ini.
keithpjolley

Principal: *banyak membantu saya. Terima kasih!
iedmrc

2

Masalah saya sedikit berbeda, tetapi karena pertanyaan ini ada di bagian atas pencarian google saya akan meninggalkan solusi saya, mungkin itu akan membantu seseorang.

Saya sudah memiliki akses penuh ke bucket S3 sebelumnya, tetapi suatu hari itu baru saja mulai kembali Access Deniedke semua file saya. Solusinya sangat sederhana.

  1. Pergi ke Services-S3
  2. Klik pada ember S3 Anda
  3. Beralih ke Permissionstab, lalu buka Bucket Policytab
  4. Dan klik Savetombolnya.

Seharusnya menetapkan ulang izin pada semua file Anda.

masukkan deskripsi gambar di sini

Bagaimanapun, di sini penuh bucket policyyang memungkinkan membuat semua objek publik

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowPublicRead",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::enter-here-your-media-bucket-name/*"
        }
    ]
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.