我们使用Amazon S3存储多达500K的数据.我们在EC2实例上安装了一个.NET 4.0 Web服务,它使用500K数据调用PutObject.
问题是,当我们为这个服务分别向S3发出100多个同时调用(使用唯一的S3密钥),并且EC2实例CPU达到100%时.我们对Web服务进行了一些分析,结果表明,99%的处理时间是由AmazonS3Client.PutObject方法完成的.
我们已经尝试将S3客户端配置为使用HTTP(而不是默认的HTTPS),并且还使用S3密钥生成方案进行了一些操作,但没有任何帮助.这篇文章 亚马逊S3 PutObject很慢也没有帮助.
我们的S3密钥架构是:"111_ [递增ID] .txt"
如果我们使用较短的数据(例如小于1K),则不会发生这种广泛的CPU使用.
您能否为我们提供一些指导,以提高CPU性能或在哪里寻找?
这是该调用的源代码:
string fileName = "111_" + Id + ".txt";
using (AmazonS3 client = Amazon.AWSClientFactory.CreateAmazonS3Client(RegionEndpoint.XXXX))
{
try
{
PutObjectRequest request = new PutObjectRequest();
request.WithContentBody(dataRequest.Base64Data)
.WithBucketName(bucketName)
.WithKey(fileName);
S3Response response = client.PutObject(request);
response.Dispose();
}
catch (AmazonS3Exception amazonS3Exception)
{
//Handle exceptiom...
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
我正在寻找有关如何扩展现有Cognito身份验证流程以包含其他"已启用身份提供商"的文档.
目前我们做以下事情
var userPool = new CognitoUserPool(poolId, clientId, provider);
var user = new CognitoUser(username, clientId, userPool, provider);
var context = await user.StartWithSrpAuthAsync(new InitiateSrpAuthRequest { Password = string.IsNullOrEmpty(temppassword) ? password : temppassword });
如果结果context.AuthenticationResult不为null,那么我们将离开比赛,并且我可以使用context.AuthenticationResult.IdToken作为后续调用AWS API Gateway端点的OAuthBearerToken,这些端点受同一Cognito用户池保护.
所有这一切都很有效,但现在我们正在尝试启用其他身份提供商(首先使用Auth0),我现在对如何获取API网关将从Cognito识别的IdToken感到茫然,对于其中的用户而言其中一个已启用的身份提供商.
我正在使用AWSSDK.S3版本3.3.17.2和AWSSDK.Core版本3.3.21.16来上传文件,然后下载相同的文件。如果文件名包含空格( 或),下面的代码将无法下载该文件#
public class AmazonS3
{
public async Task<string> UploadFileAsync(string sourceFile, string s3BucketUrl)
{
AmazonS3Uri s3Uri = new AmazonS3Uri(s3BucketUrl);
using (var s3 = new AmazonS3Client(s3Uri.Region))
{
using (TransferUtility utility = new TransferUtility(s3))
{
TransferUtilityUploadRequest request = new TransferUtilityUploadRequest
{
BucketName = s3Uri.Bucket,
ContentType = "application/pdf",
FilePath = sourceFile,
Key = s3Uri.Key + Path.GetFileName(sourceFile),
};
await utility.UploadAsync(request).ConfigureAwait(false);
}
}
return Path.Combine(s3BucketUrl, Path.GetFileName(sourceFile));
}
public async Task DownloadFileAsync(string destinationFilePath, string …Run Code Online (Sandbox Code Playgroud) 我已经关注了大部分 AWS-NET-SDK,但无法找到我正在寻找的内容的参考。
基本上,我正在寻找从appsettings.json文件中读取和注入 AWS 选项,包括访问密钥、密钥、serviceUrl 和存储桶名称,然后注入IAmazonS3到服务,并从所需的构造函数(如MyConstructor(IAmazonS3 awsS3Client).
目前我正在通过启动两个对象来做到这一点 - BasicAWSCredentials, AmazonS3Config&AmazonS3Client按以下方式:
private readonly IAmazonS3 _aws3Client;
public CloudSystemService(IOptions<AwsS3Settings> awsS3Settings)
{
_awsS3Settings = awsS3Settings.Value;
AWSCredentials credentials = new BasicAWSCredentials(_awsS3Settings.AccessKey, _awsS3Settings.SecretKey);
var config = new AmazonS3Config
{
ServiceURL = _awsS3Settings.ServiceUrl,
RegionEndpoint = Amazon.RegionEndpoint.GetBySystemName(_awsS3Settings.Region)
};
_awsS3Client = new AmazonS3Client(credentials, config);
}
Run Code Online (Sandbox Code Playgroud)
基本上我希望从文件中读取所有内容appsettings.json,并应使用以下方式处理:
var awsConfig = configuration.GetAWSOptions("AwsS3Settings");
services.AddDefaultAWSOptions(awsConfig);
services.AddAWSService<IAmazonS3>();
Run Code Online (Sandbox Code Playgroud)
我的服务实现看起来就像
private readonly IAmazonS3 _aws3Client;
public CloudSystemService(IAmazonS3 awsS3Client)
{
_aws3Client = aws3Client;
}
Run Code Online (Sandbox Code Playgroud)
第一个构造函数中显示的所有内容都应该被删除。
我在 localstack 中设置了一个队列,我可以sqs list-queues使用 CLI 通过查询来验证该队列是否存在:
> aws --endpoint-url=http://localhost:4566 --region=ap-southeast-2 sqs list-queues
{
"QueueUrls": [
"http://localhost:4566/000000000000/question-renderer-requests-errors",
"http://localhost:4566/000000000000/question-renderer-requests"
]
}
Run Code Online (Sandbox Code Playgroud)
队列位于 Region ap-southeast-2,但是当我尝试通过 SDK 访问队列时,它找不到任何内容:
var cred = new BasicAWSCredentials("test", "test");
var sqsClientConfig = new AmazonSQSConfig()
{
RegionEndpoint = RegionEndpoint.APSoutheast2,
ServiceURL = "http://localhost:4566"
};
var sqsClient = new AmazonSQSClient(cred, sqsClientConfig);
var queues = await sqsClient.ListQueuesAsync(new ListQueuesRequest());
Run Code Online (Sandbox Code Playgroud)
我发现RegionEndpoint和ServiceURL是相互排斥的:
RegionEndpoint 和 ServiceURL 是互斥的属性。无论最后设置哪个属性,都会导致另一个属性自动重置为 null。
我需要将服务端点设置为http://localhost:4566指向 localstack,如何设置区域端点?我在这件事上走的路正确吗? …
有没有办法确定.Net中当前的AWS区域?
我已经能够找到一种方法在 java https://aws.amazon.com/blogs/developer/defining-an-applications-current-region/中执行此操作,但在 .Net 中找不到等效的方法。
我正在生成一个预先签名的 URL 服务器端,以允许我的客户端应用程序将文件直接上传到 S3 存储桶。除非客户端应用程序在技术上比我的服务器时钟早一天的时区中的计算机上运行,否则一切正常。
我可以通过将系统时钟提前到第二天的时区来在本地重新创建问题。
这是我使用 .NET SDK 生成预签名 URL 的方式(我最初使用的是 DateTime.Now 而不是 UTCNow):
var request = new GetPreSignedUrlRequest
{
BucketName = bucketName,
Key = objectName,
Verb = HttpVerb.PUT,
Expires = DateTime.UtcNow.AddDays(5),
ContentType = "application/octet-stream"
};
request.Headers["x-amz-acl"] = "bucket-owner-full-control";
request.Metadata.Add("call", JsonConvert.SerializeObject(call).ToString());
return client.GetPreSignedURL(request);
Run Code Online (Sandbox Code Playgroud)
然后我在客户端应用程序中使用该预签名 URL,如下所示:
using (var fileStream = new FileStream(recordingPath, FileMode.Open))
using (var client = new WebClient())
{
HttpContent fileStreamContent = new StreamContent(fileStream);
var bytes = await fileStreamContent.ReadAsByteArrayAsync();
client.Headers.Add("Content-Type", "application/octet-stream");
//include metadata in PUT request
client.Headers.Add("x-amz-meta-call", JsonConvert.SerializeObject(Call));
await …Run Code Online (Sandbox Code Playgroud) 我正在使用该AmazonS3Client.PutObjectAsync(PutObjectAsync, CancellationToken)方法将文件上传到 s3 存储。所以我的服务中的代码看起来像
await _client.PutObjectAsync(putObject, cancellationToken).ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)
我必须等到上传完成,因为下一个服务应该下载这些文件。
现在,我面临问题 -PutObjectAsync已执行,但 s3 不包含我需要的文件,它仅在我的程序完成后几秒钟后出现。
我检查了PutObjectResponse课程,但没有找到任何可以解释文件是否已完全上传的内容。我也没有找到有关PutObjectAsync方法行为的信息。
所以问题是如果PutObjectAsync结合ConfigurateAwait(false)真的等待上传完成还是我错过了一些东西?
先感谢您。任何指导将不胜感激。
我在PutItem和UpdateItem请求上使用前提条件表达式。
有没有办法实现以下任一或全部:
不抛出异常 - 这不是异常情况,而是预期情况;与外部输入的验证一样,我希望能够在不进行抛出和捕获的情况下检查结果 - 有没有办法实现这一点?
假设服务器刚刚读取数据以确定检查失败,是否可以让它返回数据,假设 RCU 已经支付,并且一般模式是之前/之后可以作为往返的一部分包含在内?或者这是一个真正硬性的服务端限制?希望看到权威的链接,因为我浏览过的任何文档都对此事保持沉默......
(我正在使用当前版本的 .NET SDK AWSSDK.DynamoDBv2NuGet 包。)
为了进行开发,我有许多AWS配置文件,我使用appsettings.json中的AWS Profile部分来定义要使用的配置文件:
"AWS": {
"Profile": "CorpAccount",
"Region": "us-east-1"
}
Run Code Online (Sandbox Code Playgroud)
由于这不是默认概要文件,因此在调试和运行单元测试(xunit)时,我需要上下文使用命名的概要文件。我想知道的是配置配置文件的最佳实践。
这是一堂课,展示了三种方法(两种在本地工作):
public class EmailQueueService : IEmailQueueService
{
private IConfiguration _configuration;
private readonly ILogger _logger;
public EmailQueueService(IConfiguration configuration, ILogger<EmailQueueService> logger)
{
_configuration = configuration;
_logger = logger;
}
public async Task<bool> Add1Async(ContactFormModel contactForm)
{
var sqsClient = new AmazonSQSClient();
var sendRequest = // removed for clarity
var response = await sqsClient.SendMessageAsync(sendRequest);
return response.HttpStatusCode == System.Net.HttpStatusCode.OK;
}
public async Task<bool> Add2Async(ContactFormModel contactForm)
{
var sqsClient = _configuration.GetAWSOptions().CreateServiceClient<IAmazonSQS>();
var sendRequest = …Run Code Online (Sandbox Code Playgroud) aws-sdk-net ×10
.net ×5
amazon-s3 ×5
.net-core ×3
c# ×3
aws-sdk ×2
amazon-sqs ×1
asp.net-core ×1
localstack ×1