AWS iOS 开发工具包:在两个不同区域同时使用 S3 和移动分析

Posted

技术标签:

【中文标题】AWS iOS 开发工具包:在两个不同区域同时使用 S3 和移动分析【英文标题】:AWS iOS SDK: Using both S3 and Mobile Analytics in two different regions 【发布时间】:2015-02-25 16:39:26 【问题描述】:

我正在尝试在我的 Swift 项目中使用 AWS ios SDK v2 集成 S3 和 Mobile Analytics。问题是我正在尝试使用两个不同的区域(我正在使用我的主要区域,爱尔兰的 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")

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

"Error Domain=com.amazonaws.AWSS3ErrorDomain Code=0 \"操作无法完成\U2019。 (com.amazonaws.AWSS3ErrorDomain 错误 0.)\" UserInfo=0x1742e7e00 HostId=sm4qLUbN2XfkNYefbSU4A95UXTwvNYEBz0+bALqeFzlcXJ7rOGWnr1Yg+8HoU4r2, Bucket=mybucket, Endpoint=mybucket.s3.amazonaws.com, Message=您尝试访问的存储桶必须使用指定的端点。请将所有未来的请求发送到此端点。, Code=PermanentRedirect, RequestId=568728899BC328B0"

我还尝试将“mybucket.s3.amazonaws.com”作为存储桶名称传递,但这导致错误提示找不到存储桶。

我真的不确定接下来要尝试什么。希望你们能给我一些关于如何分离这两个集成的指示,并让两者同时工作。

【问题讨论】:

我的下一步是在弗吉尼亚州建立一个 S3 存储桶,看看如果位置相同,两者是否可以一起工作。 嗨@MirekE,非常感谢您的回复。我在 us-east-1 中创建了一个带有新 cognito 身份池的单独存储桶,现在它可以正常工作,正如我预期的那样。存储桶位于 us-east-1 确实不太理想,因为我的整个设置都在 eu-west-1,而我们所有的用户都位于西欧。您知道如何在我的首选区域中同时拥有移动分析和 s3,这与移动分析不同吗?再次感谢您的回复和您的时间! 亚马逊 AWS 支持可能会有所帮助? 我已将此问题发布到 AWS 社区论坛:forums.aws.amazon.com/thread.jspa?messageID=604250 【参考方案1】:

问题是您将 S3 区域设置为 USEast1,但您的存储桶位于 EUWest1。根据日志,您在以下代码 sn-p 中将 USEast1 设置为 awsConfigurationForS3 对象:

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

您应该将 S3 区域更新为 EUWest1(您也可以将 Cognito Identity 区域更新为 EUWest1)。试试下面的代码sn-p:

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

【讨论】:

非常感谢 Yosuke,但正如您在我的第二个代码 sn-p 中看到的那样,该区域似乎已设置为 EUWest1...接下来我应该尝试什么?提前感谢您的帮助! 您好 Yosuke,非常感谢您的更新回答。它解决了我的问题,我现在可以将分析记录到 USEast1 并同时在 EUWest1 区域使用 S3。再次感谢,AWS 摇滚! :-)

以上是关于AWS iOS 开发工具包:在两个不同区域同时使用 S3 和移动分析的主要内容,如果未能解决你的问题,请参考以下文章

2 个 AWS 区域之间的 VPC 访问

aws.push 到多个环境

由于使用 AWS iOS 开发工具包的未捕获异常“NSInvalidArgumentException”而终止应用程序

在 AWS 区域中寻找最佳部署位置

如何将不同的 AWS 终端节点用于另一个 AWS 区域?

Nodejs & aws-sdk:同时访问多个区域?