AWS iOS SDK:在两个不同的区域同时使用 S3 和移动分析
AWS iOS SDK: Using both S3 and Mobile Analytics in two different regions
我正在尝试在我的 Swift 项目中使用 AWS iOS SDK v2 集成 S3 和移动分析。问题是我正在尝试使用两个不同的区域(我正在使用我的主要区域,爱尔兰的 eu-west-1,但移动分析是 only available from us-east-1 in Virginia)。
我的 AppDelegate 中有以下内容来初始化移动分析:
let credentialsProviderForMobileAnalytics = AWSCognitoCredentialsProvider.credentialsWithRegionType(
AWSRegionType.USEast1,
accountId: "my_account_id",
identityPoolId: "pool_id",
unauthRoleArn: "XXX",
authRoleArn: "XXX"
)
let awsConfigurationForMobileAnalytics = AWSServiceConfiguration(
region: AWSRegionType.USEast1,
credentialsProvider: credentialsProviderForMobileAnalytics
)
AWSServiceManager.defaultServiceManager().setDefaultServiceConfiguration(awsConfigurationForMobileAnalytics)
var mobileAnalytics = AWSMobileAnalytics(forAppId: "MyAwsAppId")
然后,在从 ViewController 调用的函数中,我想将图像上传到 S3,我有:
let credentialsProviderForS3 = AWSCognitoCredentialsProvider.credentialsWithRegionType(
AWSRegionType.EUWest1,
accountId: "my_account_id",
identityPoolId: "pool_id",
unauthRoleArn: "XXX",
authRoleArn: "XXX"
)
let awsConfigurationForS3 = AWSServiceConfiguration(
region: AWSRegionType.EUWest1,
credentialsProvider: credentialsProviderForS3
)
AWSServiceManager.defaultServiceManager().setDefaultServiceConfiguration(awsConfigurationForS3)
var transferManager = AWSS3TransferManager.defaultS3TransferManager()
var fileURL = NSURL(fileURLWithPath: NSTemporaryDirectory().stringByAppendingPathComponent("temp"))
var uploadRequest1 : AWSS3TransferManagerUploadRequest = AWSS3TransferManagerUploadRequest()
uploadRequest1.bucket = "mybucket"
uploadRequest1.key = "my-image.jpeg"
uploadRequest1.body = fileURL
var task = transferManager.upload(uploadRequest1)
如果我评论以上两个部分之一,相应的任务会完美完成(当分析代码被评论时,s3 工作,反之亦然),但它不能一起工作 - 我怀疑这是因为我正在使用 AWSServiceManager.defaultServiceManager().setDefaultServiceConfiguration()
设置默认服务配置,而我使用两个不同区域的事实不知何故弄乱了一切。它要么拒绝将事件记录到 Mobile Analytics,要么会中断上传并显示错误消息
NSUnderlyingError=0x17424ee20 "The operation couldn’t be completed.
(kCFErrorDomainCFNetwork error -1001.)",
NSErrorFailingURLKey=https://s3.amazonaws.com/mybucket/my-image.jpeg})
我尝试像这样为 S3 设置传输管理器(并评论上面的 setDefaultServiceConfiguration
):
var transferManager = AWSS3TransferManager(configuration: awsConfigurationForS3, identifier: "S3")
导致上传过程中出现以下错误:
"Error Domain=com.amazonaws.AWSS3ErrorDomain Code=0 \"The operation couldn\U2019t be completed. (com.amazonaws.AWSS3ErrorDomain error 0.)\" UserInfo=0x1742e7e00 {HostId=sm4qLUbN2XfkNYefbSU4A95UXTwvNYEBz0+bALqeFzlcXJ7rOGWnr1Yg+8HoU4r2, Bucket=mybucket, Endpoint=mybucket.s3.amazonaws.com, Message=The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint., Code=PermanentRedirect, RequestId=568728899BC328B0}"
我也尝试将 "mybucket.s3.amazonaws.com" 作为存储桶名称传递,但这导致了一个错误,指出找不到存储桶。
我真的不确定接下来要尝试什么。希望你们能给我一些关于如何分离这两个集成并同时工作的指示。
问题是您将 S3 区域设置为 USEast1
,但您的存储桶位于 EUWest1
。根据日志,您在以下代码段中将 USEast1
设置为 awsConfigurationForS3
对象:
var transferManager = AWSS3TransferManager(configuration: awsConfigurationForS3, identifier: "S3")
您应该将 S3 区域更新为 EUWest1
(您也可以将 Cognito Identity 区域更新为 EUWest1
)。试试下面的代码片段:
// You can use the new constructor with fewer arguments.
let credentialsProviderForS3 = AWSCognitoCredentialsProvider.credentialsWithRegionType(
AWSRegionType.EUWest1,
identityPoolId: "pool_id"
)
let awsConfigurationForS3 = AWSServiceConfiguration(
region: AWSRegionType.EUWest1,
credentialsProvider: credentialsProviderForS3
)
// You need to retain a strong reference to an instance of AWSS3TransferManager until `- upload:` finishes executing. Making it a property is one way to do this.
self.transferManager = AWSS3TransferManager(configuration: awsConfigurationForS3, identifier: "S3")
var fileURL = NSURL(fileURLWithPath: NSTemporaryDirectory().stringByAppendingPathComponent("temp"))
var uploadRequest1 : AWSS3TransferManagerUploadRequest = AWSS3TransferManagerUploadRequest()
uploadRequest1.bucket = "mybucket"
uploadRequest1.key = "my-image.jpeg"
uploadRequest1.body = fileURL
// `- upload:` is an asynchronous request. This means you need to retain a strong reference to `transferManager` until the async call completes.
transferManager.upload(uploadRequest1)
我正在尝试在我的 Swift 项目中使用 AWS iOS SDK v2 集成 S3 和移动分析。问题是我正在尝试使用两个不同的区域(我正在使用我的主要区域,爱尔兰的 eu-west-1,但移动分析是 only available from us-east-1 in Virginia)。
我的 AppDelegate 中有以下内容来初始化移动分析:
let credentialsProviderForMobileAnalytics = AWSCognitoCredentialsProvider.credentialsWithRegionType(
AWSRegionType.USEast1,
accountId: "my_account_id",
identityPoolId: "pool_id",
unauthRoleArn: "XXX",
authRoleArn: "XXX"
)
let awsConfigurationForMobileAnalytics = AWSServiceConfiguration(
region: AWSRegionType.USEast1,
credentialsProvider: credentialsProviderForMobileAnalytics
)
AWSServiceManager.defaultServiceManager().setDefaultServiceConfiguration(awsConfigurationForMobileAnalytics)
var mobileAnalytics = AWSMobileAnalytics(forAppId: "MyAwsAppId")
然后,在从 ViewController 调用的函数中,我想将图像上传到 S3,我有:
let credentialsProviderForS3 = AWSCognitoCredentialsProvider.credentialsWithRegionType(
AWSRegionType.EUWest1,
accountId: "my_account_id",
identityPoolId: "pool_id",
unauthRoleArn: "XXX",
authRoleArn: "XXX"
)
let awsConfigurationForS3 = AWSServiceConfiguration(
region: AWSRegionType.EUWest1,
credentialsProvider: credentialsProviderForS3
)
AWSServiceManager.defaultServiceManager().setDefaultServiceConfiguration(awsConfigurationForS3)
var transferManager = AWSS3TransferManager.defaultS3TransferManager()
var fileURL = NSURL(fileURLWithPath: NSTemporaryDirectory().stringByAppendingPathComponent("temp"))
var uploadRequest1 : AWSS3TransferManagerUploadRequest = AWSS3TransferManagerUploadRequest()
uploadRequest1.bucket = "mybucket"
uploadRequest1.key = "my-image.jpeg"
uploadRequest1.body = fileURL
var task = transferManager.upload(uploadRequest1)
如果我评论以上两个部分之一,相应的任务会完美完成(当分析代码被评论时,s3 工作,反之亦然),但它不能一起工作 - 我怀疑这是因为我正在使用 AWSServiceManager.defaultServiceManager().setDefaultServiceConfiguration()
设置默认服务配置,而我使用两个不同区域的事实不知何故弄乱了一切。它要么拒绝将事件记录到 Mobile Analytics,要么会中断上传并显示错误消息
NSUnderlyingError=0x17424ee20 "The operation couldn’t be completed. (kCFErrorDomainCFNetwork error -1001.)", NSErrorFailingURLKey=https://s3.amazonaws.com/mybucket/my-image.jpeg})
我尝试像这样为 S3 设置传输管理器(并评论上面的 setDefaultServiceConfiguration
):
var transferManager = AWSS3TransferManager(configuration: awsConfigurationForS3, identifier: "S3")
导致上传过程中出现以下错误:
"Error Domain=com.amazonaws.AWSS3ErrorDomain Code=0 \"The operation couldn\U2019t be completed. (com.amazonaws.AWSS3ErrorDomain error 0.)\" UserInfo=0x1742e7e00 {HostId=sm4qLUbN2XfkNYefbSU4A95UXTwvNYEBz0+bALqeFzlcXJ7rOGWnr1Yg+8HoU4r2, Bucket=mybucket, Endpoint=mybucket.s3.amazonaws.com, Message=The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint., Code=PermanentRedirect, RequestId=568728899BC328B0}"
我也尝试将 "mybucket.s3.amazonaws.com" 作为存储桶名称传递,但这导致了一个错误,指出找不到存储桶。
我真的不确定接下来要尝试什么。希望你们能给我一些关于如何分离这两个集成并同时工作的指示。
问题是您将 S3 区域设置为 USEast1
,但您的存储桶位于 EUWest1
。根据日志,您在以下代码段中将 USEast1
设置为 awsConfigurationForS3
对象:
var transferManager = AWSS3TransferManager(configuration: awsConfigurationForS3, identifier: "S3")
您应该将 S3 区域更新为 EUWest1
(您也可以将 Cognito Identity 区域更新为 EUWest1
)。试试下面的代码片段:
// You can use the new constructor with fewer arguments.
let credentialsProviderForS3 = AWSCognitoCredentialsProvider.credentialsWithRegionType(
AWSRegionType.EUWest1,
identityPoolId: "pool_id"
)
let awsConfigurationForS3 = AWSServiceConfiguration(
region: AWSRegionType.EUWest1,
credentialsProvider: credentialsProviderForS3
)
// You need to retain a strong reference to an instance of AWSS3TransferManager until `- upload:` finishes executing. Making it a property is one way to do this.
self.transferManager = AWSS3TransferManager(configuration: awsConfigurationForS3, identifier: "S3")
var fileURL = NSURL(fileURLWithPath: NSTemporaryDirectory().stringByAppendingPathComponent("temp"))
var uploadRequest1 : AWSS3TransferManagerUploadRequest = AWSS3TransferManagerUploadRequest()
uploadRequest1.bucket = "mybucket"
uploadRequest1.key = "my-image.jpeg"
uploadRequest1.body = fileURL
// `- upload:` is an asynchronous request. This means you need to retain a strong reference to `transferManager` until the async call completes.
transferManager.upload(uploadRequest1)