java - 如何将我的 AWS CLI 命令转换为 AWS Java API 代码?
问题描述
我有一段代码在 HTTP 服务器中经常被调用。我得到管道上的响应并使用输出字符串。但显然将其用作 AWS CLI 管道作为 bash 脚本可能不是很有效。
这些命令的 AWS JAVA API 等价物是什么?如何转换它们?它是否提高了效率、访问延迟等?
public void run() {
String command = "aws --endpoint-url=" + S3server + " s3 cp s3://file-store/" + id + "/files/" + id + ".txt -";
processBuilder.command("sh", "-c", command + " ; true");
Process process = processBuilder.start();
//String command2 = "aws --endpoint-url=https://s3-ourserver.mystore.mycompany.net s3api head-object --bucket file-store --key FILES/3762/files/mytext.scc --query 'ContentLength'";
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
BufferedReader readerErrors = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line;
while ((line = reader.readLine()) != null) {
response += line + "\n";
}
//...send the response back via HTTP
OutputStream os = he.getResponseBody();
os.write(response.toString().getBytes());
os.close();
}
解决方案
从 V2 Java SDK 中的 S3 读取的超级简单的内容如下所示:
Region region = Region.US_WEST_2;
String bucketName = "file-store";
S3Client s3Client = S3Client.builder().region(region).build();
...
GetObjectRequest getObjectRequest = GetObjectRequest.builder()
.bucket(bucketName)
.key(id + "/files/" + id + ".txt")
.build();
OutputStream os = he.getResponseBody();
s3Client.getObject(getObjectRequest, ResponseTransformer.toOutputStream(outputStream));
os.close();
这将从 S3 下载文件并将字节直接写入 HTTP 响应中的输出流。如果您非常频繁地执行此操作,那么S3Client
应该在您进行读取的位置(即构造函数)之外创建并重用。
现在,这比你展示的更快吗?我强烈希望它会是,但我没有办法在你运行的负载下测试它。
另一种选择可能是创建客户端会请求的预签名 URL,然后他们可以直接从 S3 下载文件,而不通过您的服务器。我不确定这是否适用于您的用例。
编辑 我强烈建议您深入研究AWS Java SDK 文档,并针对您的用例,深入研究S3 示例。但在那之前,下面是一个获取文件的简单程序和两种不同的获取内容长度的方法。这个使用本地凭据 - 您的用例可能会有所不同。
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
import software.amazon.awssdk.core.exception.SdkClientException;
import software.amazon.awssdk.core.sync.ResponseTransformer;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.GetObjectResponse;
import software.amazon.awssdk.services.s3.model.HeadObjectRequest;
import software.amazon.awssdk.services.s3.model.HeadObjectResponse;
import software.amazon.awssdk.services.s3.model.NoSuchKeyException;
import software.amazon.awssdk.services.s3.model.S3Exception;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class DownloadObjectV2 {
public static void main(String[] args) {
Region region = Region.US_EAST_1;
String bucketName = "the-bucket-name";
String fileObjKeyName = "file.txt";
String fileName = "/tmp/file.txt";
long startTime = System.currentTimeMillis();
try {
S3Client s3 = S3Client.builder()
.region(region)
.credentialsProvider(ProfileCredentialsProvider.create("profile-name"))
.build();
// get meta data about the object without downloading it
HeadObjectRequest headObjectRequest = HeadObjectRequest.builder()
.bucket(bucketName)
.key(fileObjKeyName)
.build();
HeadObjectResponse headObjectResponse = s3.headObject(headObjectRequest);
System.out.println("object is " + headObjectResponse.contentLength() + " bytes long from head call");
// get the object, save it to a file
GetObjectRequest getObjectRequest = GetObjectRequest.builder()
.bucket(bucketName)
.key(fileObjKeyName)
.build();
OutputStream outputStream = new FileOutputStream(fileName);
GetObjectResponse getObjectResponse = s3.getObject(getObjectRequest, ResponseTransformer.toOutputStream(outputStream));
// meta data is also available from the GetObjectResponse
System.out.println("object is " + getObjectResponse.contentLength() + " bytes long from get call");
}
catch( NoSuchKeyException nske ) { // bad key name
System.out.println( "the key does not exist" );
}
catch( S3Exception s3e ) { // errors like bad credentials
System.out.println( "a general s3 exception occurred: ");
s3e.printStackTrace();
}
catch( SdkClientException sce ) { // other errors
System.out.println( "a sdk exception occurred: ");
sce.printStackTrace();
}
catch( Exception e ) {
e.printStackTrace();
}
System.out.println( "run took " + (System.currentTimeMillis() - startTime) + "ms");
System.exit(0);
}
}
推荐阅读
- javascript - 如何分解 openweathermap API 返回的这个长字符串?
- python - 数据框,在 jupyter notebook 中导入 csv 文件
- javascript - 在 React Native 中的对象中添加对象
- sql-server - 避免基于两个字段的表重复的最佳 SQL 语句,但也列出其余字段
- reactjs - React:HashRouter 未在 Electron 上重新加载页面
- r - R EWMA 功能
- java - 了解 Android TV 活动生命周期
- azure-devops - 指定子区域时看不到 DevOps KanBan 中的错误
- datatables - 显示 DataTables 警告:table id=example1 - 无法重新初始化 DataTable
- wpf - 预览和运行程序的区别