我在EC2实例上部署了Restful API(asp .net 4.5.2),EC2实例具有访问S3存储桶的IAM角色(对存储桶的完全访问权限)。现在,当我尝试读取存储桶中的对象时,它会返回拒绝访问(403)作为响应,当我尝试通过预先签名的URL上传任何附件时,它会在我的API部署时返回AWS签名不匹配的响应在端口443上但是当API部署在任何其他端口(如80/81)上并且可以通过aws-cli访问时,它工作正常。知道为什么会这样吗?
我的代码片段用于读取对象:
using (var s3Client = new AmazonS3Client(bucketRegion))
{
ListObjectsV2Request request = new ListObjectsV2Request
{
BucketName = bucketName,
MaxKeys = 10
};
ListObjectsV2Response response;
response = s3Client.ListObjectsV2Async(request).Result;
// Process the response.
foreach (S3Object entry in response.S3Objects)
{
keyValuePairs.Add(entry.Key, entry.Size);
}
}
这可能是与EC2实例上的安全组相关的问题。你必须打开端口443(HTTPS)。如果这不起作用,则问题与另一个应用程序正在使用的端口有关。检查使用端口443的所有服务。
我需要在实例化s3Client对象时传递InstanceProfileAWSCredentials配置文件,它解决了我的问题。
var profile = new InstanceProfileAWSCredentials();
using (var s3Client = new AmazonS3Client(profile, bucketRegion))
{
ListObjectsV2Request request = new ListObjectsV2Request
{
BucketName = bucketName,
MaxKeys = 10
};
ListObjectsV2Response response;
response = s3Client.ListObjectsV2Async(request).Result;
// Process the response.
foreach (S3Object entry in response.S3Objects)
{
keyValuePairs.Add(entry.Key, entry.Size);
}
}