2013-10-04 4 views
102

PHP 라이브러리를 사용하여 파일을 양동이에 업로드하고 있습니다. ACL을 public-read-write으로 설정했지만 제대로 작동하지만 파일은 여전히 ​​개인입니다.AWS S3 버킷의 모든 객체를 기본적으로 공용으로 만드는 방법은 무엇입니까?

내가 수 여자를 모두에게 변경하면 파일을 공개로 만듭니다. 궁금한 점은 내 버킷의 모든 객체에 수당을 부여하려면 "모두"으로 설정해야합니다. 또는 에 대한 또 다른 해결책은 파일을 공개으로 공개 하시겠습니까? 내가 사용하고

코드는 다음과 같습니다 :

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

답변

100

모든 기본적으로 공공 개체를 확인하려면 가장 간단한 방법은 각 정의 대신 액세스 제어 목록의 Bucket Policy (ACL)을 여물하는 것입니다 개별 개체.

enter image description here

당신은 당신의 버킷에 대한 버킷 정책을 생성 할 AWS Policy Generator를 사용할 수 있습니다.

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

양동이 정책 Statements 각각의 목록을 포함합니다 :

예를 들어, 누군가가 당신의 S3 버킷에있는 모든 개체를 읽을 수 있도록 다음과 같은 정책은 (당신의 버킷의 이름으로 <bucket-name> 대체) 문 (Amazon Resource Name 또는 ARN 식별) 지정된 ResourcePrincipal (사용자)에 의해 수행되는 Actions 목록 Effect위한 (하나 또는 AllowDeny)을 갖는다.

Id은 선택적 정책 ID이며, Sid은 선택적 고유 진술 ID입니다. S3 버킷 정책

는 자원 ARN을는 형태를 취한다 :

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

위의 예는 접속 (Action: s3:GetObject) 버킷 (Resource: arn:aws:s3:::<bucket-name>/*)의 모든 오브젝트 (Effect: Allow) 사람 (Principal: *) 수있다.

+0

제어판에는 방법이 없습니까? – ianaz

+2

@ianaz AWS 콘솔 (제어판) – dcro

+0

@ianaz를 통해이 버킷 정책을 버킷에 추가 할 수 있습니다. 내 대답은 아래를 참조하십시오. – jaxxbo

225

이동과 같은 세부 사항에 http://awspolicygen.s3.amazonaws.com/policygen.html 채우기에 :

{ 
    "Id": "Policy1397632521960", 
    "Statement": [ 
    { 
     "Sid": "Stmt1397633323327", 
     "Action": [ 
     "s3:GetObject" 
     ], 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3:::bucketnm/*", 
     "Principal": { 
     "AWS": [ 
      "*" 
     ] 
     } 
    } 
    ] 
} 
: 액션에서 enter image description here 는 "GetObject를"을 선택 그런 다음

복사 텍스트 예 "정책 생성"선택 "문을 추가"를 선택

AWS S3 콘솔로 이동합니다. 버킷 레벨에서 속성, 권한 확장을 차례로 클릭 한 다음 버킷 정책 추가를 선택합니다. 위의 생성 된 코드를 편집기에 붙여넣고 저장합니다.

버킷의 모든 항목은 기본적으로 공개됩니다.

+7

이것은 올바른 응답입니다. 이전의 답변과 달리이 게시물은 정책을 만드는 방법과 정책에 대해 가르쳐 줬습니다. 이 글을 읽은 후 수동으로 정책을 작성할 수 있습니다. – liyicky

+2

나는 @liyicky와 같은 이유 때문에이 대답을 upvoted했다. 상세한 지시 사항은 대답을 전달하는 대신 멋진 소개였다. – brendo

+0

여기에 있습니다. AWS는 때때로 불투명 한 경향이 있으며 아마도 매우 좋은 이유가 있습니다. 이 답 형식은지면 0에서 도움이됩니다. – Jerome

관련 문제