首页 > 解决方案 > 如何将我的 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();
}

标签: javaamazon-web-servicesaws-cliaws-java-sdkaws-java-sdk-2.x

解决方案


从 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);
    }
}

推荐阅读