在 Boto3 中创建权限的问题

Phi*_*ski 4 mechanicalturk boto amazon-web-services aws-sdk boto3

为了通过 mTurk 向 SQS 发送消息,SendMessage应该给予相应的权限。在文档中,他们说 Principal 应该是mturk-requester.amazonaws.com. 因此,有效的策略如下所示:

"Principal": {
  "Service": "mturk-requester.amazonaws.com"
 },
Run Code Online (Sandbox Code Playgroud)

这可以通过 Boto3.SQS.addPermission 来完成。像那样:

response = client.add_permission(
   QueueUrl='string',
   Label='string',
    AWSAccountIds=[
       'string',
   ],
  Actions=[
      'string',
  ]
 )
Run Code Online (Sandbox Code Playgroud)

但我不明白如何将正确的 Principal 添加到AWSAccountIds字段中。我在mturk-requester.amazonaws.com那里使用的所有尝试都失败了。

我究竟做错了什么?

Tre*_*ton 7

我认为您正在与一些错误的 MTurk 文档(即示例策略文档无效)以及一些记录不足的 Boto3 行为(即您无法将复杂结构传递给SQS.add_permission)作斗争。

我能够通过使用set_queue_attributes而不是add_permission.

import re
import json

q = client.create_queue(QueueName='queue1001')

q_parts = re.search('(\d+)/(.+)$', q['QueueUrl'])
aws_id = q_parts.group(1)
q_name = q_parts.group(2)

policy = {
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "mturk-requester.amazonaws.com"
      },
      "Action": "SQS:SendMessage",
      "Resource": "arn:aws:sqs:us-east-1:{}:{}".format(aws_id, q_name),
      "Condition": {
        "Bool": {
          "aws:SecureTransport": "true"
        }
      }
    }
  ]
}

client.set_queue_attributes(QueueUrl=q['QueueUrl'], Attributes={'Policy': json.dumps(policy)})
Run Code Online (Sandbox Code Playgroud)

主要区别在于使用

"Condition": {
  "Bool": {
    "aws:SecureTransport": "true"
  }
}
Run Code Online (Sandbox Code Playgroud)

代替

"aws:SecureTransport":"true"
Run Code Online (Sandbox Code Playgroud)

它不会在 AWS 策略验证器中解析。