2017-01-06 14 views
2

AWS S3Client->getObject()は返さず、存在しないキーを要求しても例外をスローしません。私は他のS3Clientメソッドが存在しないキーが与えられたときに同じ問題を抱えていると思われます。存在しないキーがあると、S3Client-> GetObject()は例外を返さず、例外をスローしません

しかし、S3Clientを'debug' => trueに設定すると、ファイルが見つからない場合はAws\S3\Exception\S3Exceptionが返されますが、これは許容されます。ここで

は私が書いたテストケースである:

protected function _test_s3_client_get($unit, $key) { 
    $provider = CredentialProvider::ini(NULL, APPPATH . 'config/aws.ini'); 
    $provider = CredentialProvider::memoize($provider); 
    $client = new S3Client([ 
     'region' => 'us-east-1', 
     'version' => '2006-03-01', 
     'credentials' => $provider, 
     // 'debug' => ['logfn' => [$this, '_noop']] 
     // 'debug' => true, 
    ]); 
    try { 
     $result = $client->getObject(array(
      'Bucket' => 'mybucket', 
      'Key'=> $key, 
      )); 
    } catch (S3Exception $e) { 
     error_log($e); 
    } 
    $unit->run(isset($result['Body']), true, "Got $key"); 
} 

'debug' => true場合、S3Clientは関係なく、それがファイルを見つけたかどうかの応答に大量のデータをダンプします。回避策として、debugオプションを設定して、デバッグ出力で空の関数を呼び出すことができます。それにもかかわらず、これは恒久的な解決策のようには見えません。

他に誰かがこの問題を抱えていますか?より良い回避策がありますか?

+0

結果がない場合は、 '$ result'が' null'になると思いますか? – Pitchinnate

+0

@Pitchinnateそれは決して戻らない。 –

+0

ええ、ドキュメントを見ても、 'getObject()'メソッドの戻りエラーはありません。 'GetObjectAcl()'に 'NoSuchKey'というエラーがありますので、キーが存在することを確認してから' getObject() 'を呼び出してください。 – Pitchinnate

答えて

0

"aws/aws-sdk-php": "2.8.22"を使用しており、この場合は例外NoSuchKeyExceptionがあります。ここに私たちのコードは:

private function fileExists($bucket, $key) 
{ 
    try { 
     $o = $this->s3->getObject([ 
      'Bucket' => $bucket, 
      'Key' => $key, 
     ]); 
     return $o; 
    } catch (\Aws\S3\Exception\NoSuchKeyException $e) { 
     return false; 
    } 
} 

"aws/aws-sdk-php" "3.20.13"で唯一の違いは、それがNoSuchKeyExceptionが、Aws\S3\Exception\S3Exceptionはないスローということです。

Btw、バケツポリシーを確認してください。私の方針:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "ACZ", 
      "Effect": "Allow", 
      "Principal": "*", 
      "Action": [ 
       "s3:PutObject", 
       "s3:GetObject", 
       "s3:DeleteObject" 
      ], 
      "Resource": "arn:aws:s3:::my.own.bucket/*" 
     } 
    ] 
} 
+0

また、バージョン "aws/aws-sdk-php" "3.20.13" 'で動作し、例外' \ Aws \ S3 \ Exception \ S3Exception'をスローします。 –

+0

ありがとう、@ VladimirKovpak。私は明日仕事をするときにバケットポリシーを見上げます。私はS3をセットアップせず、直接AWSアカウントを持っていません。私は同僚に依存しています。 –

関連する問題