Мой рабочий уровень возвращает ошибку 400, ошибку CloudWatch?

У меня есть приложение Elastic Beanstalk рабочего уровня, подключенное к SQS. Снова и снова я получаю сообщение об ошибке 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"}

Любые идеи?

EDIT: мне удалось решить CloudWatch:Errors: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.


person Marcus Lind    schedule 14.04.2014    source источник
comment
Для AccessDenied вам необходимо изменить свою роль, чтобы разрешить CloudWatch PutMetricAccess. docs.aws.amazon.com/elasticbeanstalk/latest/dg/   -  person Rohit Banga    schedule 29.04.2014


Ответы (2)


Я «решил» это, изменив настройки SQS, чтобы отправлять сообщения в текстовом/простом виде вместо приложения/json. Затем я получаю данные следующим образом:

domain = base64.b64decode(request.data) 

Я использую b64decode, потому что сообщения кодируются base64. Но дело в том, что при отправке сообщения SQS в виде обычного текста вы получаете его с помощью request.data.

Это не решение проблемы json. Я не смог определить, почему json вызывает эти проблемы, но в моем случае не имеет значения, отправляю ли я его в json или текст, потому что это всего лишь одна отправляемая строка. Надеюсь, это кому-то поможет.

person Marcus Lind    schedule 16.04.2014
comment
Это сбивает с толку, я столкнулся с той же проблемой. Я чувствую, что где-то есть конфигурация, которая четко не задокументирована, или мы что-то упускаем. Обязательно отпишусь, если что-то найду. - person DeusExMachina25; 22.12.2015

Следующая политика должна предоставить вашему экземпляру 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": "*"
        }
    ]
}
person Anish Acharya    schedule 29.09.2014
comment
Так почему же он работал с обычным текстом, а не с JSON? См. проверенный ответ ниже. - person Marcus Lind; 30.09.2014
comment
Это правильное решение, должно быть помечено как ответ - person Santthosh; 22.03.2015
comment
Этот вопрос является «Популярным» с более чем 1000 просмотров. Было бы здорово, если бы вы могли объяснить, почему эта политика решает проблему, а не просто вставляет политику. - person Marcus Lind; 26.09.2016