java - (Permission denied)] 将文件上传到 Amazon S3 时发生
问题描述
我正在尝试将文件上传到 Amazon S3。它在我的本地运行良好,但是在部署在 Elastic Beanstalk 中时出现权限被拒绝错误。
我的代码:
public String uploadFileToS3BucketTemp(ByteArrayOutputStream baos, boolean enablePublicReadAccess, String filename, String path)
{
LocalDateTime localDate = LocalDateTime.now();
String currentDateTime = CommonFunctions.customDateFormatter(CommonFunctions.getCurrentDateTime(), "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd");
Date date = new Date();
//Pattern for showing milliseconds in the time "SSS"
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
String str = sdf.format(date);
String time = str.split("\\s")[1].split("\\.")[0];
String currentTime = time.replaceAll(":", "-");
String fileName = filename+"-"+currentDateTime+"-"+ currentTime +".xls";
String filePath = "";
try {
File file = new File(filePath+fileName);
FileOutputStream fos = new FileOutputStream(file);
baos.writeTo(fos);
fos.close();
InputStream is=new FileInputStream(file);
s3Client.putObject(new PutObjectRequest(bucketName, path+"/"+fileName, is, new ObjectMetadata()));
} catch (IOException | AmazonServiceException ex) {
logger.error("error [" + ex.getMessage() + "] occurred while uploading [" + fileName + "] ");
}
String url = signedUrl(path+"/"+fileName);
return url;
}
在检查服务器日志时,它向我显示以下错误:
ERROR 25491 (Permission denied)] occurred while uploading
存储桶不是公开的。ElasticBeantsalk 具有具有 AmazonS3FullAccess 权限的 IAM 角色
解决方案
“我在 Elastic Beanstalk 中部署时收到权限被拒绝错误。”
您可以参考 AWS 示例,这些示例描述了如何使用使用 Java 编写的 Web 应用程序将给定文件从桌面上传到 Amazon S3 存储桶。由于使用了 Java(Spring BOOT 应用程序),因此您可以使用 AWS SDK for Java V2。
使用适用于 Java 的 AWS 开发工具包创建示例 AWS 照片分析器应用程序
在此示例中,请注意应用程序已部署到 Elastic Beanstalk。Amazon S3 服务客户端的创建方式如下:
S3Client s3 = S3Client.builder()
.credentialsProvider(EnvironmentVariableCredentialsProvider.create())
.region(region)
.build();
在 Elastic Beanstalk 上,您可以通过定义以下变量将您的凭据设置为具有 Amazon S3 权限的 IAM 角色:
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
现在,您可以使用 S3 服务客户端使用以下 Java 逻辑将文件放入 Amazon S3 存储桶:
// Places an image into a S3 bucket.
public String putObject(byte[] data, String bucketName, String objectKey) {
s3 = getClient();
try {
PutObjectResponse response = s3.putObject(PutObjectRequest.builder()
.bucket(bucketName)
.key(objectKey)
.build(),
RequestBody.fromBytes(data));
return response.eTag();
} catch (S3Exception e) {
System.err.println(e.getMessage());
System.exit(1);
}
return "";
}
推荐阅读
- huawei-mobile-services - 如何查看华为AppGallery中发布的应用仅适用于HMS设备,不适用于GMS+HMS设备
- r - 用句号替换逗号的问题
- php - PHP直接回显对象的date_format
- python - 将函数应用于熊猫数据框的某些列组
- python - 如何从 Android 中的 TensorOutput TFLite 模型中提取边界框的信息?
- reactjs - 如何让 react-router 从历史 API 中获取更新
- lwip - 编译 LwIP 时如何修复编译错误
- java - maven build 无法下载 com.lowagie:itext:jar:2.1.7.js6 依赖项
- ios - 当我的视图加载时,Swift Ui Firebase 数组为空
- javascript - getCoordinates() 函数返回错误的坐标