AWS 라이브러리의 SignatureDoesNotMatch 해결 방법

AWS 클라이언트를 이용할 때 발생한 SignatureDoesNotMatch 에러의 원인과 해결 방법.

2017. 05. 21. #aws

Flask 웹 서버를 만들며 AWS를 사용하던 중 부딪힌 에러 상황입니다.

앱이 어느 정도 완성되어 로컬에서 안정적으로 돌아가는 것을 확인했습니다. 이제 실 서비스를 준비하기 위해 서버에 도커 이미지를 올리고 컨테이너를 띄웠는데, 실행은 잘 됐지만 이상하게도 boto3 (AWS의 python 라이브러리) 를 직접 사용하는 로직만 거치면 500 에러가 발생했습니다.

로그를 살펴보니 아래와 같은 현상이 이유였습니다.

현상

AWS 클라이언트 라이브러리를 사용할 때 다음과 유사한 에러 메시지가 발생하며, 아무런 동작도 일어나지 않습니다.

botocore.exceptions.ClientError: An error occurred (SignatureDoesNotMatch) when calling the ListObjects operation: The request signature we calculated does not match the signature you provided. Check your key and signing method.

에러 메시지는 동작 메소드마다 조금씩 차이가 있습니다. boto3 뿐만 아니라 aws-cli, aws-js, aws-ruby 등 다른 언어의 라이브러리에서도 동일한 에러 메시지를 내뿜습니다.

원인

놀랍게도 위 에러는 AWS IAM Credential의 Secret Access Key의 / 또는 % 기호가 포함되어있을 때 발생합니다.

아마도 / 또는 % 문자를 escape 문자로 처리해 Access Key가 변형되는 것이 직접적인 원인인 것으로 보입니다. 사실 AWS 라이브러리보다는 OS의 문제에 가까운 것 같네요.

해결책

CentOS 7 환경에서만 확인된 내용입니다. 다른 환경에서의 동작은 보장하지 않습니다.

해결책은 더욱 놀랍게도, Secret Access Key에 위 기호들이 포함되지 않을 때까지 IAM Credential을 새로 만드는 방법 밖에 없습니다.

검색하시다보면 환경 변수를 새로 설정하라거나, boto3 클라이언트를 가져올 때 access key를 집어넣으라는 등등 다양한 민간 요법(?)이 돌아다니고 있습니다. 하지만 이런 민간 요법은 아무런 의미가 없습니다. IAM Credential을 새로 만드세요.

처음에 Github에서 'IAM 계정을 새로 만드세요'라는 해결책을 읽었을 때는 말도 안되는 소리라고 생각하고 넘겼는데, 그게 지금까지 알려진 유일한 해결책인 것 같습니다.

이런 상황에 대한 예외 처리를 AWS쪽에서 제공해줬다면 얼마나 좋았을까요. 별 것 없는 이유 때문에 2시간을 헤맸다는 사실이 가슴아프기만 합니다. 하다 못해 에러 메시지라도 명확하게 써줬으면 하는 바람입니다. 일해라 AWS.

크리에이티브 커먼즈 라이선스

이 저작물은 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

© 2011 - 2020 Do Hoerin, LYnLab