賞金將在 6 天后到期。此問題的答案有資格獲得 100聲望賞金。 coder想引起對這個問題的更多關注。
嗨,我正在嘗試使用亞馬遜網路服務來存盤我的 iOS 應用程式的檔案。
這是我用來下載存盤在 aws S3 上的檔案的代碼
我將以下內容添加到 appDelegate
AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc]
initWithRegionType:AWSRegionUSEast2
identityPoolId:@"us-east-2:3764e0f9-khu97-4844-b9f7-57defdfjv8b8b"];
AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast2 credentialsProvider:credentialsProvider];
[AWSServiceManager defaultServiceManager].defaultServiceConfiguration = configuration;
然后在我的課堂上,我使用以下內容下載物件。請注意,該物件未應用任何加密,并且該存盤桶的所有權限均已解鎖
- (void)downloadImageToAWS{
// AWS Configurations
AWSS3DownloadHelper *aws = [[AWSS3DownloadHelper alloc] init];
aws.bucket = @"my-sample-bucket-002";
aws.key = @"photo-sam-002.jpg";
// AWS progress block
aws.progressBlock = ^(AWSS3TransferUtilityTask *task, NSProgress *progress) {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"progress.fractionCompleted %f", progress.fractionCompleted);
});
};
// AWS completionHandler
[self addAWSDownloadComplitionHandler:aws];
// Update UI if job / task can upload a file on AWS S3
[self successfulDownloadOfAWSS3ByCompletionHandler:aws.completionHandler withProgressBlock:aws.progressBlock];
[aws downloadAWSFile];
}
- (void) addAWSDownloadComplitionHandler:(AWSS3DownloadHelper *)aws {
// Create instance to View Controller
NSLog(@"addAWSDownloadComplitionHandler");
aws.completionHandler = ^(AWSS3TransferUtilityDownloadTask *task, NSURL *location, NSData *data, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
if (error) {
NSLog(@"Unsuccessfully downloaded error %li", (long)[error code]);
NSLog(@"Unsuccessfully downloaded error %@", [error description]);
}
else if (data) {
NSLog(@"data %@", data);
}
});
};
}
- (void) successfulDownloadOfAWSS3ByCompletionHandler:(AWSS3TransferUtilityDownloadCompletionHandlerBlock)completionHandler withProgressBlock:(AWSS3TransferUtilityProgressBlock)progressBlock {
NSLog(@"successfulDownloadOfAWSS3ByCompletionHandler");
AWSS3TransferUtility *transferUtility = [AWSS3TransferUtility defaultS3TransferUtility];
[transferUtility enumerateToAssignBlocksForUploadTask:nil downloadTask:^(AWSS3TransferUtilityDownloadTask * _Nonnull downloadTask, AWSS3TransferUtilityProgressBlock _Nullable __autoreleasing * _Nullable downloadProgressBlockReference, AWSS3TransferUtilityDownloadCompletionHandlerBlock _Nullable __autoreleasing * _Nullable completionHandlerReference) {
NSLog(@"taskIdentifier %lu", (unsigned long)downloadTask.taskIdentifier);
*downloadProgressBlockReference = progressBlock;
*completionHandlerReference = completionHandler;
dispatch_async(dispatch_get_main_queue(), ^{
});
}];
}
盡管我已將所有權限都允許。阻止所有公共訪問已關閉,我不斷收到以下錯誤:
Domain=com.amazonaws.AWSS3TransferUtilityErrorDomain Code=2 "(null)" UserInfo={Server=AmazonS3, Error={
Code = AccessDenied;
HostId = "SJABFLSKBtprmLRaHLjjockzjfubejlakhipjaKDNSAFJLB4ViE=";//Changed
Message = "Access Denied";
RequestId = jabduw2dhC6WCT;//changed
}, Transfer-Encoding=Identity, Content-Type=application/xml, Date=Wed, 29 Dec 2021 09:33:06 GMT, x-amz-request-id=2TJSHCJ2ASTC6WCT, x-amz-id-2=Fbg2cDXwU5wLgQLHbGtprmLRaHLjjocvZzCcUNfMrSpT5Oiwl3LjEkpPQ2OBzLmBrKXnrwq4ViE=}
我已應用此視頻中的所有建議: 為什么我在修改存盤桶策略時從 Amazon S3 控制臺收到拒絕訪問錯誤?- YouTube
在 cloud shell 上嘗試以下命令沒有顯示任何錯誤:
aws s3 cp s3://<bucket name>/<key> /tmp/localfile
如果需要任何進一步的代碼或資訊,請告訴我。
uj5u.com熱心網友回復:
首先,讓我們排除編碼。嘗試使用 AWS CLI 以本機方式訪問該檔案。直接上aws s3 cp s3://<bucket name>/<key> /tmp/localfile
如果可行,則說明您遇到了代碼問題,我們將繼續檢查。如果它不起作用,則可能是權限問題。
要檢查的第二件事-您是否使用加密?很有可能(根據我的經驗),雖然您可能有權訪問 S3 存盤桶,但您可能無權訪問加密密鑰,因此您獲得的訪問被拒絕實際上來自 KMS。您可能需要授予解密 KMS 密鑰的權限。
uj5u.com熱心網友回復:
您似乎正在使用 Cognito 作為憑據提供程式。據我了解,即使對于公共存盤桶,如果您通過 API 訪問,則需要設定適當的 IAM 角色和權限。這意味著將具有 S3 訪問權限的IAM 角色分配給Cognito中身份池中經過身份驗證的身份。
或者,您必須通過no-sign-request. 至少在 CLI 中你必須這樣做。https://docs.aws.amazon.com/cli/latest/reference/。
但是,如果您使用 URL 和公共存盤桶訪問,您將能夠獲取物件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/416059.html
標籤:
