В настоящее время я столкнулся с проблемой доступа к объектам в моей корзине AWS S3 с использованием пользователя IAM, которому были предоставлены определенные разрешения. Вот краткий обзор моей установки:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowUserAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::XXXXXXXXXX:user/eskoloAppUsers"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::eskolo-dev-bucket/*"
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListPolicy",
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::eskolo-dev-bucket"
]
},
{
"Sid": "ManipulatePolicy",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:DeleteObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::eskolo-dev-bucket/*"
]
}
]
}
public static async Task<bool> DoesS3ObjectExistAsync(AwsSettings awsSettings, string key)
{
try
{
using var s3Client = new AmazonS3Client(
awsSettings.AccessKey,
awsSettings.SecretKey,
awsSettings.Region);
var request = new GetObjectMetadataRequest
{
BucketName = awsSettings.Bucket,
Key = key
};
await s3Client.GetObjectMetadataAsync(request);
return true;
}
catch (AmazonS3Exception e)
{
if (e.StatusCode == HttpStatusCode.NotFound)
return false;
throw;
}
Appsettings.json
"AwsSettings": {
"AccessKey": "xxxxxxxxxx",
"Bucket": "eskolo-dev-bucket",
"LogoUri": "s3://eskolo-dev-bucket/development/assets/",
"Region": "eu-north-1",
"SecretKey": "xxxxxxx",
"TemplateUri": "s3://eskolo-dev-bucket/development/email-templates/"
}
Примечание: вам не нужно использовать политику сегмента в вашей ситуации. Предоставления разрешения через пользователя IAM достаточно, чтобы предоставить доступ к сегменту. Политика сегмента обычно используется только для предоставления доступа ВСЕМ пользователям или для доступа к нескольким учетным записям.
Привет @JohnRotenstein, я добавил код .Net. Спасибо за вашу помощь.
Какое значение key
передается в функцию DoesS3ObjectExistAsync()
?
@JohnRotenstein - ключ development/email-templates/e-Skolo-OTP-template.hbs
Чтобы проверить вашу политику, я сделал следующее:
programmer-in-the-making
с настройками по умолчанию.{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListPolicy",
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::programmer-in-the-making"
]
},
{
"Sid": "ManipulatePolicy",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:DeleteObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::programmer-in-the-making/*"
]
}
]
}
aws configure --profile progammer-in-the-making
.% aws s3 ls s3://programmer-in-the-making --profile programmer-in-the-making
2024-07-04 12:37:30 54741 ghost.gif
% aws s3api head-object --bucket programmer-in-the-making --key ghost.gif --profile programmer-in-the-making
{
"AcceptRanges": "bytes",
"LastModified": "2024-07-04T02:37:30+00:00",
"ContentLength": 54741,
"ETag": "\"131ca58bc2049ab827b0d6b21b746347\"",
"ContentType": "image/gif",
"ServerSideEncryption": "AES256",
"Metadata": {}
}
(Я использовал head-object
как ближайшую к GetObjectMetadataAsync()
операцию AWS CLI, которую вы используете.)
Запросы AWS CLI были успешными, что доказывает, что политика достаточна для доступа к объектам в корзине.
Затем я попробовал другие команды, чтобы убедиться, что разрешения ограничены разрешениями, предоставленными в корзине:
% aws s3 ls --profile programmer-in-the-making
An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied
Следовательно, любая проблема заключается либо в вашем коде, либо в вашем ключе доступа/секретном ключе. Разрешения IAM, предоставленные в политике, верны.
Вы правы, проблема заключалась в коде .Net. Я изо всех сил пытался получить правильную документацию для .AWS S3 SDK для .Net, поэтому использовал неправильный код.
Можете ли вы показать нам код, который вы используете? Обычно вызовы AWS SDK не используют формат
s3://eskolo-dev-bucket/development/email-templates/e-Skolo-OTP-template.hbs
. Вместо этого вы должны указать имя сегмента и ключ в отдельных полях.