代码之家  ›  专栏  ›  技术社区  ›  Camillo

AWS iOS SDK:在两个不同的地区同时使用S3和移动分析

  •  1
  • Camillo  · 技术社区  · 10 年前

    我正在尝试使用AWS iOS SDK v2在我的 敏捷的 项目问题是我正在尝试使用两个不同的地区(我正在与我的主要地区爱尔兰的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“操作无法完成。 (kCFErrorDomainCFNetwork错误-1001.)“, NSErrorFailingURLKey= https://s3.amazonaws.com/mybucket/my-image.jpeg })

    我试着这样设置S3的传输管理器(并在 setDefaultServiceConfiguration 以上):

        var transferManager = AWSS3TransferManager(configuration: awsConfigurationForS3, identifier: "S3")
    

    这在上载过程中导致以下错误:

    “错误域=com.amazonaws.AWS3Error域代码=0\”操作无法完成\U2019。(com.amazonaws.AWS3ErrorDomain错误0。)\“UserInfo=0x1742e7e00{HostId=sm4qLUbN2XfkNYefbSU4A95UXTwvNYEBz0+bALqeFzlcXJ7rOGWnr1Yg+8HoU4r2,Bucket=mybucket,Endpoint=mybucket.s3.amazonaws.com,Message=您尝试访问的Bucket必须使用指定的终结点进行寻址。请将所有未来的请求发送到此终结点。Code=PermanentRedirect,RequestId=568728899B328B0}”

    我还尝试将“mybucket.s3.amazonaws.com”作为bucket名称传递,但这导致一个错误,指出找不到bucket。

    我真的不知道下一步该做什么。希望你们能给我一些关于如何分离这两个集成的建议,让它们同时工作。

    1 回复  |  直到 10 年前
        1
  •  2
  •   Yosuke    10 年前

    问题是您将S3区域设置为 USEast1 但你的水桶还在 EUWest1 。根据日志,您正在设置 美国广播公司1 awsConfigurationForS3 对象:

    var transferManager = AWSS3TransferManager(configuration: awsConfigurationForS3, identifier: "S3")
    

    您应该将S3区域更新为 欧盟西部1 (您也可以将Cognito Identity区域更新为 欧盟西部1 以及)。请尝试以下代码段:

    // 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)