2014-04-14 45 views
2

我有一個連接到SQS的工作層Elastic Beanstalk應用程序。一遍又一遍,我不斷收到在我的日誌中返回的HTTP 400錯誤,但是我在日誌中根本沒有收到任何錯誤消息。我的工作層返回400錯誤,CloudWatch錯誤?

[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": "*" 
    } 
] 
} 

我不知道他們是否是指該用戶在錯誤信息時,它說:「彈性beanstalk-ec2-role「,但我找不到任何其他用戶配置文件。我也不確定這是否是導致任何問題的錯誤。

這是我正在嘗試運行的代碼:http://pastebin.com/Tsnnht8b。沒什麼特別的。它在本地機器上正常運行。

我的隊列中的消息是這樣{domain:"http://www.example.com"}

任何想法?

編輯:我能夠通過向ec2添加角色來解決CloudWatch:Errors:AccessDenied。但是這並沒有解決問題,即使我儘可能簡化我的代碼,我仍然可以獲得HTTP 400,除了Flask之外,還可以刪除所有額外的模塊,只是試圖打印「成功」並返回200.

編輯2:我已經能夠認識到這個問題似乎與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

對於存取遭拒,你需要修改你的角色,讓CloudWatch的PutMetricAccess。 http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/AWSHowTo.iam.roles.aeb.html#AWSHowTo.iam.policies.actions.worker –

回答

2

我通過更改SQS設置來「解決」這個問題,以text/plain而不是application/json發送消息。然後我通過以下方式接收數據:

domain = base64.b64decode(request.data) 

我使用b64decode,因爲消息是base64編碼的。但要指出的是,當以純文本發送SQS消息時,您可以通過request.data來獲取它。

這不是對json問題的修復。我無法找到json爲什麼會導致這些問題,但在我的情況下,如果我使用json或text發送它並不重要,因爲它只是一個正在發送的字符串。希望這有助於某人。

+0

這真是莫名其妙,我遇到了同樣的問題。我覺得有一個配置沒有明確的記錄,或者我們錯過了某些東西。如果我找到了某些東西,我一定會回覆。 – DeusExMachina25

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": "*" 
     } 
    ] 
} 
+0

那麼如何使用純文本而不是JSON?請參閱下面的答案檢查答案。 –

+0

這是正確的解決方案,應該標記爲答案 – Santthosh

+0

這個問題是'流行'與1000 +意見。如果你能解釋爲什麼該政策能夠解決問題而不是僅僅粘貼政策,那將是非常好的。 –

相關問題