Как я исправил ошибку aws SignatureDoesNotMatch при настройке приложения
Все началось здесь.
level=error ts=2021–08–10T15:37:08.952533603Z caller=cortex.go:401 msg=”module failed” module=alertmanager err=”invalid service state: Failed, ожидаемо: Running, failure: SignatureDoesNotMatch : Рассчитанная нами подпись запроса не соответствует предоставленной вами подписи. Проверьте свой ключ и метод подписи.\n\tКод статуса: 403, идентификатор запроса: 1699FC02BBE5816F, идентификатор хоста: “
Я пытался настроить метрики cortex и использовал приведенную ниже конфигурацию для alertmanager.
alertmanager: external_url: http://random.com/alertmanager enable_api: true storage: type: s3 s3: endpoint: 172.17.0.1:9000 bucketnames: cortex/am access_key_id: admin secret_access_key: admin signature_version: v4 insecure: true
Используемый здесь подход в целом похож на то, как вы отлаживаете любую проблему, и не относится к кортексу как таковому.
Проблема:
Cortex не запускался с ошибкой SignatureDoesNotMatch.
Во время запуска cortex инициализирует alertmanager, который извлекает информацию о корзине из minio для настройки предупреждений, и minio выдает ошибку.
Я использовал minio в качестве магазина s3. Поэтому в дальнейшем я буду использовать термины s3 или minio как синонимы.
Теперь давайте отладим эту проблему, например, как вы пересекаете уровни в игре.
Основные проверки
Услуги запущены, и мы используем правильные значения по умолчанию.
Сам по себе minio был доступен по адресу 172.17.0.1:9000, и я смог создать корзину с помощью клиента minio cli. Политика ведра открыта для тестирования.
Происхождение ошибки
2021-08-11T01:49:10:000 [403 Forbidden] s3.ListObjectsV2 172.17.0.1/cortex/am?delimiter=&list-type=2&prefix=alerts%2F 172.30.0.1 341µs ↑ 93 B ↓ 643 B
Выше приведен журнал доступа minio при запуске cortex.
Попытался использовать неправильный ключ доступа в конфигурации alertmanager s3 и получил ошибку ниже. Это означает, что запрос достиг minio и выдал ошибку.
Предоставленный вами идентификатор ключа доступа не существует в наших записях
Возможная причина
Поскольку ошибка была связана с ошибкой подписи aws, я просмотрел поля запроса, которые использовались для создания подписи aws.
- Регион был исключен, так как us-east-1 был по умолчанию в minio, и то же самое было явно указано в конфигурации alertmanager.
- В minio подпись по умолчанию — v4, и я смог это проверить.
Так что, скорее всего, некоторые поля, такие как путь запроса или параметры хоста или запроса, вызывали проблему, поскольку эти поля используются при создании и проверке подписи?
Запрос на отслеживание
Я проверил, что с помощью aws cli я смог создать и перечислить сегменты в minio. Так что даже aws cli работал нормально.
AWS_PROFILE=s3-store aws --debug --endpoint-url http://172.17.0.1:9000 s3 ls s3://cortex/am
Круто!
Итак, давайте сравним запрос от aws cli и от cortex. Для этого вместо фактической конечной точки minio я запустил прослушиватель nc на случайном порту (8000) и указал конечную точку aws cli и конечную точку alertmanager s3 на этот поддельный minio.
nc -l 8000
- запрос коры на подделку минио
Logs from cortex to fake minio GET /cortex%2Fam?delimiter=&list-type=2&prefix=alerts%2F HTTP/1.1 Host: my-system-ip:8000 User-Agent: aws-sdk-go/1.35.31 (go1.16.2; linux; amd64) Authorization: AWS4-HMAC-SHA256 Credential=admin/20210810/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=3ebb08e65c83270ea50f4ef0ec7ae74d26b196cb1f706ec495c540496f787e79 X-Amz-Content-Sha256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 X-Amz-Date: 20210810T201626Z Accept-Encoding: gzip
- aws cli запрос на подделку minio
Command AWS_PROFILE=s3-store aws --debug --endpoint-url http://localhost:8000 s3 ls s3://cortex/am aws cli to fake minio Logs GET /cortex?list-type=2&prefix=am&delimiter=%2F&encoding-type=url HTTP/1.1 Host: 192.168.43.205:10920 Accept-Encoding: identity User-Agent: aws-cli/2.0.45 Python/3.7.3 Linux/5.4.0-72-generic exe/x86_64.ubuntu.18 command/s3.ls X-Amz-Date: 20210810T201104Z X-Amz-Content-SHA256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 Authorization: AWS4-HMAC-SHA256 Credential=admin/20210810/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=ef09dc9ac293f65a92ed45f87c3758251127d8f7c893982db4ec0906f2cb222d
Итак, если вы видите, кроме пути, оба журнала похожи в большинстве аспектов (поля подписи aws и т. д.)
Основное отличие выглядит как путь.
cortex: /cortex%2Fam aws cli: /cortex
Двигайтесь в направлении ошибки :-)
Теперь, когда у нас есть некоторая информация из трассировки, я использовал cortex в качестве имени корзины вместо cortex/am в конфигурации alertmanager s3, и это сработало. Хой ……
Поэтому, когда имя корзины s3 имеет / , возникает ошибка SignatureDoesNotMatch .
Повышаем уровень (часть 2)