我有一个连接到SQS的工作层Elastic Beanstalk应用程序。一遍又一遍,我一直在我的日志中返回HTTP 400错误,但我在日志中根本没有收到任何错误消息。
[14/Apr/2014:18:03:26 +0000] "POST /customer-registered HTTP/1.1" 400 192 "-" "aws-sqsd"
我在error_log中没有收到任何错误,我在日志中找到的唯一错误是以下内容,位于/var/log/aws-sqsd/default.log:
2014-04-14T18:02:58Z error: AWS::CloudWatch::Errors::AccessDenied: User: arn:aws:sts::809571490243:assumed-role/aws-elasticbeanstalk-ec2-role/i-a00fffe2 is not authorized to perform: cloudwatch:PutMetricData
如果我去我的IAM用户(我只有1),我有以下政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
}
]
}
我不确定他们在显示“elasticbeanstalk-ec2-role”时是否在错误消息中引用此用户,但我找不到任何其他用户配置文件。我也不确定这是否是造成任何问题的错误。
以下是我正在尝试运行的代码:http://pastebin.com/Tsnnht8b。没什么特别的。它在本地机器上运行良好。
我的队列消息类似于{domain:"http://www.example.com"}
有什么想法吗?
编辑:我能够通过向ec2添加角色来解决CloudWatch:错误:AccessDenied。但这并没有解决问题,即使我尽可能地简化了我的代码,仍然可以获得所有请求的HTTP 400,删除除Flask之外的所有额外模块,只是尝试打印“success”并返回200.
EDIT2:我已经明白这个问题似乎与json = request.get_json()
或request.json
有关。我一使用这一行,就会在日志中收到以下信息:
[Tue Apr 15 06:01:12 2014] [notice] caught SIGTERM, shutting down
[Tue Apr 15 06:01:13 2014] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Tue Apr 15 06:01:13 2014] [notice] Digest: generating secret for digest authentication ...
[Tue Apr 15 06:01:13 2014] [notice] Digest: done
[Tue Apr 15 06:01:13 2014] [notice] Apache/2.2.25 (Unix) DAV/2 mod_wsgi/3.4 Python/2.7.5 configured -- resuming normal operations
如果我甚至没有使用请求中收到的信息,甚至会发生这种情况。例如,如果我执行以下操作:
domain = request.json
domain = "http://staticdomain.com"
...
我仍然得到错误。所以它似乎涉及到SQS发送给我的EC2的POST json的请求。
答案 0 :(得分:2)
我"解决了#34;这可以通过更改SQS设置以text / plain而不是application / json发送消息。然后我通过以下方式收到数据:
domain = base64.b64decode(request.data)
我使用b64decode,因为消息是base64编码的。但重点是,当以纯文本形式发送SQS消息时,您可以通过request.data
获取它。
它不能解决json问题。我无法找到json导致这些问题的原因,但在我的情况下,如果我用json或text发送它并不重要,因为它只是一个正在发送的字符串。希望这有助于某人。
答案 1 :(得分:1)
以下策略应该为您的EBS实例提供对SQS实例的访问权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "QueueAccess",
"Action": [
"sqs:ChangeMessageVisibility",
"sqs:DeleteMessage",
"sqs:ReceiveMessage"
],
"Effect": "Allow",
"Resource": "*"
},
{
"Sid": "MetricsAccess",
"Action": [
"cloudwatch:PutMetricData"
],
"Effect": "Allow",
"Resource": "*"
}
]
}