awsのElastic Beanstalk + CloudFront + S3環境で署名付きCookieを使いS3への接続を実装中です
しかしLaravelを呼び出すとキーペアがセットされていないとのエラーが出て画像が表示されません
Failed to load resource: the server responded with a status of 403 () Missing Key-Pair-Id query parameter or cookie value
Laravelのコントローラ内で以下のコードを記載しcookieにcloudfrontに必要なパラメータをセットしています
コードは以下のサイト様を参考にしました
https://www.pnkts.net/2018/06/11/s3-signed-cookies/
Controller
1$cloudFront = new \Aws\CloudFront\CloudFrontClient([ 2 'region' => 'ap-northeast-1', 3 'version' => '2014-11-06', 4]); 5// Set up parameter values for the resource 6$expires = time() + 60 * 60 * 1000; 7 8$customPolicy = <<<POLICY 9{ 10 "Statement": [ 11 { 12 "Resource": "https://*", 13 "Condition": { 14 "DateLessThan": {"AWS:EpochTime": {$expires}} 15 } 16 } 17 ] 18} 19POLICY; 20 21// Create a signed cookie for the resource using a custom policy 22$signedCookieCustomPolicy = $cloudFront->getSignedCookie([ 23 'policy' => $customPolicy, 24 'private_key' => realpath(config('app.private_key_path')), 25 'key_pair_id' => '(IDは伏せてます)' 26]); 27 28foreach ($signedCookieCustomPolicy as $name => $value) { 29 setcookie($name, $value, 0, "/"); 30}
blade側でcloudfrontにアクセスしS3の画像を呼び出します
blade
1<img src="https://image.example.com/private/test.jpg" />
検証と確認した事
403が出てしまったページでcookeiを確認すると
CloudFront-Key-Pair-Id
CloudFront-Signature
CloudFront-Policy
それぞれ値がセットされていました
ブラウザで表示したい画像のURL(https://image.example.com/private/test.jpg)を直接呼出し
先程403が出てしまっていたページのCloudFront-Key-Pair-Id・CloudFront-Signature・CloudFront-Policyの情報をコピーして画像にアクセスしたところ画像が表示されました
以上を踏まえるとCloudFront-Key-Pair-Id・CloudFront-Signature・CloudFront-Policyの値は正常ではないかと考えています
CloudFront側のログを確認したところ
Larvelから呼び出した時のログのcookeiがErrorとなっておりCloudFrontに一切cookeiが届いていなさそうな感じです
現状cookieが届かないのがCloudFront側の設定に問題があるのかLravel側に問題があるのか切り分けがつかずご助力頂きたい状況です
ドメイン設定
clodfrontのドメイン
- image.example.com
clodfrontに接続したいLaravelプロジェクトのドメイン
- example.com
- admin.example.com
ローカル開発環境
windows10
PHP 7.3.9
Elastic Beanstalk環境
Laravel:6.20.36
PHP 7.4

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。