标签: aws-java-sdk

Amazon DynamoDB putItem 返回 null

我正在使用 AmazonDynamoDBClient putItem 方法在数据库中插入项目。putItem 的返回类型是 PutItemResult 但我将其获取为 null。

AmazonDynamoDBClient client = new AmazonDynamoDBClient();
PutItemRequest r = new PutItemRequest();
r.addItemEntry("custId",new Attribute Value("101"));
PutItemResult result = client.putItem(r);
//result is null
Run Code Online (Sandbox Code Playgroud)

项目已成功插入数据库,但为什么结果为空?

amazon-dynamodb aws-java-sdk

4
推荐指数
1
解决办法
3582
查看次数

使用预签名 URL 从 AWS s3 读取文件内容

我正在尝试使用 AWS Java Sdk 从 s3 存储桶读取并打印文件的内容。我有一个预先签名的 URL,可让我访问(和下载)该文件。但是,我无法使用预签名 URL 读取该文件。

我想做一些类似于下面的代码片段的事情 -

public void readFromS3(String bucketName, String key) throws IOException {
S3Object s3object = s3.getObject(new GetObjectRequest(bucketName, key));
System.out.println(s3object.getObjectMetadata().getContentType());
System.out.println(s3object.getObjectMetadata().getContentLength());

BufferedReader reader = new BufferedReader(new InputStreamReader(s3object.getObjectContent()));

String line;

while((line = reader.readLine()) != null) {
// can copy the content locally as well
// using a buffered writer

System.out.println(line);
}
}
Run Code Online (Sandbox Code Playgroud)

我可以访问的 URL 可让我下载该文件。

我还查看了以下参考资料,但没有成功 -

http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3Client.html

http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/model/GetObjectRequest.html

有人可以帮忙吗?

提前致谢!

amazon-s3 amazon-web-services aws-java-sdk

4
推荐指数
1
解决办法
7765
查看次数

AWS Java - 如何加载 ~/.aws/config 文件?

我已经阅读文档有一段时间了。我可以看到 JavaScript 和 Go SDK 的示例,它们展示了如何通过将AWS_SDK_LOAD_CONFIG环境变量设置为真值来加载配置文件。文档分别位于此处此处

但是,根据我的要求,我必须使用Java。我在 Java SDK 中找不到等效的参考。这让我做出三件事假设。

  1. Java的SDK不使用这个变量
    • 我很确定情况可能是这样,因为仅仅尝试似乎并没有让它发挥作用。
    • 更新:检查Java SDKJava SDK V2并搜索ack -i "AWS_SDK_LOAD_CONFIG"显示两个项目都没有使用此变量。
  2. Java的SDK使用不同的变量
    • 我认为这不太可能,因为它与其他两个 SDK 不一致。
  3. Java 的 SDK 希望您以编程方式执行此操作。
    • 似乎最有可能,但我找不到如何做到这一点。我一定是使用了错误的关键词或者忽略了某些东西才会出现这种行为。

为了清楚起见,我需要加载的配置文件是sbx,它位于我的配置中,但在凭据文件中没有相邻值。这是我的 ~/.aws/config 文件:

[profile shared]
output = json
region = us-west-2
adfs_config.ssl_verification = True
adfs_config.role_arn = ....
adfs_config.adfs_host = ....
adfs_config.adfs_user = ....

[profile sbx]
role_arn = ... (this is different from the adfs_config.role_arn above)
source_profile = shared
region …
Run Code Online (Sandbox Code Playgroud)

java amazon-web-services aws-java-sdk

4
推荐指数
1
解决办法
5589
查看次数

S3下载pdf - REST API

我正在尝试使用Spring Boot Rest API提供存储在S3上的一个PDF.

以下是我的代码:

        byte[] targetArray = null;

        InputStream is = null;

        S3Object object = s3Client
                    .getObject(new GetObjectRequest("S3_BUCKET_NAME", "prefixUrl"));

        InputStream objectData = object.getObjectContent();

    BufferedReader reader = new BufferedReader(new InputStreamReader(objectData));

    char[] charArray = new char[8 * 1024];
    StringBuilder builder = new StringBuilder();
    int numCharsRead;
    while ((numCharsRead = reader.read(charArray, 0, charArray.length)) != -1) {

        builder.append(charArray, 0, numCharsRead);
    }
    reader.close();

    objectData.close();
    object.close();
    targetArray = builder.toString().getBytes();

    is = new ByteArrayInputStream(targetArray);


    return ResponseEntity.ok().contentLength(targetArray.length).contentType(MediaType.APPLICATION_PDF)
                    .cacheControl(CacheControl.noCache()).header("Content-Disposition", "attachment; filename=" + "testing.pdf")
                    .body(new InputStreamResource(is));
