我们通过不在运行中保存它来实现它,我们将它保存为字节流,直到我们将它存储在 S3 存储桶中。请注意,您需要确保使用 IFormFileCollection 并确保在启动应用程序时包含您的秘密,并在 CI/CD 中告诉 aws 包含来自 Secrets Manager 的秘密(假设您将它们托管在那里)。
端点:
[HttpPost]
[Consumes("multipart/form-data")]
[RequestSizeLimit(int.MaxValue)]
public async Task<IActionResult> Post([FromForm]IFormFileCollection files, [FromForm]FileTypes fileType)
{
try
{
long size = files.Sum(f => f.Length);
var fileName = string.Empty;
foreach (var formFile in files)
{
if (formFile.Length > 0)
{
fileName = $"{fileType.ToString()}-{Guid.NewGuid().ToString()}";
await _mediator.Send(new S3Messages.Save(formFile.OpenReadStream(), "fileimport", fileName));
}
}
return Ok(new FileUploadResponse
{
Count = files.Count,
Size = size,
Files = files.Select(f => new ImportFile()
{
Created = DateTime.Now,
FileName = fileName,
FileSize = size,
FileTypeID = (int)fileType,
}),
});
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}
}
程序.cs:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
config.AddUserSecrets<Startup>();
if (context.HostingEnvironment.IsProduction())
{
config.AddEnvironmentVariables();
var secretsJson = Secrets.Get("us-east-1");
var dict = JsonConvert.DeserializeObject<Dictionary<string, string>>(secretsJson);
config.AddInMemoryCollection(dict);
}
})
.UseServiceProviderFactory(new ServiceProviderFactory<Program>())
.ConfigureWebHostDefaults(builder =>
{
builder
.UseUrls("http://*:5000")
.UseStartup<Startup>();
});
ci/cd管道yaml文件,创建任务时确保带入秘密:
- export TASK_VERSION=$(aws ecs register-task-definition --family "${ECS_TASK_NAME}" --network-mode host --execution-role-arn "xxx" --container-definitions "[{\"name\":\"$PROJECT_NAME\",\"image\":\"$IMAGE_NAME\",\"portMappings\":[{\"containerPort\":5000,\"hostPort\":5000,\"protocol\":\"tcp\"}],\"memoryReservation\":512,\"memory\":2004,\"essential\":true,\"environment\":[{\"name\":\"SECRETS_NAME\",\"value\":\"$xxx_SECRETS_NAME\"}],\"secrets\":[{\"name\":\"$xxx_SECRETS_NAME\",\"valueFrom\":\"$xxx_SECRETS\"}]}]" | jq --raw-output '.taskDefinition.revision')