AWS S3 grubundaki tüm Nesneleri varsayılan olarak nasıl genel hale getirebilirim?


151

Kovama bir dosya yüklemek için bir PHP kütüphanesi kullanıyorum. ACL genel okuma-yazma için ayarladım ve iyi çalışıyor ama dosya hala özel.

Grantee'yi Herkes olarak değiştirirsem dosyanın herkese açık hale getirildiğini fark ettim. Bilmek istediğim, kovalamamdaki tüm nesneler için varsayılan Herkesin "Herkes" olarak ayarlanması nasıl yapılır . Veya dosyaları varsayılan olarak herkese açık hale getirmek için başka bir çözüm var mı?

Kullandığım kod aşağıda:

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

Yanıtlar:


300

Gidin http://awspolicygen.s3.amazonaws.com/policygen.html gibi ayrıntılarını girin: resim açıklamasını buraya girin In Action "GetObject" Seç "Bildirimi Ekle" seçeneğini Sonra "Politikası'nı Oluştur" seçeneğini

Metin örneğini kopyalayın:

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

Şimdi AWS S3 konsolunuza gidin, Grup düzeyinde, Özellikler'i, İzinleri Genişlet'i ve ardından Grup ekle politikasını seçin. Yukarıda oluşturulan kodu düzenleyiciye yapıştırın ve kaydet'e basın.

Gruptaki tüm öğeleriniz varsayılan olarak herkese açık olacaktır.


8
Bu doğru yanıttır. Önceki cevabın aksine, bu yazı bana politikaların nasıl oluşturulacağını ve ne yaptıklarını da öğretti. Bunu okuduktan sonra manuel olarak bir politika yazabilirim.
Ocak'ta Jason Cheladyn

2
Bu cevabı @liyicky ile aynı nedenden dolayı destekledim, ayrıntılı talimatlar sadece cevabı vermek yerine güzel bir girişti.
brendo

Burada aynı. AWS zaman zaman ve muhtemelen çok iyi bir nedenden dolayı opak olma eğilimindedir. Bu cevap şekli sıfırdan işe yarar.
Jerome

Bu, kovaya yeni dosyalar eklediğinizde çalışır, ancak genel olarak kullanabilmek için kovada zaten bulunan dosyaları değiştirmem gerekir.
Radenko Zec

137

Tüm nesneleri varsayılan olarak herkese açık hale getirmek istiyorsanız, bunu yapmanın en basit yolu, her bir nesne için tanımlanan Erişim Kontrol Listeleri (EKL) yerine bir Grup İlkesi ile yapmaktır .

resim açıklamasını buraya girin

Grubunuz için bir grup ilkesi oluşturmak üzere AWS İlke Oluşturucu'yu kullanabilirsiniz.

Örneğin, aşağıdaki politika herkesin S3 grubunuzdaki her nesneyi okumasına izin verir (sadece <bucket-name>grubunuzun adıyla değiştirin ):

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

Kepçe Politikası listesini içeren Statementsve her deyimi olan bir Effect(ya Allowya Deny) listesi için Actionso tarafından yapılmaktadır Principalbelirtilen ilgili (kullanıcı) Resource(bir tarafından tespit Amazon Resource Nameveya ARN).

Bu Idyalnızca isteğe bağlı bir politika kimliğidir ve Sidisteğe bağlı benzersiz bir ifade kimliğidir.

S3 Kepçe İlkeleri için Kaynak ARN'leri şu şekilde olur:

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

Yukarıdaki örnek, ( Effect: Allow) herkesin ( Principal: *) Action: s3:GetObjectgrubundaki ( Resource: arn:aws:s3:::<bucket-name>/*) nesneye erişmesine ( ) izin verir .


Kontrol panelinde bir yol yok mu?
ianaz

2
@ianaz Bu grup politikasını AWS konsolu (kontrol paneli) aracılığıyla bir gruba ekleyebilirsiniz
dcro

@ianaz aşağıdaki cevabımı gör.
jaxxbo

Ayrıca, yukarıdaki bağlantıda, politika oluşturucuyu kesmek ve yapıştırmak için gereken bilgileri veren bir "örnek politikalar" bağlantısı olduğunu da unutmayın. Aws API'lerini güncellediğinden bunun doğru kalması daha olasıdır. Bu sabah benim için bir cazibe gibi çalıştı.
keithpjolley

Principal: *bana çok yardım etti. Teşekkürler!
iedmrc

2

Benim sorunum biraz farklıydı, ama bu soru google aramasının en üstünde olduğu için çözümümü bırakacağım, belki birine yardımcı olacaktır.

Daha önce S3 kovasına tam erişimim vardı, ancak bir gün Access Deniedtüm dosyalarıma geri dönmeye başladı . Çözüm basitti.

  1. Git Services-S3
  2. S3 kepçenize tıklayın
  3. Geçin Permissionssekmesine, ardından gidip Bucket Policysekmesi
  4. Ve Savedüğmesini tıklayın.

Tüm dosyalarınıza izni yeniden atamalıdır.

resim açıklamasını buraya girin

Her neyse, burada bucket policytüm nesneleri herkese açık hale getiren tam

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowPublicRead",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::enter-here-your-media-bucket-name/*"
        }
    ]
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.