Nin*_*les 5 amazon-s3 amazon-web-services s3fs
我正在使用EC2实例,我希望将我的PHP网站与我的Amazon S3存储桶连接起来,我已经在这里看到了PHP的API:http://aws.amazon.com/sdkforphp/,但目前尚不清楚.
这是我需要在控制器中编辑的代码行:
thisFu['original_img']='/uploads/fufu/'.$_POST['cat'].'/original_'.uniqid('fu_').'.jpg';
Run Code Online (Sandbox Code Playgroud)
我需要连接到Amazon S3并能够像这样更改代码:
$thisFu['original_img']='my_s3_bucket/uploads/fufu/'.$_POST['cat'].'/original_'.uniqid('fu_').'.jpg';
Run Code Online (Sandbox Code Playgroud)
我已经为此目的配置了一个IAM用户,但我不知道完成这项工作所需的所有步骤.
我如何连接Amazon S3并与之交互以上传和检索公共图像?
UPDATE
我决定按照建议尝试使用s3fs,所以我按照这里描述安装它(我的操作系统是Ubuntu 14.04)
我从控制台运行:
sudo apt-get install build-essential git libfuse-dev libcurl4-openssl-dev libxml2-dev mime-support automake libtool
sudo apt-get install pkg-config libssl-dev
git clone https://github.com/s3fs-fuse/s3fs-fuse
cd s3fs-fuse/
./autogen.sh
./configure --prefix=/usr --with-openssl
make
sudo make install
Run Code Online (Sandbox Code Playgroud)
一切都安装得正确,但下一步是什么?我应该在哪里声明凭据,如何在我的项目中使用此集成?
第二次更新
我.passwd-s3fs使用IAM凭据创建了一个名为单一代码行的文件accessKeyId:secretAccessKey.
我将它放入我的home/ubuntu目录并给它600权限chmod 600 ~/.passwd-s3fs
接下来从控制台我运行 /usr/bin/s3fs My_S3bucket /uploads/fufu
现在里面/uploads/fufu有我所有的桶文件夹.但是当我尝试这个命令时:
s3fs -o nonempty allow_other My_S3bucket /uploads/fufu
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息:
s3fs: unable to access MOUNTPOINT My_S3bucket : No such file or directory
Run Code Online (Sandbox Code Playgroud)
第三次更新
正如我所说,我运行它fusermount -u /uploads/fufu,之后我检查了fufu文件夹,并按预期为空.之后我又尝试了这个命令(还有一个-o):
s3fs -o nonempty -o allow_other My_S3bucket /uploads/fufu
Run Code Online (Sandbox Code Playgroud)
并收到此错误消息:
fusermount: failed to open /etc/fuse.conf: Permission denied
fusermount: option allow_other only allowed if 'user_allow_other' is set in /etc/fuse.conf
Run Code Online (Sandbox Code Playgroud)
还有其他建议吗?
第4次更新 18/04/15
在从控制台我运行的建议sudo usermod -a -G fuse ubuntu,并sudo vim /etc/fuse.conf在那里我注释掉mount_max = 1000和user_allow_other
比我运行s3fs -o nonempty -o allow_other My_S3bucket/uploads/fufu
乍一看没有错误,所以我认为万事如意,但恰恰相反.
我现在有点沮丧,因为我不知道发生了什么,但我的文件夹/uploads/fufu是隐藏的并使用ls -Al我只看到这个
d????????? ? ? ? ? ? fufu
Run Code Online (Sandbox Code Playgroud)
我不能sudo rm -r或-rf或mv -r它说,/uploads/fufu is a directory
我试过reboot exit and mount -a,但没有.
我试图卸载使用fusermount,错误消息是fusermount: entry for /uploads/fufu not found in /etc/mtab
但我尝试了sudo vim/etc/mtab,我找到了这一行: s3fs /uploads/fufu fuse.s3fs rw,nosuid,nodev,allow_other 0 0
有人能告诉我如何卸载并最终删除此文件夹/uploads/fufu?
尽管“S3fs 在最近的版本中非常可靠”,但我可以分享我自己的 s3fs 经验和信息,即在定期随机系统崩溃后,我们将写入操作从直接 s3fs 安装的文件夹访问移至 aws 控制台(SDK api 也可能是这样)。
\n\n对于像图像这样的小文件,您可能不会遇到任何问题,但当我们尝试写入 mp4 文件时,它肯定会造成问题。所以系统崩溃前日志中的最后一条消息是:
\n\nkernel: [ 9180.212990] s3fs[29994]: segfault at 0 ip 000000000042b503 sp 00007f09b4abf530 error 4 in s3fs[400000+52000]\nRun Code Online (Sandbox Code Playgroud)\n\n而且这种随机情况很少见,但这会导致系统不稳定。
\n\n因此我们决定仍然保持 s3fs 挂载,但仅将其用于读取访问
\n\n下面我展示了如何使用 AIM 凭据挂载 s3fs,无需密码文件
\n\n#!/bin/bash -x\nS3_MOUNT_DIR=/media/s3\nCACHE_DIR=/var/cache/s3cache\n\nwget http://s3fs.googlecode.com/files/s3fs-1.74.tar.gz\ntar xvfz s3fs-1.74.tar.gz\ncd s3fs-1.74\n./configure\nmake\nmake install\n\nmkdir $S3_MOUNT_DIR\nmkdir $CACHE_DIR\n\nchmod 0755 $S3_MOUNT_DIR\nchmod 0755 $CACHE_DIR\n\nexport IAMROLE=`curl http://169.254.169.254/latest/meta-data/iam/security-credentials/`\n\n/usr/local/bin/s3fs $S3_BUCKET $S3_MOUNT_DIR -o iam_role=$IAMROLE,rw,allow_other,use_cache=$CACHE_DIR,uid=222,gid=500\nRun Code Online (Sandbox Code Playgroud)\n\n此外,您还需要创建分配给带有附加策略的实例的 IAM 角色:
\n\n{"Statement":[{"Resource":"*","Action":["s3:*"],"Sid":"S3","Effect":"Allow"}],"Version":"2012-10-17"}\nRun Code Online (Sandbox Code Playgroud)\n\n在你的情况下,似乎使用 php sdk 是合理的(其他答案已经有使用示例),但你也可以使用 aws 控制台将图像写入 s3:
\n\naws s3 cp /path_to_image/image.jpg s3://your_bucket/path\nRun Code Online (Sandbox Code Playgroud)\n\n如果您将创建 IAM 角色并将其分配给您的实例,则无需提供任何其他凭据
\n\n更新-回答你的问题:
\n\n是的,如果您将 IAM 分配给 ec2 实例,那么您只需在代码中创建客户端:
\n\n $s3Client = S3Client::factory();\n $bucket = \'my_s3_bucket\';\n $keyname = $_POST[\'cat\'].\'/original_\'\xe2\x80\x8c\xe2\x80\x8b.uniqid(\'fu_\').\'.jpg\';\n $localFilePath = \'/local_path/some_image.jpg\';\n\n $result = $s3Client->putObject(array(\n \'Bucket\' => $bucket,\n \'Key\' => $keyname,\n \'SourceFile\' => $filePath,\n \'ACL\' => \'public-read\',\n \'ContentType\' => \'image/jpeg\'\n ));\n unlink($localFilePath);\nRun Code Online (Sandbox Code Playgroud)\n\n选项2:如果您不需要文件本地存储阶段,但会直接从上传表单中放置:
\n\n $s3Client = S3Client::factory();\n $bucket = \'my_s3_bucket\';\n $keyname = $_POST[\'cat\'].\'/original_\'\xe2\x80\x8c\xe2\x80\x8b.uniqid(\'fu_\').\'.jpg\';\n $dataFromFile = file_get_contents($_FILES[\'uploadedfile\'][\'tmp_name\']); \n\n$result = $s3Client->putObject(array(\n \'Bucket\' => $bucket,\n \'Key\' => $keyname,\n \'Body\' => $dataFromFile,\n \'ACL\' => \'public-read\',\n));\nRun Code Online (Sandbox Code Playgroud)\n\n如果您有公共访问权限,则获取 s3 链接
\n\n$publicUrl = $s3Client->getObjectUrl($bucket, $keyname);\nRun Code Online (Sandbox Code Playgroud)\n\n或者生成私有内容的签名 URL:
\n\n$validTime = \'+10 minutes\';\n$signedUrl = $s3Client->getObjectUrl($bucket, $keyname, $validTime);\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
2060 次 |
| 最近记录: |