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;
}
답변
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 콘솔로 이동하여 버킷 수준에서 속성을 클릭하고 권한을 확장 한 다음 버킷 정책 추가를 선택하십시오. 위에서 생성 된 코드를 편집기에 붙여 넣고 저장을 누르십시오.
버킷의 모든 항목은 기본적으로 공개됩니다.
답변
기본적으로 모든 객체를 공개하려면 가장 간단한 방법은 각 개별 객체에 정의 된 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>/*
) 의 모든 객체에 액세스 ( ) 할 수 있습니다 .
답변
내 문제는 약간 달랐지만이 질문은 Google 검색의 맨 위에 있기 때문에 해결책을 남길 것입니다. 아마 누군가를 도울 것입니다.
나는 이미 전에 S3 버킷에 완전히 액세스 할 수 있었지만 어느 날 Access Denied
모든 파일 로 돌아 오기 시작했습니다 . 해결책은 간단했다.
- 로 이동
Services
–S3
- S3 버킷을 클릭하십시오
- 로 전환
Permissions
탭으로 이동 한 다음Bucket Policy
탭 - 그리고
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/*"
}
]
}