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那里使用的所有尝试都失败了。
我究竟做错了什么?
我认为您正在与一些错误的 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 策略验证器中解析。
| 归档时间: |
|
| 查看次数: |
965 次 |
| 最近记录: |