2014-11-23 5 views
3

Я хочу иметь возможность обслуживать URL-адреса для клиента, которые являются «подписанными» и поэтому относятся только к 24 часам (например). Однако, я не хочу называть S3 для каждого URL сгенерированного:Защищенный URL-адрес Amazon S3 на уровне ковша

AWS::S3::S3Object.new(bucket, name).url_for(:read, :secure => true, :expires => expires_in).to_s 

Вместо этого я хочу, чтобы сгенерировать URL по себе (у меня есть имя файла и ссылка ведра, я могу построить его сам) ,

Однако я хочу подписать URL-адрес на уровне ковша (скажем, один раз в день для всех файлов в данном ковше). Это возможно?

ответ

3

Когда вы создаете предварительно подписанный URL-адрес, это делается полностью локально. Вы можете сделать это «самостоятельно», но гораздо проще использовать SDK, и практических различий не будет. Посмотрите, что на значении S3 API нет никаких признаков.

Однако вы не можете подписаться на уровне «ковша», поскольку подпись проверяется на объект. Я считаю, что подписание целого ведра было бы невозможным.

+1

Линия, которую я извлек выше, является фактическим звонком на амазонку, чтобы получить подписанный токен. Насколько я могу судить, он не является местным. –

+1

Вы можете контролировать свою сеть или проверять источник (https://github.com/aws/aws-sdk-ruby/blob/b54a5561180c7eaae14e2a8ac440ce4a48c8de8f/lib/aws/s3/s3_object.rb), этот вызов метода разрешен локально и делает не вызывать удаленный сервис. –

+2

Мой бог. У меня было «bucket.blank»? в моем коде, что вызвало вызов AWS - https://github.com/aws/aws-sdk-ruby/blob/b54a5561180c7eaae14e2a8ac440ce4a48c8de8f/lib/aws/s3/bucket.rb#L252 Я даже не рассматривал это ... спасибо. –

0

К сожалению у меня нет коды рубиновой для этого только Java ...

Но вы не сможете получить presigned URL для всей ведра, только каждый файл.

Вот эта функция, которую я создал. Это напечатает все для вас. Имеет ли смысл процесс?

private static URI GetURL(AmazonS3Client amazonS3Client, S3ObjectSummary s3ObjectSummary) throws URISyntaxException { 
    return amazonS3Client.generatePresignedUrl(
      new GeneratePresignedUrlRequest(s3ObjectSummary.getBucketName(), s3ObjectSummary.getKey()) 
      .withMethod(HttpMethod.GET) 
      .withExpiration(GetExperation())).toURI(); 
} 

public static void run(String accessKey, String secretKey, String bucketName) { 

    AmazonS3Client amazonS3Client = new AmazonS3Client(new BasicAWSCredentials(accessKey, secretKey)); 
    amazonS3Client.listObjects(bucketName) 
      .getObjectSummaries() 
      .stream() 
      .forEach(s3ObjectSummary 
        -> System.out.println(GetURL(amazonS3Client, s3ObjectSummary).toString())); 
} 
Смежные вопросы