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

что приводит к следующей ошибке при загрузке:

"Ошибка домена =com.amazonaws.AWSS3ErrorDomain Code=0 \" Операция не может быть завершена.. используя указанную конечную точку. Пожалуйста, отправьте все будущие запросы к этой конечной точке., Code=PermanentRedirect, RequestId=568728899BC328B0}"

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

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

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)
Другие вопросы по тегам