Я уже некоторое время пытаюсь понять это и просто не могу заставить его работать. Я работаю над веб-приложением, в котором у меня будет пользователь, которому нужно загружать файлы в корзину S3, а затем другие пользователи смогут просматривать этот контент из корзины. Я пытался заставить загрузку ведра работать безрезультатно. Вот политики, которые я установил в IAM и S3 для моего приложения / корзины:
Ковш:
{
"Version": "2012-10-17",
"Id": "Policy1488494182833",
"Statement": [
{
"Sid": "Stmt1488493308547",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::614222560511:user/NuRenAppUser"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::nu-ren-bucket",
"arn:aws:s3:::nu-ren-bucket/*"
]
}
]
}
Пользователь IAM:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "FullAccessS3",
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::nu-ren-bucket"
]
}
]
}
У меня есть мои учетные данные в папке .aws, и клиент S3 прекрасно их подхватывает. Единственная проблема с учетными данными, в которых я не уверен, это то, что при отладке есть поле, которое говорит, что «токен» не заполняется, но большая часть документации, которую я видел, просто инструктирует ввести два ключа и регион , который я установил правильно. Вот мой код:
ASP.Net Core 2.1 Web Api:
using Amazon.Runtime;
using Amazon.S3;
using Amazon.S3.Transfer;
using Amazon.S3.Model;
using Microsoft.AspNetCore.Http;
using NuRen.Services.Abstractions;
using NuRen.Services.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace NuRen.Services.Repositories
{
public class VideoRepository : IVideoRepository
{
private IAmazonS3 _s3Client;
public VideoRepository(IAmazonS3 s3Client)
{
_s3Client = s3Client;
}
public async Task<Guid> SaveVideo(IFormFile file, Video newVideo)
{
Stream fileStream = file.OpenReadStream();
var request = new PutObjectRequest();
request.BucketName = "nu-ren-bucket";
request.Key = newVideo.ID.ToString();
request.InputStream = fileStream;
request.ContentType = file.ContentType;
request.CannedACL = S3CannedACL.PublicRead;
var response = await _s3Client.PutObjectAsync(request);
//var uploadrequest = new TransferUtilityUploadRequest()
//{
// InputStream = fileStream,
// Key = newVideo.ID.ToString(),
// BucketName = "nu-ren-bucket",
// CannedACL = S3CannedACL.PublicRead
//};
return newVideo.ID;
}
}
}
Я знаю, что моя модель говорит видео, но я только что тестировал маленькие файлы, чтобы заставить его работать, поэтому я знаю, что размер не проблема. Код, который вы прокомментировали, - это то, что я пробовал раньше всего, и я продолжаю получать ту же проблему:
Ошибка:
An unhandled exception occurred while processing the request.
HttpErrorResponseException: Exception of type 'Amazon.Runtime.Internal.HttpErrorResponseException' was thrown.
Amazon.Runtime.HttpWebRequestMessage.GetResponseAsync(CancellationToken cancellationToken) in HttpRequestMessageFactory.cs, line 539
AmazonS3Exception: Access Denied
Amazon.Runtime.Internal.HttpErrorResponseExceptionHandler.HandleException(IExecutionContext executionContext, HttpErrorResponseException exception) in HttpErrorResponseExceptionHandler.cs, line 60
Stack Query Cookies Headers
HttpErrorResponseException: Exception of type 'Amazon.Runtime.Internal.HttpErrorResponseException' was thrown.
Amazon.Runtime.HttpWebRequestMessage.GetResponseAsync(CancellationToken cancellationToken) in HttpRequestMessageFactory.cs
Amazon.Runtime.Internal.HttpHandler<TRequestContent>.InvokeAsync<T>(IExecutionContext executionContext) in HttpHandler.cs
Amazon.Runtime.Internal.RedirectHandler.InvokeAsync<T>(IExecutionContext executionContext)
Amazon.Runtime.Internal.Unmarshaller.InvokeAsync<T>(IExecutionContext executionContext)
Amazon.S3.Internal.AmazonS3ResponseHandler.InvokeAsync<T>(IExecutionContext executionContext)
Amazon.Runtime.Internal.ErrorHandler.InvokeAsync<T>(IExecutionContext executionContext)
Show raw exception details
AmazonS3Exception: Access Denied
Amazon.Runtime.Internal.HttpErrorResponseExceptionHandler.HandleException(IExecutionContext executionContext, HttpErrorResponseException exception) in HttpErrorResponseExceptionHandler.cs
Amazon.Runtime.Internal.ErrorHandler.ProcessException(IExecutionContext executionContext, Exception exception) in ErrorHandler.cs
Amazon.Runtime.Internal.ErrorHandler.InvokeAsync<T>(IExecutionContext executionContext) in ErrorHandler.cs
Amazon.Runtime.Internal.CallbackHandler.InvokeAsync<T>(IExecutionContext executionContext)
Amazon.Runtime.Internal.EndpointDiscoveryHandler.InvokeAsync<T>(IExecutionContext executionContext)
Amazon.Runtime.Internal.EndpointDiscoveryHandler.InvokeAsync<T>(IExecutionContext executionContext) in EndpointDiscoveryHandler.cs
Amazon.Runtime.Internal.CredentialsRetriever.InvokeAsync<T>(IExecutionContext executionContext) in CredentialsRetriever.cs
Amazon.Runtime.Internal.RetryHandler.InvokeAsync<T>(IExecutionContext executionContext)
Amazon.Runtime.Internal.RetryHandler.InvokeAsync<T>(IExecutionContext executionContext) in RetryHandler.cs
Amazon.Runtime.Internal.CallbackHandler.InvokeAsync<T>(IExecutionContext executionContext)
Amazon.Runtime.Internal.CallbackHandler.InvokeAsync<T>(IExecutionContext executionContext)
Amazon.S3.Internal.AmazonS3ExceptionHandler.InvokeAsync<T>(IExecutionContext executionContext)
Amazon.Runtime.Internal.ErrorCallbackHandler.InvokeAsync<T>(IExecutionContext executionContext)
Amazon.Runtime.Internal.MetricsHandler.InvokeAsync<T>(IExecutionContext executionContext)
NuRen.Services.Repositories.VideoRepository.SaveVideo(IFormFile file, Video newVideo) in VideoRepository.cs
+
var response = await _s3Client.PutObjectAsync(request);
NuRen.Services.Services.VideoService.UploadVideo(IFormFile file) in VideoService.cs
+
return await _vr.SaveVideo(file, newVideo);
NuRenApp.Controllers.VideoController.UploadVideo(IFormFile file) in VideoController.cs
+
return await _vs.UploadVideo(file);
lambda_method(Closure , object )
Microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable+Awaiter.GetResult()
Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor+AwaitableObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, object controller, object[] arguments)
System.Threading.Tasks.ValueTask<TResult>.get_Result()
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync()
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync()
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context)
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)
Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke(HttpContext httpContext)
Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke(HttpContext httpContext)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
Я пробовал разные комбинации кода, политик и ключей, но ничего не помогло. Полностью застрял в этой точке.