我的问题是关于我存储在具有存储类冰川的S3存储桶中的数据。我想使用最快的选项进行检索,但是找不到合适的方法来实现。似乎默认请求正在使用标准检索选项。
在aws文档中,我找到了一种还原数据的好方法。
在here中,我有以下代码示例:
import java.io.IOException;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.RestoreObjectRequest;
public class RestoreArchivedObject {
public static void main(String[] args) throws IOException {
String clientRegion = "*** Client region ***";
String bucketName = "*** Bucket name ***";
String keyName = "*** Object key ***";
try {
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
.withCredentials(new ProfileCredentialsProvider())
.withRegion(clientRegion)
.build();
// Create and submit a request to restore an object from Glacier for two days.
RestoreObjectRequest requestRestore = new RestoreObjectRequest(bucketName, keyName, 2);
s3Client.restoreObjectV2(requestRestore);
// Check the restoration status of the object.
ObjectMetadata response = s3Client.getObjectMetadata(bucketName, keyName);
Boolean restoreFlag = response.getOngoingRestore();
System.out.format("Restoration status: %s.\n",
restoreFlag ? "in progress" : "not in progress (finished or failed)");
}
catch(AmazonServiceException e) {
// The call was transmitted successfully, but Amazon S3 couldn't process
// it, so it returned an error response.
e.printStackTrace();
}
catch(SdkClientException e) {
// Amazon S3 couldn't be contacted for a response, or the client
// couldn't parse the response from Amazon S3.
e.printStackTrace();
}
}
}
那很好,很有效。但是,如果我想在以下选项之间进行选择,我找不到文档中如何设置“检索”选项:
here是AWS文档中的RestoreObjectRequest类。我在那里可以看到一个函数setType(String type)设置还原请求类型。但是,没有关于设置上述选项(1-3)之一的说明。如果有人可以告诉我是否可以使用java sdk aws进行设置,那就太好了。
编辑:
Here我可以看到setTier(String tier)应该这样做。 还原存档时要使用的数据访问层。默认为标准。
类型:枚举
有效值:加急|标准|批量
祖先:RestoreRequest现在,如果我将默认请求更改为:
RestoreObjectRequest requestRestore = new RestoreObjectRequest(bucketName, keyName, 2).withTier("Standard");
线程“ main”中的异常com.amazonaws.services.s3.model.AmazonS3Exception:您提供的XML格式不正确或未针对我们发布的架构进行验证
使用旧版本的Java sdk
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.11.386</version>
</dependency>
答案 0 :(得分:0)
可能晚了聚会,但是我发现自己陷入了同样的境地……我想Java SDK出了点问题。
通过使用所需的层定义GlacierJobParameters,然后将GlacierJobParameters添加到还原请求中,可以达到预期的结果。
一个Scala小片段似乎可以为S3生成有效的XML
val glacierJobParameters = (new GlacierJobParameters).withTier(tier)
val restoreObjectRequest =
new RestoreObjectRequest(bucketName.value, key.value, expirationInDays)
.withGlacierJobParameters(glacierJobParameters)
更新后,选中https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOSTrestore.html 我可以看到直接在RestoreObjectRequest上设置的withTier在执行SELECT查询时会创建一个有效的XML,但是对于您和我来说,我们需要GlacierJobParameters。