Aws CloudFront格式错误的政策

时间:2016-07-02 17:09:44

标签: php amazon-web-services amazon-s3 amazon-cloudfront

我一直在尝试使用php中的有限权限为云前端(指向我的s3存储桶)创建一个已签名的URL,但我一直收到格式错误的政策错误。

我正在使用:

$customPolicy = '{"Id":"Policy1319566876317","Statement":[{"Sid":"Stmt1319566860498","Action":["s3:GetObject"],"Effect":"Allow","Resource":"arn:aws:s3:::my-bucket/*","Principal":{"CanonicalUser":["92cd670939a0460a1b48cbbfedcb5178139bcb315881d9ec3833e497a9e62959762d560feec321a749217754e5d02e5f"]}}]}';


// Create a signed URL for the resource using the canned policy
        $signedUrlCannedPolicy = $cloudFront->getSignedUrl([
            'url'         => $streamHostUrl . '/' . $resourceKey,
            'private_key' => base_path().'/'.'mypem file',
            'key_pair_id' => 'myid',
            'policy' => $customPolicy

        ]);

基本上,我希望这个签名url的接收者只拥有我指定的那些s3对象权限(在上面的代码中,它设置为getObject,有时它可能是put对象,有时它可能是delete对象。 我如何在云端实现这一目标?

1 个答案:

答案 0 :(得分:1)

您的自定义策略看起来像S3 / IAM策略声明。这不是用于CloudFront签名URL的策略文档类型。 CloudFront具有完全不同的策略语言。

CloudFront中的自定义策略 - 从技术上讲 - 允许访问CloudFront ,而不是其背后的资源。 CloudFront签名URL以及处理它们的逻辑无法识别背面的实体或配置,例如存储桶名称,密钥,主体,原始访问标识等...它们仅用于指定允许CloudFront为特定URL或URL模式的请求提供服务,仅此而已。它们严格按照"前端" CloudFront,并没有意识到这一层幕后发生了什么。如果您的CloudFront分配被授权在底层资源上执行请求,或者由于无限制的存储区访问,或者由于授予原始访问标识的权限,操作会成功。否则,它将失败。

查看Creating a Policy Statement for a Signed URL That Uses a Custom Policy了解这些政策的正确格式。

从根本上说,如果您想要使用CloudFront签名URL对存储桶而不是GET执行其他操作,那么您最有可能尝试以与其设计不一致的方式使用CloudFront签名URL。 / p>

GETHEADOPTIONS"以外的操作可以"通过CloudFront发送到S3,但只有一个原因 - 从Edge网络到原始S3位置的高质量路径。通过CloudFront执行PUT实际上并未在CloudFront中存储任何内容 - 它只是将请求传递到存储桶,并且对CloudFront中已经缓存的内容没有影响。

您可以通过使用S3 Transfer Acceleration来实现相同的目的 - 提高非GET操作的全球网络性能和吞吐量,当您启用该功能时,{{3}}会在https://example-bucket.s3-accelerate.amazonaws.com公开您的存储桶。我做了一点过于简单化,但实际上,这使得您的存储空间落后于不缓存的通用CloudFront分配,允许您使用Edge网络以实现更快的传输,但仍然使用标准的S3签名和策略来完成所有其他S3操作都需要什么。

或者,只需将其他请求直接发送到存储桶即可。