盡管“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);