AWS视频识别未将结果发布到SNS主题

6

我正在运行一些用于检测MP4视频中标签的NodeJS AWS Rekognition,但是当完成后它不会发布到指定的SNS主题。在提交具有主题/ROLE arns的请求时,我没有收到任何权限错误。

const AWS = require('aws-sdk');
AWS.config.update(
    {
        region: 'us-west-2',
        accessKeyId: "asdfadsf",
        secretAccessKey: "asdfasdfasdfasd1234123423"
    }
);


const params = {
    Video: {
        S3Object: {
            Bucket: 'myvidebucket',
            Name: '5d683b81760ec59c2015.mp4'
        }
    },
    NotificationChannel: {
        RoleArn: 'arn:aws:iam::xxxxxxxxxxxxx:role/AmazonRekognitionSNSSuccessFeedback',
        SNSTopicArn: 'arn:aws:sns:us-west-2:xxxxxxxxxxxxx:recoknize',
    },
    MinConfidence: 60
};


rekognition.startLabelDetection(params).promise().then(data => {
    console.log(JSON.stringify(data));
}).catch(error => {
    console.log(error);
});

这段代码没有错误,我收到了一个作业ID。我的SNS主题订阅已确认,应该发布到我的HTTPS端点,但从未到达过,并且AWS控制台中没有任何关于此的错误日志。

当我手动通过作业ID访问rekognition时,数据返回正确,所以我知道它已正确完成。IAM权限一定出了一些问题。

3个回答

6
我已经成功审核并测试了您的nodejs代码,并且没有发现任何问题。由于代码能够正常返回AWS Rekognition的“JobId”,因此您可以查看SNS配置并检查它是否与以下内容匹配:
1. 在您的SNS主题('arn:aws:sns:us-west-2:xxxxxxxxxxxxx:recoknize')中,导航到访问策略并检查您是否具有类似于以下策略的策略:
{
  "Version": "2008-10-17",
  "Id": "__default_policy_ID",
  "Statement": [
    {
      "Sid": "__default_statement_ID",
      "Effect": "Allow",
      "Principal": {
        "Service": "rekognition.amazonaws.com"
      },
      "Action": [
        "SNS:GetTopicAttributes",
        "SNS:SetTopicAttributes",
        "SNS:AddPermission",
        "SNS:RemovePermission",
        "SNS:DeleteTopic",
        "SNS:Subscribe",
        "SNS:ListSubscriptionsByTopic",
        "SNS:Publish",
        "SNS:Receive"
      ],
      "Resource": "arn:aws:sns:us-west-2:XXXXXXXXXXXX:AmazonRekognitionTopic"
    }
  ]
}

2. 在您的IAM角色 ('arn:aws:iam::xxxxxxxxxxxxx:role/AmazonRekognitionSNSSuccessFeedback')上,请确保以下内容:

(i) 您的角色的“信任关系”具有以下声明:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service":"rekognition.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

(ii) 该角色有一个类似于下面给出的附带政策文档:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sns:publish"
            ],
            "Resource": "*"
        }
    ]
}

Amazon Rekognition 成功发布消息到 SNS 主题后,应输出类似以下内容的信息:
"JobId":"8acd9edd6edfb0e4985f8cd269e4863e54f7fcd451af6aafe10b32996dedbdba","Status":"SUCCEEDED","API":"StartLabelDetection","Timestamp":1568544553927,"Video":{"S3ObjectName":"final.mp4","S3Bucket":"syumak-rekognition"}}

希望这有所帮助。

感谢您输入这些内容。不幸的是,即使使用管理员用户凭据,我仍然无法使其工作。太奇怪了。Rekognition就是无法发布到我的主题。 - Jeff Shoemaker
按照您的步骤,我已经让它正常工作了,只是出于某种原因,我需要创建新的安全凭证密钥。 - Jeff Shoemaker
第一步帮了我。我的访问策略中有一个条件,只允许主题所有者发布消息。我把它删除了,然后就可以了! - Guillermo Gutiérrez

1

在文档中找到了这个信息 - 显然, https://docs.aws.amazon.com/rekognition/latest/dg/api-video-roles.html#api-video-roles-all-topics

AmazonRekognitionServiceRole会赋予Amazon Rekognition Video访问以AmazonRekognition为前缀的Amazon SNS TOPICS的权限。

它没有说明角色ARN需要添加前缀。但是加上前缀也无妨。 请仔细检查您的TOPIC是否为AmazonRekognitionMyTopicName。

 RoleArn: 'arn:aws:iam::xxxxxxxxxxxxx:role/AmazonRekognitionSNSSuccessFeedback', <- don't think this is so important.
SNSTopicArn: 'arn:aws:sns:us-west-2:xxxxxxxxxxxxx:recoknize', <- Must be something like AmazonRekognitionSuccess

此外 - 这对我有所帮助 / 我移除了 FIFO,这样就可以通过电子邮件订阅 SQS 了。 https://docs.aws.amazon.com/rekognition/latest/dg/video-troubleshooting.html 请确认您拥有一个 IAM 服务角色,该角色授予 Amazon Rekognition Video 发布到您的 Amazon SNS 主题的权限。更多信息,请参见配置 Amazon Rekognition Video。
我创建了一个新的 IAM 并授权以下权限: AmazonRekognitionFullAccess AmazonSNSRole AmazonSNSFullAccess
我更新了信任关系,包括 sns.amazonaws.com / rekognition.amazonaws.com 两个网址。
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "sns.amazonaws.com",
          "rekognition.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

我不确定这些中的哪一个让一切都恰到好处 - 但是这是一个很好的半天时间 / 希望这能为某人节省时间。


在我的情况下,从FIFO更改主题和队列类型到标准方式有所帮助(感谢您的帖子中的建议)。 - Paweł

0
  1. 信任关系解决了我的问题。将以下脚本添加到 IAM 的信任关系中,该 IAM 将用作 RoleARn 脚本:

    {
      "Version": "2012-10-17",
      "Statement": [{
        "Effect": "Allow",
        "Principal": {
          "Service": [
            "sns.amazonaws.com",
            "rekognition.amazonaws.com",
            "sagemaker.amazonaws.com"
          ]
        },
        "Action": "sts:AssumeRole",
        "Condition": {}
      }]
    }
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接