我正在尝试重构一些代码以允许上传大图像。 最初,图像以lambda函数存储在S3中,并且在PROD中效果很好。现在,我已经从函数中提取了该部分,并尝试通过适用于AWS的Java SDK来实现。
这在DEV环境中效果很好,因为存储桶在此处是公共的。当我使用PROD设置对此进行测试时。我收到拒绝访问错误。
存储桶在PROD中是私有的,用户可以访问所有S3操作。 我可以使用AWS CLI访问存储桶,但是当我使用AWS Java SDK尝试存储桶时,出现“访问被拒绝”错误。这是Java中的代码。尽管我知道该区域是默认区域,但我已经明确设置了该区域以确保它得到正确的区域。
BasicAWSCredentials awsCreds = new BasicAWSCredentials(AWS_ACCESS_KEY, AWS_SECRET_KEY);
AmazonS3 s3client = AmazonS3ClientBuilder.standard()
.withRegion(Regions.US_EAST_1)
.withCredentials(new AWSStaticCredentialsProvider(awsCreds))
.build();
String imageS3Url = null;
ObjectMetadata d = new ObjectMetadata();
try {
s3client.putObject(new PutObjectRequest(S3_BUCKET_NAME, s3Key, stream, d));
imageS3Url = "https://s3-"+ S3_REGION_NAME +".amazonaws.com/" + S3_BUCKET_NAME +"/"+ s3Key;
}catch(Exception ex) {
log.debug(ex.getMessage());
}
我是否缺少任何配置来授予对AWS Java SDK的访问权限以访问S3存储桶? AWS Java SDK版本为1.11.411。
以下是存储桶和IAM用户策略的匿名版本:
{
"Version": "2012-10-17",
"Id": "PolicyABC”,
"Statement": [
{
"Sid": "Stmt123”,
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789:user/user-name”
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::bucket-name”
}
]
}
IAM用户策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::bucket-name”,
"arn:aws:s3:::bucket-name/*”
]
}
]
}