Ошибка вызова AWS -Познавание от iOS - AWS -SDK - PullRequest
0 голосов
/ 02 мая 2020

Я использую iOS AWS SDK , чтобы позвонить на "AWSRekognition" на "startContentModeration" для проверки "видеоклипа", который был сохранен в корзине S3.

Я использую Cognito "роль IAM без аутентификации" чтобы сделать этот звонок. Я уже успешно использую эту роль для чтения и записи в S3 корзину , а также совершаю успешные вызовы "AWSRekognitionDetectModerationLabelsRequest" для «detectModerationLabels» для изображений в том же приложении iOS.

Это политика, установленная для «роли без аутентификации» в «IAM» :

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "iam:*",
                "sns:*",
                "iam:PassRole",
                "s3:*",
                "mobileanalytics:PutEvents",
                "rekognition:*",
                "cognito-sync:*"
            ],
            "Resource": [
                "*",
                "arn:aws:iam::XXXXXXXXXXXXXX:role/Cognito_IdentityUnauth_Role"
            ]
        }
    ]
}

Я установил свои учетные данные следующим образом:

{
     let credentialsProvider = AWSCognitoCredentialsProvider(regionType:.USEast2,   identityPoolId: CredentialConstants.IDENTITY_POOL_ID)

        if let configuration = AWSServiceConfiguration(region:.USEast2, credentialsProvider:credentialsProvider) {
            AWSServiceManager.default().defaultServiceConfiguration = configuration
            AWSSTS.register(with: configuration, forKey: "USEast2STS") 
        }
}

Я выполняю вызов "AWSRekognition" следующим образом:

{

        rekognitionObject = AWSRekognition.default()
        let videoAWS = AWSRekognitionVideo()
        let videoS3Object = AWSRekognitionS3Object()
        videoS3Object?.bucket = CredentialConstants.AWS_BUCKET_NAME
        videoS3Object?.name   = s3MediaUrl.absoluteString.replacingOccurrences(of: "%23", with: "#")
        videoAWS?.s3Object = videoS3Object

        let notificationChannel = AWSRekognitionNotificationChannel()
        notificationChannel?.roleArn = CredentialConstants.SNS_IAM_ROLE_ARN
        notificationChannel?.snsTopicArn = CredentialConstants.SNS_TOPIC_ARN

        let videoAnalysisRequest = AWSRekognitionStartContentModerationRequest()
        videoAnalysisRequest?.minConfidence = NSNumber(value: KoalieConstants.MODERATION_THRESHOLD)
        videoAnalysisRequest?.jobTag = "videojob"
        videoAnalysisRequest?.video = videoAWS
        videoAnalysisRequest?.notificationChannel = notificationChannel

        if let request = videoAnalysisRequest {
            rekognitionObject?.startContentModeration(request, completionHandler: { (response, error) in

                if error != nil, let error = error {
                    failure(error)
                }

                if let jobId = response?.jobId {
                    self.getUnsafeContentDetection(eventMediaItem: eventMediaItem, jobId: jobId, completed: completed, failure: failure)
                } else {
                    completed(false)
                }
            })
        }
    }

Задача 1 ######################################## Проблема, с которой я сталкиваюсь, заключается в том, что, когда я выполняю этот вызов, несмотря на все настройки, я получаю эту ошибку:

{"__type":"AccessDeniedException","Message":"User: arn:aws:sts::xxxxxxxxxxxx:assumed-role/Cognito_IdentityUnauth_Role/CognitoIdentityCredentials is not authorized to perform: iam:PassRole on resource: arn:aws:iam:: xxxxxxxxxxxx:role/Cognito_IdentityUnauth_Role"}

Я также пытался получить временный токен / доступ по выполнение "AWSSTSAssumeRoleRequest ()" вызова для использования "IAMFullAccess" роли. Это должно дать мне Арн с временным разрешением сделать «awsrekognition» вызов.

Вот код для совершения вызова:

let awsSTS = AWSSTS(forKey: "USEast2STS")

        var policyArray = [AWSSTSPolicyDescriptorType]()
        let policy = AWSSTSPolicyDescriptorType()
        policy?.arn = CredentialConstants.IAM_POLICY_ARN
        policyArray.append(policy!)

        let assumeRoleRequest = AWSSTSAssumeRoleRequest()
        assumeRoleRequest?.roleArn = CredentialConstants.SNS_IAM_ROLE_ARN
        assumeRoleRequest?.policyArns = policyArray
        assumeRoleRequest?.roleSessionName = "\(Utils.getUniqueID())VideoCheck"
        if let request = assumeRoleRequest {
            awsSTS.assumeRole(request) { (response, error) in
                if error != nil, let error = error {
                    failure(error)
                }

                if response != nil, let result = response {
                    printDebugMessage(message: "")
                }
            }
        }

Задача 2 ######################################## Но когда я делаю это вызов я получаю ошибку ниже

Response body:
<ErrorResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
  <Error>
    <Type>Sender</Type>
    <Code>SignatureDoesNotMatch</Code>
    <Message>Credential should be scoped to a valid region, not 'us-east-2'. </Message>
  </Error>
  <RequestId>29590621-e0e8-47b7-9297-d183b0e5c0f7</RequestId>
</ErrorResponse>

Для справки это заголовок запроса и тело запроса:

{
    Authorization = "AWS4-HMAC-SHA256 Credential=HIDDEN/20200501/us-east-2/sts/aws4_request, SignedHeaders=content-type;host;user-agent;x-amz-date;x-amz-security-token, Signature=HIDDEN";
    "Content-Type" = "application/x-www-form-urlencoded; charset=utf-8";
    Host = "sts.amazonaws.com";
    "User-Agent" = "aws-sdk-iOS/2.13.1 iOS/13.3.1 en_US";
    "X-Amz-Date" = 20200501T032000Z;
    "X-Amz-Security-Token" = "hidden";
}
2020-04-30 22:20:01:082 [33659:2279359] Request body:
RoleArn=arn%3Aaws%3Aiam%3A%3A156134919251%3Arole%2FCognito_IdentityUnauth_Role&Version=2011-06-15&RoleSessionName=VideoCheck&Action=AssumeRole&PolicyArns.member.1.arn=arn%3Aaws%3Aiam%3A%3Aaws%3Apolicy%2FIAMFullAccess
2020-04-30 22:20:01:253 KoalieBeta[33659:2279598] Response headers:
{
    "Content-Length" = 317;
    "Content-Type" = "text/xml";
    Date = "Fri, 01 May 2020 03:20:01 GMT";
    "x-amzn-RequestId" = "HIDDEN";
}

У меня также есть имя региона «Восток США (Огайо)» , активированный для «Служба маркеров безопасности (STS)» в Настройки учетной записи моего Панель управления IAM . На самом деле ВСЕ РЕГИОНЫ АКТИВИРОВАНЫ

ЧТО МОЖНО ДЕЛАТЬ НЕПРАВИЛЬНО?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...