Я использую 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 . На самом деле ВСЕ РЕГИОНЫ АКТИВИРОВАНЫ
ЧТО МОЖНО ДЕЛАТЬ НЕПРАВИЛЬНО?