본문 바로가기

Server/Python

[python][error]Boto3 SignatureDoesNotMatch

아 파이썬에서 AWS S3 버킷을 통해 파일을 읽어오는 기능을 구현하려고 테스트 코드를 작성하는데, 로컬테스트 전에 우선 람다에서 바로 버킷 연결을 시도했다. 게정으로 돌다 보니 따로 설정해줄게 덜 할 것 같아서.

아니 근데 자꾸 boto3.client 객체의 generate_presigned_url 함수에서? 오류가 나는거?

정확히 말하면 presigned url 은 생성이 되는데, 접속을 하면 SignatureDoesNotMatch 오류를 띄우면서 16진수 문자열을 퉤퉤퉤 하더라.

더 짜증나는건 예전에 만들어둔 버킷은 (권한만 열어놓으면) 문제 없이 잘 연결이 되는데, 새로 생성한 버킷에서만 그 난리가 나는거임.

열심히 구글링을 해봤는데 나오는 해결책들은 다 내 케이스랑 맞지를 않고, 어디선 IAM 인지 S# 버킷인지 액세스키? 에 특정 문자열이 들어가면 안되고 이런 얘기를 하던데 아무리 봐도 그 전에 만들어둔 버킷이랑 설정차이도 없고 그냥! 안되는거!

버킷 내의 파일별로 등록된 경로로 접속하면 접속이 잘 되는걸 보아 파일이나 S3 문제는 아닐거라고 판단했는데, 

결론을 말하자면 버킷을 생성하고 어느정도 시간이 지난 후에야 생성된 presigned url 로 정상 접근되는걸 확인했다.

나는 버킷을 오후-저녁쯤 만들었는데, 다음날 오전에 실행해보니 생성된 url로 접근 시 정상 출력되더라. 어렴풋이 그 전에도 비슷한 일이 있었던 것 같아서 혹시 했는데 그게 그거였던 것 같음..

지금은 기존 lambda 함수에선 잘 되던 연결이 새로 만든 함수에서 생성된 url로 접근하면 AuthorizationQueryParametersError 를 내고 있어서, 이것도 해결하면 짤막하게 메모해둬야겠다. 왜 뻔히 서울 리전을 두고 버지니아 리전을 excepted 한다는지 모르겠네.

 

+ gateway api 메소드 요청 패스스루도 수정해봤는데, 나름 괜찮은 것 같다. 이것도 메모해두기

++ AuthorizationQueryParametersError 는 해결했다. 그냥 버킷 이름을 잘못썼었음

+++ 근데 이번엔 파일 데이터가 잘려서 나온다. 데이터가 커서 그런가 싶다가도 사실 그렇게 크지도 않고 200줄도 안 넘는 텍스트인데 잘리는게 이해가 안됨. 구글링 해봐도 s3.Object() 로 어쩌구 저쩌구 하는데 그게 어차피 s3 연결해서 get_object() 랑 똑같은거 하는거고, 디코팅을 해보면 get 자체에서 잘리는 것 같아서 아 화딱지나

-> 애먼데에 짜증내고 있었음. 파일 데이터는 잘리거나 하지 않고 그냥 lambda 내에서 print 로 데이터 찍을 때 출력 가능 길이를 초과해서 잘려 나왔던 것 같다. json.loads 가 안 됐던 이유는 파일 중간중간 주석이 들어있고, key 가 더블쿼터(")가 아니라 싱글쿼터(') 로 돼있거나 끝나는 값 뒤에 콤마(,) 가 붙어있거나.. 해서 그랬다. 역시 진정하고 냉정하게 문제를 분석하는게 중요한 듯