Run Code Online (Sandbox Code Playgroud)

当我使用邮递员点击我的API时,我能够下载PDF文件,但问题是它完全是空白的.可能是什么问题?

S3流数据并不保留缓冲区,数据是二进制(PDF),因此如何使用Rest API将这些数据服务器.

怎么解决这个?

amazon-s3 aws-sdk aws-java-sdk

4
推荐指数
1
解决办法
2559
查看次数

在 AW Athena 中以批量方式执行一组查询

我正在尝试使用 aws-java-sdk-athena 批量执行 AWS Athena 查询。我能够建立连接,单独运行查询,但不知道如何批量运行 3 个查询。任何帮助表示赞赏。

询问

 1.select * from table1 limit 2
 2.select * from table2 limit 2
 3.select * from table3 limit 2
Run Code Online (Sandbox Code Playgroud)

batch-processing amazon-web-services aws-java-sdk amazon-athena

4
推荐指数
1
解决办法
7038
查看次数

如何检查存储桶是否已存在于 AWS S3 中

如何使用 Java SDK 检查存储桶是否已存在于我的 Aws S3 帐户中?

使用下面的代码

        AmazonS3ClientBuilder.defaultClient().doesBucketExistV2(bucketName);
Run Code Online (Sandbox Code Playgroud)

检查存储桶的全局存在,如果具有此名称的存储桶全局存在,即使我不是此存储桶的所有者或我无权访问该存储桶,也返回 true。

我理解以这种方式制作此方法的意图,以便它允许我们确定存储桶名称的可用性,但这不是我所需要的。当然,它会抛出异常,我以后无法访问它,但它会返回声明具有此名称的存储桶存在。

我想检查我的 S3 帐户中是否存在具有给定名称的存储桶,以便我可以对其执行操作。

一种可能的解决方案可以是list所有存储桶并在返回的列表中搜索我的存储桶,我觉得这在性能方面不是很好(如果我错了,请纠正我),因为可能有成千上万的存储桶并在其中搜索他们效率不高。

如何在不检查全局存在的情况下确定存储桶是否存在于我的 S3 帐户中

amazon-s3 amazon-web-services aws-java-sdk aws-java-sdk-2.x

4
推荐指数
1
解决办法
2104
查看次数

aws s3 java sdk 列表对象

我有这样的结构:

common/test/v20170522/part-0001.snappy
common/test/v20170522/part-0002.snappy
common/test/v20170522/part-0003.snappy
common/test/v20170522/part-0004.snappy
common/test/v20170622/part-0001.snappy
common/test/v20170622/part-0002.snappy
common/test/v20170622/part-0003.snappy
common/test/v20170622/part-0004.snappy
Run Code Online (Sandbox Code Playgroud)

还有更多版本文件夹,其中有更多文件。我基本上想要文件夹中所有文件夹的列表test/common: so v20170522, v20170622, etc

这是我到目前为止所拥有的:

ListObjectsRequest listObjectsRequest = new ListObjectsRequest();
listObjectsRequest.setBucketName("common");
listObjectsRequest.setPrefix("test/");
listObjectsRequest.setDelimiter("/");
Run Code Online (Sandbox Code Playgroud)

这只会返回common/test文件夹中的文件,而不是文件夹。当我删除分隔符时,我得到所有文件夹的所有子文件。有办法做到这一点吗?

amazon-web-services aws-java-sdk

3
推荐指数
1
解决办法
1559
查看次数

在适用于 AWS Kinesis 的 KCL Java 库的情况下,如何使用 requestShutdown 和 shutdown 来正常关闭

我正在尝试使用 Java 中 KCL 库的新功能来实现 AWS Kinesis 的正常关闭,方法是注册关闭钩子以停止所有记录处理器,然后正常停止工作进程。新库提供了记录处理器需要实现的新接口。但它是如何被调用的呢?

尝试先调用worker.requestShutdown(),然后调用worker.shutdown(),它起作用了。但这是使用它的任何预期方式吗?那么两者都有什么用,有什么好处呢?

