PHPライブラリを使用してファイルをバケットにアップロードしています。 ACLをpublic-read-writeに設定しましたが、正常に機能しますが、ファイルはまだプライベートです。
Grantee to Everyoneを変更すると、ファイルが公開されることがわかりました。私が知りたいのは、バケットで"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)の代わりに Bucket Policy を使用することです。
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
(Amazon Resource Name
またはAllow
によって識別される)でDeny
(ユーザー)によって実行されるActions
のリストのPrincipal
(Resource
または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>/*
)できます。