2017-10-01 6 views
1

mTurk를 통해 SQS로 메시지를 보내려면 SendMessage에 해당 권한을 제공해야합니다. 문서에서 그들은 교장이 mturk-requester.amazonaws.com이어야한다고 말한다. 따라서 작동하는 정책은 다음과 같습니다.은 Boto3에서 사용 권한을 생성하는 데 문제가 있습니다.

"Principal": { 
    "Service": "mturk-requester.amazonaws.com" 
}, 

이 작업은 Boto3.SQS.addPermission을 통해 수행 할 수 있습니다. 그와 마찬가지로 :

response = client.add_permission(
    QueueUrl='string', 
    Label='string', 
    AWSAccountIds=[ 
     'string', 
    ], 
    Actions=[ 
     'string', 
    ] 
) 

하지만 난 AWSAccountIds 필드에 올바른 교장을 추가 할 수있는 방법을 이해하지 못한다. 내 모든 시도가 mturk-requester.amazonaws.com에 실패했습니다.

내가 뭘 잘못하고 있니?

답변

2

잘못된 MTurk 문서 (예 : the example policy document is invalid)와 문서화되지 않은 Boto3 동작 (즉, 복잡한 구조를 SQS.add_permission으로 전달할 수 없음)과의 전쟁에서 문제가 발생한다고 생각합니다.

add_permission 대신 set_queue_attributes을 사용하여 프로그래밍 방식으로 정책을 추가 할 수있었습니다.

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)}) 

AWS 정책 검사기에서 분석하지 않는 대신

"aws:SecureTransport":"true" 

"Condition": { 
    "Bool": { 
    "aws:SecureTransport": "true" 
    } 
} 

사용되는 가장 큰 차이점.