java aws-java-sdk amazon-kcl amazon-kinesis-firehose

3
推荐指数
1
解决办法
3992
查看次数

Cognito SRP 身份验证 JAVA SDK

我正在尝试使用 Cognito 对 Java 应用程序进行身份验证。我在 python 中使用了运行良好的保证库。但我现在想在java中做同样的事情。

我用我的 Python 函数对保证库进行身份验证

def SRPauthentication(organizationAdmin,
                     password,
                     pool_id,
                     client_id,
                     client):
    aws = AWSSRP(username=organizationAdmin,
                 password=password,
                 pool_id=pool_id,
                 client_id=client_id,
                 client=client)
    tokens = aws.authenticate_user()
    authorization_token= tokens['AuthenticationResult']['IdToken']
    return authorization_token 
Run Code Online (Sandbox Code Playgroud)

有了这个,我可以轻松访问一些安全的 API。现在我想用 Java 做同样的事情,但我有问题。

到目前为止,这是我的解决方案是这种方法:

  public static void GetCreds()
      {

          AWSCognitoIdentityProvider identityProvider = AWSCognitoIdentityProviderClientBuilder.defaultClient();
          AdminInitiateAuthRequest adminInitiateAuthRequest = new AdminInitiateAuthRequest().
                  withAuthFlow(AuthFlowType.USER_SRP_AUTH).
                  withClientId("234234234234").withUserPoolId("eu-central-1_sdfsdfdsf")
                  .addAuthParametersEntry("USERNAME", "UserK").
                   addAuthParametersEntry("PASSWORD","#######);

          adminInitiateAuthRequest.getAuthFlow();
          AdminInitiateAuthResult adminInitiateAuth = identityProvider.adminInitiateAuth(adminInitiateAuthRequest);
            System.out.println(adminInitiateAuth.getAuthenticationResult().getIdToken());
      }
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我得到一个异常:

Exception in thread "main" `com.amazonaws.services.cognitoidp.model.AWSCognitoIdentityProviderException: User: arn:aws:iam::XXXXXXXXXXXXXXXXX:user/khan is not authorized to perform: cognito-idp:AdminInitiateAuth on resource: arn:aws:cognito-idp:eu-central-1:XXXXXXXX:userpool/eu-central-1_XXXXXXX …
Run Code Online (Sandbox Code Playgroud)

java amazon-web-services srp-protocol amazon-cognito aws-java-sdk

3
推荐指数
1
解决办法
3990
查看次数

返回在 REST 控制器中包装 S3Object.getObjectContent() 的 ResponseEntity<InputStreamResource> 是否安全?

我正在开发一个 Spring Boot 应用程序,它应该允许用户通过指定的应用程序 REST 接口间接从 Amazon S3 下载文件。为此,我有一个 REST-Controller,它向用户返回一个 InputStreamResource,如下所示:

@GetMapping(path = "/download/{fileId}")
public ResponseEntity<InputStreamResource> downloadFileById(@PathVariable("fileId") Integer fileId) {
    Optional<LocalizedFile> fileForDownload = fileService.getConcreteFileForDownload(fileId);

    if (!fileForDownload.isPresent()) {
        return ResponseEntity.notFound().build();
    }

    return ResponseEntity.ok()
            .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileForDownload.get().getFilename())
            .body(new InputStreamResource(fileService.download(fileForDownload.get())));
}
Run Code Online (Sandbox Code Playgroud)

文件服务中的下载方法如下:

@Override
public InputStream download(LocalizedFile file) {
    S3Object obj = s3client.getObject(bucketName, file.getFilename());
    return obj.getObjectContent();
}
Run Code Online (Sandbox Code Playgroud)

我担心的是,来自 Amazon SDK 的输入流无法在控制器中显式关闭。getObjectContent() 方法的 AWS 文档中有以下警告,这让我对上述方法是否成功表示怀疑:

如果您检索 S3Object,则应尽快关闭此输入流,因为对象内容不会在内存中缓冲并直接从 Amazon S3 进行流式传输。此外,未能关闭此流可能会导致请求池被阻塞。

因此我的问题是:返回ResponseEntity<InputStreamResource>控制器是否安全?下载成功后这个InputStream会S3Object.getObjectContent()自动关闭吗?到目前为止,我的方法很成功,但我不太确定未来可能产生的后果。

java amazon-s3 spring-boot aws-java-sdk

3
推荐指数
1
解决办法
1975
查看次数