AWS iOS SDK: использование S3 и Mobile Analytics в двух разных регионах

Я пытаюсь интегрировать S3 и Mobile Analytics с помощью AWS iOS SDK v2 в свой проект Swift. Проблема в том, что я пытаюсь использовать два разных региона (я работаю со своим основным регионом, eu-west-1 в Ирландии, но Mobile Analytics доступно только на сайте us-east-1 в Вирджинии).

У меня есть следующее в моем AppDelegate для инициализации Mobile Analytics:

    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 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 \"Операция не может быть завершена. (com.amazonaws.AWSS3ErrorDomain error 0.)\" UserInfo=0x1742e7e00 {HostId=sm4qLUbN2XfkNYefbSU4A95UXTwvNYEBz0+bALqeFzlcXJ7rOGWnr1Yg+8HoU4r2, Bucket=mybucket, Endpoint=mybucket.s3.amazonaws.com, Message=Корзина, к которой вы пытаетесь получить доступ используя указанную конечную точку. Пожалуйста, отправляйте все будущие запросы на эту конечную точку., Code=PermanentRedirect, RequestId=568728899BC328B0}"

Я также попытался передать «mybucket.s3.amazonaws.com» в качестве имени корзины, но это привело к ошибке, указывающей, что корзина не найдена.

Я действительно не уверен, что попробовать дальше. Надеюсь, вы, ребята, можете дать мне несколько советов о том, как разделить эти две интеграции и заставить их работать одновременно.


person Camillo    schedule 25.02.2015    source источник
comment
Следующим моим шагом будет установка корзины S3 в Вирджинии, чтобы посмотреть, будут ли они работать вместе, если местоположение будет одинаковым.   -  person MirekE    schedule 25.02.2015
comment
Привет @MirekE, большое спасибо за ваш ответ. Я создал отдельное ведро с новым пулом удостоверений когнито в us-east-1, и теперь оно работает, как я и ожидал. На самом деле не идеально, чтобы ведро находилось в us-east-1, потому что вся моя установка находится в eu-west-1, а все наши пользователи находятся в западной европе. Есть ли у вас какие-либо идеи, как я могу добиться того, чтобы и мобильная аналитика, и s3 в моем предпочтительном регионе отличались от мобильной аналитики? Еще раз спасибо за ваш ответ и ваше время!   -  person Camillo    schedule 25.02.2015
comment
Возможно, поможет поддержка Amazon AWS?   -  person MirekE    schedule 25.02.2015
comment
Я отправил сообщение об этой проблеме на форумы сообщества AWS: forums.aws.amazon.com/ thread.jspa?messageID=604250   -  person Camillo    schedule 26.02.2015


Ответы (1)


Проблема в том, что вы устанавливаете регион 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)
person Yosuke Matsuda    schedule 25.02.2015
comment
Большое спасибо, Йоске, но, как вы можете видеть во втором фрагменте кода, регион уже установлен на EUWest1... Что мне делать дальше? Заранее спасибо за помощь! - person Camillo; 26.02.2015
comment
Привет Йосуке, большое спасибо за ваш обновленный ответ. Это решило мою проблему, теперь я могу регистрировать аналитику в USEast1 и одновременно использовать S3 в регионе EUWest1. Еще раз спасибо, AWS рулит! :-) - person Camillo; 26.02.2015