固定政策和自定义政策有什么区别?

What is the difference between Canned Policy and Custom Policy?

我正在寻找概念层面的答案。因此,请不要简单地向 Aws 文档提供 link 作为答案。

这就是 boto

生成 固定策略 的方式
@staticmethod
def _canned_policy(resource, expires):
    """
    Creates a canned policy string.
    """
    policy = ('{"Statement":[{"Resource":"%(resource)s",'
              '"Condition":{"DateLessThan":{"AWS:EpochTime":'
              '%(expires)s}}}]}' % locals())
    return policy

这就是自定义策略 由同一个库生成的方式

@staticmethod
def _custom_policy(resource, expires=None, valid_after=None, ip_address=None):
    """
    Creates a custom policy string based on the supplied parameters.
    """
    condition = {}
    # SEE: http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/RestrictingAccessPrivateContent.html#CustomPolicy
    # The 'DateLessThan' property is required.
    if not expires:
        # Defaults to ONE day
        expires = int(time.time()) + 86400
    condition["DateLessThan"] = {"AWS:EpochTime": expires}
    if valid_after:
        condition["DateGreaterThan"] = {"AWS:EpochTime": valid_after}
    if ip_address:
        if '/' not in ip_address:
            ip_address += "/32"
        condition["IpAddress"] = {"AWS:SourceIp": ip_address}
    policy = {"Statement": [{
                 "Resource": resource,
                 "Condition": condition}]}
    return json.dumps(policy, separators=(",", ":"))

在我看来,固定策略本质上是自定义策略,但属性较少。

如果这是一个正确的观察,那么为什么需要两种不同的政策?

是的,固定策略只能传达自定义策略属性的特定子集,但两者之间的区别更为显着。

当您使用固定(预定义)策略时,生成的固定策略文档的内容是如此确定和可预测——从请求的元素本身——策略文档甚至没有需要连同请求一起发送到 CloudFront。

相反,它是在本地生成的,因此您可以对其进行签名,但随后会被丢弃。服务器根据请求参数生成相同的文档,并验证签名。

相比之下,对于自定义策略,策略文档本身与请求一起发送,base-64 编码,在 URL 中的 &Policy= 中。这使得 URL 更长,因为必须一起发送策略文档,但现在允许策略文档本身包含不能通过简单检查从请求中简单推断的元素。

然后,固定策略(至少在某种程度上)更“轻量级”——更短的 URLs 意味着请求中包含的字节更少,使用它们所需的处理也更少,但它们灵活性低于自定义策略。

比较矩阵: Using signed URLs @ docs.aws.amazon.com