2016-07-02 3 views
0

PHP에서 제한된 권한으로 클라우드 프론트 (내 s3 버킷을 가리킴)에 대한 서명 된 URL을 만들려고 시도했지만 계속 잘못된 정책 오류가 발생합니다.Aws CloudFront Malformed Policy

내가 사용하고 :

$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 

     ]); 

를 기본적으로 내가이의 수신기가 나는 위의 코드에서 (지정 만 S3 객체 권한으로 getObject에 그 설정을 가지고 URL을 체결하고자, 때로는 될 수있다 개체 넣기, 때때로 개체 삭제 될 수 있음 클라우드에서이를 달성하려면 어떻게합니까?

답변

1

사용자 지정 정책은 CloudFront 서명 된 URL에 사용되는 정책 문서 종류가 아닙니다. CloudFront는 전혀 다른 정책 언어를 사용합니다.

CloudFront의 맞춤 정책 - 기술적으로 말하면 - 은 CloudFront에 대한 액세스 권한을 허용합니다. CloudFront 서명 된 URL 및이를 처리하는 논리는 버킷 이름, 키, 보안 주체, 원본 액세스 ID 등과 같이 뒷면의 엔터티 또는 구성에 대한 인식이 없습니다. CloudFront가 허용됨을 지정하는 역할 만합니다 특정 URL 또는 URL 패턴에 대한 요청을 처리하는 등의 작업을 수행합니다. 그들은 엄격하게 CloudFront의 "전면"에서 작동하며,이 층에서 무슨 일이 일어나고 있는지에 대한 인식이 없습니다. CloudFront 배포판이 제한없는 버킷 액세스 또는 원본 액세스 ID에 부여 된 권한 때문에 기본 리소스에 대한 요청을 수행 할 권한이있는 경우 작업이 성공합니다. 그렇지 않으면 실패합니다.

이러한 정책의 올바른 형식은 Creating a Policy Statement for a Signed URL That Uses a Custom Policy입니다.

근본적으로 CloudFront 서명 URL을 GET이 아닌 버킷에 대해 사용하려는 경우 CloudFront 서명 URL을 디자인과 일치하지 않는 방식으로 사용하려고 할 가능성이 큽니다. GET, HEADOPTIONS 이외의

작동이 CloudFront를 통해 S3로 전송하지만,이 작업을 수행하는 하나의 이유가 될 "수"- 기원 S3 위치에 Edge 네트워크에서 고품질의 경로를 타고가. CloudFront를 통해 PUT을 수행하면 실제로 CloudFront에 아무 것도 저장하지 않습니다. 요청을 버켓으로 전달하기 만하면 CloudFront에 이미 캐시 된 것에 영향을 미치지 않습니다.

당신은 동일한 목적을 달성 할 수 - 비 GET 작업에 글로벌 네트워크 성능과 처리량을 향상 -이 기능을 사용하도록 설정하면 https://example-bucket.s3-accelerate.amazonaws.com에서 버킷을 노출 S3 Transfer Acceleration를 사용하여. 약간의 과도한 단순화를하고 있지만 효과적으로 캐시를 사용하지 않는 일반적인 CloudFront 배포판에 버킷을 두어 더 빠른 전송을 위해 Edge 네트워크를 탈 수 있지만 여전히 표준 S3 서명과 정책을 사용하여 다른 모든 S3 작업이 필요합니다.

또는 다른 요청을 버킷으로 직접 보내십시오.

+0

오! 그래서 당신이 말한 것을 이해한다면, 클라우드 프론트를 사용하여 get 및 head를 허용하는 배포판을 가져야하며, 추가적으로 s3 전송 가속화를 허용합니다 (가장자리 위치를 프록시로 사용하려는 경우). –

+1

그것은 가장 간단한 해결책이 될 것입니다. –

관련 문제