2014-04-14 2 views
2

У меня есть рабочий уровень Elastic Beanstalk Application, подключенный к SQS. Снова и снова я все время получаю сообщение об ошибке HTTP 400 в моем журнале, но я вообще не получаю сообщений об ошибках в журнале.Мой рабочий уровень возвращает 400 Error, CloudWatch Error?

[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"}

Любые идеи?

EDIT: Я смог решить CloudWatch: Ошибки: AccessDenied, добавив роль в ec2. Но это не решило проблему, но я все равно получаю HTTP 400 по всем запросам, даже если я упрощаю свой код настолько, насколько смогу, удаляя все дополнительные модули, кроме Flask, и просто пытаюсь напечатать «успех» и вернуть 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" 
... 

Я все еще получаю сообщение об ошибке. Поэтому, похоже, он участвует в запросе POST json, который SQS отправляет на мой EC2.

+0

Для AccessDenied вам необходимо изменить свою роль, чтобы позволить cloudwatch PutMetricAccess. http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/AWSHowTo.iam.roles.aeb.html#AWSHowTo.iam.policies.actions.worker –

ответ

2

Я «решил» это, изменив параметры SQS, чтобы отправлять сообщения в текстовой/plain вместо приложения/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+ видами. Было бы здорово, если бы вы могли объяснить, почему эта политика устраняет проблему, а не просто вставляет политику. –

Смежные вопросы