我有一个连接到 API 网关的 lambda 函数。 lambda 函数从 S3 获取文件。但不知何故,我没有收到来自 S3 的任何响应,并且 API 网关请求超时。您能帮我理解这里的问题吗?
我要读取的文件大小只有20B
代码:-
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setMaxErrorRetry(5);
clientConfiguration.setSocketTimeout(5000);
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
.withClientConfiguration(clientConfiguration)
.withRegion("us-east-2")
.enableForceGlobalBucketAccess()
.build();
final GetObjectRequest getObjectRequest = new GetObjectRequest(<bucketName>, <objectKey>);
log.info("Get object from bucket {}", getObjectRequest);
S3Object object = s3Client.getObject(getObjectRequest);
之后没有任何反应:
s3Client.getObject()
我尝试过异常处理,验证了存储桶名称、密钥和区域。为 s3 和 lambda 提供必要的权限。不知道还有什么问题。
您的代码不是最佳实践。您正在使用 Java V1 - 不是推荐的 V2 版本。您可以从 API Gateway 调用的 Lambda 函数读取 S3 对象。 AWS 代码库中有一个完整的无服务器教程,展示了此用例。它使用适用于 Java V2 的 AWS 开发工具包。
看那个代码:
此外 - 在 Lambda 函数中运行 AWS Java 代码时,您无需指定凭证即可使用 AWS 服务。相反 - 您使用有权调用特定 AWS 服务的角色来运行 Lambda 函数。
这是读取 S3 存储桶中的对象并返回 byte[] 的部分代码。
public class S3Service {
// Create the S3Client object.
private S3Client getClient() {
return S3Client.builder()
.region(PhotoApplicationResources.REGION)
.build();
}
public byte[] getObjectBytes(String bucketName, String keyName) {
S3Client s3 = getClient();
try {
GetObjectRequest objectRequest = GetObjectRequest
.builder()
.key(keyName)
.bucket(bucketName)
.build();
ResponseBytes<GetObjectResponse> objectBytes = s3.getObjectAsBytes(objectRequest);
return objectBytes.asByteArray();
} catch (S3Exception e) {
System.err.println(e.awsErrorDetails().errorMessage());
e.printStackTrace();
throw e;
}
}