有一个带有公共读取策略的存储桶。现在我想限制对某些对象的访问,以便只能从某些 IP 地址访问。这可能吗?
我还计划添加 CloudFront。我应该怎么做才能在每个对象上保持相同的设置?
谢谢!
我正在尝试在 s3_host_alias 中使用 Cloudfront CNAME,但不起作用。
development:
url: ":s3_host_alias"
s3_host_alias: dev-cdn.mysite.com
production:
url: ":s3_host_alias"
s3_host_alias: cdn.mysite.com
Run Code Online (Sandbox Code Playgroud)
def self.s3_config
@@s3_config ||= YAML.load(ERB.new(File.read("#{Rails.root}/config/s3_config.yml")).result)[Rails.env]
end
has_attached_file :avatar, :storage => :s3, :s3_credentials => "#{Rails.root}/config/s3.yml", :url => self.s3_config['url'], :s3_host_alias => self.s3_config['s3_host_alias'], :styles => { :medium => "300x300>", :circle => "130x130#", :thumb => "50x50>" }, :default_url => "avatar/missing.jpg", :path => ":class/:id/:attachment/:style/:hash.:extension", :url => ":class/:id/:attachment/:style/:hash.:extension", :hash_secret => "***"
Run Code Online (Sandbox Code Playgroud)
在模型中直接使用 CNAME 尝试了代码,但也不起作用。
has_attached_file :avatar, :storage => :s3, :s3_credentials => "#{Rails.root}/config/s3.yml", :url => ":s3_host_alias", :s3_host_alias => "dev-cdn.mysite.com", :styles …Run Code Online (Sandbox Code Playgroud) 据我所知,禁用云端分发意味着更新它的状态,并且必须能够删除它.
鉴于AWS CLI的文档非常稀少,我正在寻找一个仅使用CLI进行更新的最小示例.
对于图片库,我使用亚马逊cloudfront。
\n\n我在原点设置了:
\n\nCache-Control:max-age=31536000 (1 Year)\nRun Code Online (Sandbox Code Playgroud)\n\n1 . 当我已经设置了 max-age 时,将 TTL 0(24 小时)设置为 1 年是否有用?
\n\n2 . 当我将 max-age 设置为 1 年时,亚马逊会每 24 小时检查一次 TTL0 的文件吗?
\n\n亚马逊是这样说的:
\n\nObjects are cached for the greater of the value of the Cache-Control max-age directive or the value of the CloudFront Minimum TTL\nRun Code Online (Sandbox Code Playgroud)\n\n亚马逊还表示:
\n\nIf an object in an edge location isn't frequently requested, CloudFront might evict the object\xe2\x80\x94remove the object before its expiration date\xe2\x80\x94to …Run Code Online (Sandbox Code Playgroud) 我们在 S3 Bucket 上有大量文件(图像),这些文件将由 Cloudfront 分发提供给用户浏览器。存储桶中的大多数图像更改为更好的压缩算法,但文件仍会在未来 30 天内缓存在云端边缘位置。
随着时间的推移,我们创建了更多的发行版来提供存储桶中现有文件的更新版本。从现在开始,我们使用 Invalidation,但仍然存在搜索引擎和其他站点仍然引用的现有发行版。
现在我们想将旧发行版中的每个请求重定向到最新发行版:
GET http://old-distribution.amazonaws.com/user/filename.jpg
Run Code Online (Sandbox Code Playgroud)
应该将 301 重定向永久发送到
- > HTTP://新-distribution.amazonaws.com/user/filename.jpg
这可能吗?如果是,如何实现?
我正在处理的应用程序(nodejs)有用户配置文件,每个配置文件可以有多个图像。我使用 S3 作为我的主要存储和 CloudFront 来分发它们。
问题是有时用户上传大图像,我想要做的是在下载图像时缩放图像(在 html img 标签或手机中查看),主要是因为性能。
我不知道我是否应该在将图像上传到 S3 之前对其进行缩放(可能使用 lwip https://github.com/EyalAr/lwip),或者是否有一种方法可以缩放图像或在下载时获得低质量的图像通过 CloudFront?。我读过 CloudFront 可以使用 Gzip 压缩文件,但也不推荐用于图像。
由于存储的原因,我也不想将缩放后的原始图像上传到 S3。
应该在客户端、服务器还是 S3 中完成?最好的方法是什么?
我目前正在将照片上传到AWS s3存储桶,并且该S3 URL正在保存在数据库中,如下图所示:
现在我刚刚创建了一个Cloudfront Distribution,因为我相信它会提高检索图像的速度.但是,由于为上传到我的存储桶的任何对象自动生成了Cloudfront URL,因此在提供映像时,需要使用Cloudfront URL替换S3 URL,以及如何执行此操作?
我想做选项1:
就像我认为可以通过在db中为生成的Cloudfront URL创建另一个列并拉动它来完成,我仍然不知道该怎么做?
或选项2:在从数据库中提取时,使用cloudfront URL替换获取的URL中的s3 URL.
那么最好的想法是让它工作吗?我需要帮助才能切换到CloudFront,但我的数据仍然存储在S3存储桶中.
<?php
include "common.php";
include "aws.php";
try{
if ($_SERVER["REQUEST_METHOD"]=="POST"){
$conn=get_db_connection();
$post_id=$_REQUEST["post_id"];
//$form=R::findOne('answer','id=?',array($form_id));
//$formimage=R::dispense('formimage');
$url="";
if (isset($_FILES["media_file"]) && $_FILES["media_file"]["size"]>0){
$filename=$_FILES["media_file"]["name"];
$fullfilepath="admin/user_media/".$filename;
move_uploaded_file($_FILES["media_file"]["tmp_name"],$fullfilepath);
$emUrl = "http".(!empty($_SERVER['HTTPS'])?"s":"").
"://".$_SERVER['SERVER_NAME'].($_SERVER['SERVER_PORT']=='80'?"":(":".$_SERVER['SERVER_PORT'])).$_SERVER['REQUEST_URI'];
$codeUrl=dirname($emUrl)."/".$fullfilepath;
$url=$codeUrl;
$client = Aws\S3\S3Client::factory(array(
'version' => 'latest',
'region' => 'us-west-2',
'scheme' => 'http'
));
$pathToFile=$fullfilepath;
$bucket='2sale';
try{
$result = $client->putObject(array(
'ACL' => 'public-read',
'Bucket' => $bucket,
'Key' => time().'_'.$filename,
'SourceFile' => $pathToFile
)
);
$stCode=$result['@metadata']['statusCode'];
if ($stCode!="200"){
$result=array("status"=>400,"msg"=>"Error in uploading …Run Code Online (Sandbox Code Playgroud) 我们在同一个域中添加了许多几乎相同的应用程序,每个应用程序都可以通过其特定的子域访问。每个应用程序都有特定的资产(不是很多)。
每个应用程序都引用相同的内容cdn.mydomain.com以从 Cloudfront 获取资产。
资产以间隔命名。举个例子:
应用程序1:
app1.mydomain.com cdn.mydomain.com/assets/app1app1.mydomain.com/assets/app1/*到原点app1.mydomain.com当 Cloudfront 缓存中没有资产时,它会从正确的来源下载资产。
实际上,每次添加新应用程序时,我们都会在同一发行版上创建新的来源和缓存行为。
我们正在尝试简化该过程,以便 Cloudfront 能够从正确的来源获取资产,而无需指定它。如果我们在一个分布中达到原始数量的限制,这将解决问题。
我们怎样才能做到这一点,这可能吗?
我们正在考虑mydomain.com使用缓存配置来转发host标头,但我们不确定这是否会奏效。
在 CodeBuild 中,我有 2 个项目。一个用于暂存站点,另一个用于生产站点。当我编译我的网站并通过临时项目运行它时,它工作得很好。它已成功同步到我的暂存站点的 s3 存储桶。但是,当尝试编译它并通过生产项目运行它时,运行同步命令时,它会返回错误:
致命错误:调用 ListObjects 操作时发生错误 (AccessDenied):访问被拒绝
[容器] 2018/09/11 08:40:33 命令未成功退出 aws s3sync public/ s3://$S3_BUCKET 退出状态 1
我做了一些挖掘,我认为问题出在我的存储桶策略上。我使用 CloudFront 作为 S3 存储桶之上的 CDN。我不想修改生产存储桶的存储桶策略,除非我完全确定必须这样做。我担心这可能会对现场产生一些影响。这是我的生产存储桶策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::[bucket_name]/*"
},
{
"Sid": "2",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity [access_code]"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::[bucket_name]/*"
}
]
}
Run Code Online (Sandbox Code Playgroud) amazon-s3 amazon-web-services amazon-cloudfront aws-codebuild
在这篇文章之后,我尝试从多个区域提供我的网站的静态内容。
该文章中的 lambda 函数尝试修改此路径中对象的属性:
event.Records[0].cf.request.origin.s3
Run Code Online (Sandbox Code Playgroud)
这是在我的 lambda 函数没有接收到这样的属性的情况下。相反,我得到:
event.Records[0].cf.request.origin.custom
Run Code Online (Sandbox Code Playgroud)
显然,这意味着我收到了一篇CustomOriginConfig文章,等待S3OriginConfig. 我不确定这两个是什么意思,但文章中描述的“编辑源”页面的 UI 与我的完全不同。
文章显示了这一点:
我有这个:
有人可以帮我找出为什么我收到的是 aCustomOriginConfig而不是 吗S3OriginConfig?
我有多个端点,一些是相对于给定用户的,而另一些是全局的。
我想缓存所有这些,但我正在为这个策略而苦苦挣扎。
GET /me
Run Code Online (Sandbox Code Playgroud)
应该缓存,但每个用户都不同。因此,我可以使用Authorization标头中提供的 URI + 访问令牌的组合进行缓存。
GET /products/1
Run Code Online (Sandbox Code Playgroud)
应该被缓存并且对每个人都是一样的。但它也需要Authorization访问标头。所以我只能缓存 URI。
如何在独特的 CloudFront 分配上实现此行为?似乎您只能拥有一种缓存组合。
谢谢,
我的网站位于 AWS EC2 实例上。它有 Cloudfront 和 S3 存储桶。
当我尝试访问我的网站时。我不断收到拒绝访问错误。
我不确定我缺少什么配置。
以下是我的存储桶策略。
{
"Version": "2008-10-17",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [
{
"Sid": "MakePublic",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::domain-cdn/*"
}
]
}
Run Code Online (Sandbox Code Playgroud)
已经关注https://aws.amazon.com/premiumsupport/knowledge-center/cloudfront-access-to-amazon-s3/
我正在使用 Cloudfront & 它指向 S3 存储桶。