Я работаю над AWS EC2 Ubuntu Machine и пытаюсь получить изображение с AWS S3, но после этого мне все время показывают ошибку.
<Error> <Code>InvalidArgument</Code> <Message> Requests specifying Server Side Encryption with AWS KMS managed keys require AWS Signature Version 4. </Message> <ArgumentName>Authorization</ArgumentName> <ArgumentValue>null</ArgumentValue> <RequestId>7C8B4BF1CE2FDC9E</RequestId> <HostId> /L5kjuOET4XFgGter2eFHX+aRSvVm/7VVmIBqQE/oMLeQZ1ditSMZuHPOlsMaKi8hYRnGilTqZY= </HostId> </Error>
Вот моя политика в корзине
{ "Version": "2012-10-17", "Id": "Policy1441213815928", "Statement": [ { "Sid": "Stmt1441213813464", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::mytest.sample/*" } ] }
Вот код
require 'aws-autoloader.php'; $credentials = new Aws\Credentials\Credentials('key', 'key'); $bucketName = "mytest.sample"; $s3 = new Aws\S3\S3Client([ 'signature' => 'v4', 'version' => 'latest', 'region' => 'ap-southeast-1', 'credentials' => $credentials, 'http' => [ 'verify' => '/home/ubuntu/cacert.pem' ], 'Statement' => [ 'Action ' => "*", ], ]); $result = $s3->getObject(array( 'Bucket' => $bucketName, 'Key' => 'about_us.jpg', ));
Html
<img src="<?php echo $result['@metadata']['effectiveUri']; ?>" />
Изменить для Майкла – sqlbot: здесь я использую KMS по умолчанию.
try { $result = $this->Amazon->S3->putObject(array( 'Bucket' => 'mytest.sample', 'ACL' => 'authenticated-read', 'Key' => $newfilename, 'ServerSideEncryption' => 'aws:kms', 'SourceFile' => $filepath, 'ContentType' => mime_content_type($filepath), 'debug' => [ 'logfn' => function ($msg) { echo $msg . "\n"; }, 'stream_size' => 0, 'scrub_auth' => true, 'http' => true, ], )); } catch (S3Exception $e) { echo $e->getMessage() . "\n"; }
дайте мне знать, если вам нужно больше.
Я также сталкиваюсь с этой проблемой с помощью aws:kms
encyrption. Я предлагаю, чтобы, если вы хотели использовать ключ kms
вам нужно создать свой kms key
в IAM section of AWS Console
. Я обожаю рекомендуемое шифрование на стороне сервера AES256
, здесь S3 автоматически шифрует ваши данные во время установки и дешифрования при получении объекта. Пожалуйста, перейдите по ссылке: S3 Server Side encryption с AES256
Мое решение изменяет эту строку 'ServerSideEncryption' => 'aws:kms' with 'ServerSideEncryption' => 'AES256'
try { $result = $this->Amazon->S3->putObject(array( 'Bucket' => 'mytest.sample', 'ACL' => 'authenticated-read', 'Key' => $newfilename, 'ServerSideEncryption' => 'AES256', 'SourceFile' => $filepath, 'ContentType' => mime_content_type($filepath), 'debug' => [ 'logfn' => function ($msg) { echo $msg . "\n"; }, 'stream_size' => 0, 'scrub_auth' => true, 'http' => true, ], )); } catch (S3Exception $e) { echo $e->getMessage() . "\n"; }
Пожалуйста, также обновите свою политику ведра с помощью json, это предотвратит загрузку объекта с использованием AES256
{ "Sid": "DenyUnEncryptedObjectUploads", "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::yourbucketname/*", "Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "AES256" } } }
PHP sdk v2
Aws\Common\Credentials
S3Client
вам нужен завод Попробуйте что-то вроде этого
use Aws\S3\S3Client; use Aws\Common\Credentials\Credentials; $credentials = new Credentials('YOUR_ACCESS_KEY', 'YOUR_SECRET_KEY'); // Instantiate the S3 client with your AWS credentials $s3Client = S3Client::factory(array( 'signature' => 'v4', 'region' => 'ap-southeast-1', 'credentials' => $credentials, ..... ]); )
Если это не сработает, вы можете попытаться явно объявить объект SignatureV4
use Aws\S3\S3Client; use Aws\Common\Credentials\Credentials; use Aws\Common\Signature\SignatureV4; $credentials = new Credentials('YOUR_ACCESS_KEY', 'YOUR_SECRET_KEY'); // Instantiate the S3 client with your AWS credentials $s3Client = S3Client::factory(array( 'signature' => new SignatureV4(), 'region' => 'ap-southeast-1', 'credentials' => $credentials, ..... ]); )
Если вы переходите на sdk v3
signature_version
(вместо signature
) как параметр, когда вы объявляете свой клиент s3 Statement
не является допустимым параметром ( http://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/configuration.html#signature-version ) debug
чтобы получить больше результатов Это будет выглядеть так
$s3 = new Aws\S3\S3Client([ 'signature_version' => 'v4', 'version' => 'latest', 'region' => 'ap-southeast-1', 'credentials' => $credentials, 'http' => [ 'verify' => '/home/ubuntu/cacert.pem' ], 'debug' => true ]);
см. полный список доступных параметров