기본적으로 AWS S3 버킷의 모든 객체를 공개하는 방법은 무엇입니까?


151

PHP 라이브러리를 사용하여 파일을 버킷에 업로드하고 있습니다. ACL을 public-read-write 로 설정했으며 정상적으로 작동하지만 파일은 여전히 ​​개인용입니다.

Grantee를 Everyone으로 변경 하면 파일이 공개됩니다. 내가 알고 싶은 것은 버킷의 모든 객체 에서 기본 Grantee"Everyone" 으로 설정하는 방법 입니다. 아니면 기본적으로 파일을 공개 하는 또 다른 솔루션이 있습니까?

내가 사용하는 코드는 다음과 같습니다.

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

답변:


300

http://awspolicygen.s3.amazonaws.com/policygen.html로 이동 하십시오. 다음과 같은 세부 사항을 입력하십시오 여기에 이미지 설명을 입력하십시오 . 조치에서 "GetObject"를 선택하십시오. "문 추가"를 선택한 후 "정책 생성"을 선택하십시오.

텍스트 예제를 복사하십시오.

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

이제 AWS S3 콘솔로 이동하여 버킷 수준에서 속성을 클릭하고 권한을 확장 한 다음 버킷 정책 추가를 선택하십시오. 위에서 생성 된 코드를 편집기에 붙여 넣고 저장을 누르십시오.

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


8
이것이 올바른 답변입니다. 이전 답변과 달리이 게시물에서는 정책을 작성하는 방법과 정책을 수행했습니다. 이것을 읽은 후 수동으로 정책을 작성할 수 있습니다.
Jason Cheladyn

2
@liyicky와 같은 이유로이 답변을 찬성했습니다. 자세한 지침은 답변을 전달하는 대신 좋은 소개였습니다.
brendo

여기도 마찬가지입니다. AWS는 때때로 불투명 한 경향이 있으며 아마도 그럴만한 이유가 있습니다. 이 형태의 답변은 그라운드 제로에서 도움이됩니다.
Jerome

버킷에 새 파일을 추가 할 때 작동하지만 버킷에 이미 존재하는 파일을 공개해야합니다.
Radenko Zec

137

기본적으로 모든 객체를 공개하려면 가장 간단한 방법은 각 개별 객체에 정의 된 ACL (액세스 제어 목록) 대신 버킷 정책을 통과하는 것입니다.

여기에 이미지 설명을 입력하십시오

AWS Policy Generator 를 사용하여 버킷에 대한 버킷 정책을 생성 할 수 있습니다 .

예를 들어, 다음 정책은 누구나 S3 버킷의 모든 객체를 읽을 수 있도록 허용 <bucket-name>합니다 (버킷 이름으로 대체 ).

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

양동이 정책의 목록을 포함 Statements하고 각 문이있는 Effect(하나 Allow또는 Deny)의 목록 Actions이에 의해 수행 Principal지정된에 (사용자) Resource(AN에 의해 확인 Amazon Resource Name또는 ARN).

Id단지 옵션 정책 ID이며,이 Sid옵션 고유의 문 ID입니다.

S3 버킷 정책의 경우 리소스 ARN은 다음과 같은 형식을 갖습니다.

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

위의 예에서는 ( Effect: Allow) 모든 사람 ( Principal: *) Action: s3:GetObject이 버킷 ( Resource: arn:aws:s3:::<bucket-name>/*) 의 모든 객체에 액세스 ( ) 할 수 있습니다 .


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

2
@ianaz AWS 콘솔 (제어판)을 통해이 버킷 정책을 버킷에 추가 할 수 있습니다
dcro

@ianaz는 아래 답변을 참조하십시오.
jaxxbo

또한 위 링크에 "예시 정책"링크가있어 정책 생성기를 잘라내어 붙여 넣는 데 필요한 정확한 정보를 제공합니다. aws가 API를 업데이트함에 따라 이는 올바른 상태를 유지할 가능성이 높습니다. 오늘 아침에 나를 위해 매력처럼 일했다.
keithpjolley

Principal: *많은 도움이되었습니다. 감사!
iedmrc

2

내 문제는 약간 달랐지만이 질문은 Google 검색의 맨 위에 있기 때문에 해결책을 남길 것입니다. 아마 누군가를 도울 것입니다.

나는 이미 전에 S3 버킷에 완전히 액세스 할 수 있었지만 어느 날 Access Denied모든 파일 로 돌아 오기 시작했습니다 . 해결책은 간단했다.

  1. 로 이동 Services-S3
  2. S3 버킷을 클릭하십시오
  3. 로 전환 Permissions탭으로 이동 한 다음 Bucket Policy
  4. 그리고 Save버튼을 클릭하십시오 .

모든 파일에 대한 권한을 다시 할당해야합니다.

여기에 이미지 설명을 입력하십시오

어쨌든 여기에 bucket policy모든 개체를 공개 할 수있는 내용이 가득 합니다

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowPublicRead",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::enter-here-your-media-bucket-name/*"
        }
    ]
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.