尽管“S3fs在最近的构建中非常可靠”,我可以分享自己的s3fs和info的经验,我们在定期随机系统崩溃之后将写操作从直接的s3fs挂载文件夹访问到aws控制台(也可能是SDK api).
你可能不会对像图像这样的小尺寸文件有任何问题,但是当我们尝试编写mp4文件时它肯定会出现问题.系统崩溃之前的日志中的最后一条消息是:
kernel: [ 9180.212990] s3fs[29994]: segfault at 0 ip 000000000042b503 sp 00007f09b4abf530 error 4 in s3fs[400000+52000]
并且它是罕见的随机情况,但这使系统不稳定.
因此我们决定仍然保持s3fs安装,但仅将其用于读取访问
下面我将展示如何在没有密码文件的情况下使用AIM凭据挂载s3fs
#!/bin/bash -x
S3_MOUNT_DIR=/media/s3
CACHE_DIR=/var/cache/s3cache
wget http://s3fs.googlecode.com/files/s3fs-1.74.tar.gz
tar xvfz s3fs-1.74.tar.gz
cd s3fs-1.74
./configure
make
make install
mkdir $S3_MOUNT_DIR
mkdir $CACHE_DIR
chmod 0755 $S3_MOUNT_DIR
chmod 0755 $CACHE_DIR
export IAMROLE=`curl http://169.254.169.254/latest/meta-data/iam/security-credentials/`
/usr/local/bin/s3fs $S3_BUCKET $S3_MOUNT_DIR -o iam_role=$IAMROLE,rw,allow_other,use_cache=$CACHE_DIR,uid=222,gid=500
此外,您还需要创建分配给具有附加策略的实例的IAM角色:
{"Statement":[{"Resource":"*","Action":["s3:*"],"Sid":"S3","Effect":"Allow"}],"Version":"2012-10-17"}
在你的情况下,似乎使用php sdk是合理的(其他答案已经有用法示例),但你也可以使用aws控制台将图像写入s3:
aws s3 cp /path_to_image/image.jpg s3://your_bucket/path
如果您将创建IAM角色并将其分配给您的实例,则无需提供任何其他凭据
更新 – 回答您的问题:
>我不需要包含工厂方法来声明我的IAM凭证?
是,如果您将IAM分配给ec2实例,那么在代码中您只需创建客户端:
$s3Client = S3Client::factory();
$bucket = 'my_s3_bucket';
$keyname = $_POST['cat'].'/original_'.uniqid('fu_').'.jpg';
$localFilePath = '/local_path/some_image.jpg';
$result = $s3Client->putObject(array(
'Bucket' => $bucket,
'Key' => $keyname,
'SourceFile' => $filePath,
'ACL' => 'public-read',
'ContentType' => 'image/jpeg'
));
unlink($localFilePath);
选项2:如果您不需要文件本地存储阶段,但会从上传表单中放置direclt:
$s3Client = S3Client::factory();
$bucket = 'my_s3_bucket';
$keyname = $_POST['cat'].'/original_'.uniqid('fu_').'.jpg';
$dataFromFile = file_get_contents($_FILES['uploadedfile']['tmp_name']);
$result = $s3Client->putObject(array(
'Bucket' => $bucket,
'Key' => $keyname,
'Body' => $dataFromFile,
'ACL' => 'public-read',
));
如果你有公共访问权限,可以获得s3链接
$publicUrl = $s3Client->getObjectUrl($bucket, $keyname);
或者为私人内容生成签名网址:
$validTime = '+10 minutes';
$signedUrl = $s3Client->getObjectUrl($bucket, $keyname, $validTime);