Posted in: Aws云上云维
「CloudFront + S3」使用签名URL进行访问限制
在这里使用CloudFront + S3,搭建生成签名URL的CDP(Private Cache Distribution)。以下是操作流程;
- 创建Amazon S3
- 创建CloudFront Distributions
- 生成签名URL
创建Amazon S3
在这里创建Amazon S3以后,把index.html文件上传到S3上。
- 登录AWS管理界面
- 点击S3
- 点击[创建存储桶]
- 点击[上传]
- 点击[添加文件]
- 点击[开始上传]
- 确认状态为[完成]
<html> <head> <title>private</title> </head> <body> <h1>只可以从CloudFront访问的S3!</h1> </body> </html>
创建CloudFront Distribution
- 点击[Create Distribution]
- 点击[Get Started]
Orgin Settings
- Origin Domain Name:aws.s3.amazonaws.com <- 选择刚才创建的Amazon S3
- Origin Path:默认 <- CloudFront会把填写的路径添加到Origin Domain Name后面
- Origin ID:S3-awsgood <- 默认
- Restrict Bucket Access:Yes
- Origin Access Identity:Create a New Identity
- Comment:access only from CloudFront <- 注释部分,可任意填写内容
- Grant Read Permissions on Bucket:Yes,Update Bucket Policy
- Path Pattern:默认
- Viewer Protocol Policy:HTTP and HTTPS
- Allowed HTTP Methods:GET,HEAD
- Object Caching:Use Origin Cache Headers
- Minimum TTL:0
- Forward Cookies:None
- Whitelist Cookies:有效化Forward Cookies的话,只允许Whitelist的Cookie转发到原始服务器
- Forward Query Strings:No <- 选择Yes的话,可缓存QueryParameter的URL
- Smooth Streaming:No
- Restrict Viewer Access:Yes <- 只允许签名URL访问
- Trusted Signers:Self <- 选择Specify Accounts的话,其他用户的签名也将会有效化
Distribution Settings在这里使用默认配置。
CloudFront Distributions的状态为[In Progress]。
等待10分中之后状态变为[Deployed],并且Domain Name是这次创建的CloudFront Distribution的域名。
- 在AWS管理控制台选择S3
- 选择桶以后,点击[属性]
- 点击[权限]
- 点击[编辑存储桶策略]
{ "Version": "2008-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": "1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E3L6IN8Q7KY7GE" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::awsgood/*" } ] }
进行以上配置以后,只允许用签名URL进行访问,直接输入URL的页面如下。
创建签名URL
为了创建签名URL,首先创建CloudFront密钥对。
- 点击创建CloudFront密钥对
- 点击[CloudFront密钥对]
- 点击[下载私有密钥文件]
- 点击[下载公有密钥文件]
- 确认文件以下载之后,点击[关闭]
- 私有密钥文件:pk-密钥对ID.pem
- 公有密钥文件:rsa-密钥对ID.pem
使用AWS SDK for PHP生成签名URL。
把私有密钥上传到Amazon EC2以后,创建如下php文件。创建php文件之前需安装AWS SDK for PHP,安装方法参考 >> 安装AWS SDK for PHP
- private_key:CloudFront私有密钥的路径
- key_pair_id:CloudFront密钥对的ID
- HostUrl:创建CloudFront的DomainName
- expires:签名URL的超时时间
# cat cloudfront.php <?php require_once("vendor/autoload.php"); date_default_timezone_set('Asia/Chongqing'); use Aws\CloudFront\CloudFrontClient; $client = CloudFrontClient::factory(array( 'private_key' => '/path/to/your/cloudfront-private-key.pem', 'key_pair_id' => 'cloudfront key pair id', )); $HostUrl = 'CloudFront DomainName'; $resourceKey = 'index.html'; $expires = time() + 300; $signedUrl = $client->getSignedUrl(array( 'url' => $HostUrl . '/' . $resourceKey, 'expires' => $expires, )); print $signedUrl;
执行cloudfront.php后,把生成签名URL粘帖到浏览器。
# php cloudfront.php https://d1e2kb4c29diqv.cloudfront.net/index.html?Expires=1430200266&Signature=fAwSd3JgwY2WlP78G11QvOhT2kGNvhKnurNbctMs0rgCejl7VsCwlI0xHWsZA6pxaeqfTmUdtzfup4Cn6IvKWTQmNCsFCPiQQ4Uzyyj0vQpajFj60I1bnKbe0XopbY4~MvT13ZrHyJQNSeJTyVjLfPQvW482skLNF3SQSDufPSl2gokCxSoX83U7RGTvkVMJt8RWdgsx4sjEXo3z4KBtDoa4P9LecDYBtidH-xwzgmtFGeLyA12KdEwUVp6LdHHle3BOYOmWyqwgowDWI6T4-S2Rn4tHlrXGpqLpt5w5~h3bH-w~FDG0v6BaUJjvu2EgMJlqqdXc24w5d3oyE8tMFw__&Key-Pair-Id=APKAJEQ4CITOZRVLKRZQ
过5分钟访问的话,会出现如下页面。
也可以通过以下php代码生成限时URL。
<?php require_once("vendor/autoload.php"); date_default_timezone_set('Asia/Chongqing'); use Aws\S3\S3Client; $config = array( 'key' => 'Access Key Id', 'secret'=> 'Secret Access Key', ); $s3 = S3Client::factory($config); $url = $s3->getObjectUrl("awsgood", "index.html", "1 minutes"); print $url;