public async Task <string> SaveVersionMetaAsync(string versionFileKey, ScoreVersionMeta versionMeta) { var metaConvertor = new ScoreMetaConvertor(); var stream = await metaConvertor.ConvertToUtf(versionMeta); var putRequest = new PutObjectRequest { BucketName = BucketName, Key = versionFileKey, InputStream = stream, CannedACL = S3CannedACL.PublicRead, }; try { await this.S3Client.PutObjectAsync(putRequest); } catch (AmazonS3Exception e) { throw new InvalidOperationException(e.Message, e); } return(versionFileKey); }
public async Task SaveScoreMetaAsync(string scoreName, ScoreMeta scoreMeta, string metaKey) { var convertor = new ScoreMetaConvertor(); var key = $"{scoreName}/{ScoreMeta.FileName}"; int retryCount = 5; for (int i = 0; i < retryCount; i++) { try { var stream = await convertor.ConvertToUtf(scoreMeta); var putRequest = new PutObjectRequest { BucketName = BucketName, Key = key, InputStream = stream, CannedACL = S3CannedACL.PublicRead, }; await this.S3Client.PutObjectAsync(putRequest); } catch (AmazonS3Exception) { // Error throw; } try { var request = new GetObjectRequest { BucketName = BucketName, Key = key, }; var response = await this.S3Client.GetObjectAsync(request); var stream = response.ResponseStream; var checkedMeta = await convertor.ConvertToScoreMeta(stream); // 同一のキーが登録される可能性があるがキーには少数3桁の時間を指定してるので // ほぼキーが重なる自体はないと考える // もしキーの重複が問題になる用であれば内容の比較も行う if (checkedMeta.ContainsKey(metaKey)) { return; } } catch (AmazonS3Exception) { // skip } if (i < (retryCount - 1)) { Thread.Sleep(2000); } } throw new InvalidOperationException("追加更新に失敗しました"); }
public async Task <IActionResult> CreateScoreAsync([FromBody] NewScore newScore) { var convertor = new ScoreMetaConvertor(); var meta = convertor.Convert(newScore); var content = meta.GetLastScoreContent(); var prefix = $"{content.Name}/{ScoreMeta.FileName}"; try { var request = new ListObjectsRequest { BucketName = BucketName, Prefix = prefix, }; var response = await this.S3Client.ListObjectsAsync(request); Logger.LogInformation($"List object from bucket {this.BucketName}. Prefix: '{prefix}', Request Id: {response.ResponseMetadata.RequestId}"); if (response.S3Objects.Any()) { throw new InvalidOperationException($"'{content.Name}' は存在します"); } } catch (AmazonS3Exception e) { Logger.LogError(e, e.Message); throw; } catch (Exception e) { Logger.LogError(e, e.Message); throw; } try { var fileName = ScoreMeta.FileName; var stream = await convertor.ConvertToUtf(meta); var key = $"{content.Name}/{fileName}"; var putRequest = new PutObjectRequest { BucketName = BucketName, Key = key, InputStream = stream, CannedACL = S3CannedACL.PublicRead, }; var response = await this.S3Client.PutObjectAsync(putRequest); Logger.LogInformation($"Uploaded object {key} to bucket {this.BucketName}. Request Id: {response.ResponseMetadata.RequestId}"); return(Ok()); } catch (AmazonS3Exception e) { Logger.LogError(e, e.Message); throw; } catch (Exception e) { Logger.LogError(e, e.Message); throw; } }