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;

QQ咨询
		













