오늘 배운 것

저번 포스트에서 프론트의 앱 배포를 빨리 실행하기 위해서 에뮬레이터를 새로 설치하고 hypervisor를 깔고... 등등 이런 방법들을 시도했었다. 사실 hypervisor를 까는 것은 너무 간 이야기였다. 그 윈도우 OS에서 또 에뮬레이터를 깔고 실행을 시켜야 했기 때문에, 만약 에러를 재현하는 데 성공해도 그 윈도우의 에뮬레이터 단에서 에러를 디버깅하고 해결해야 했다. 

 

그래서 멘토님께 조언을 구하던 중, 문득 '그렇다면 최소 요구 API 버전을 올리면 되는 거 아닌가?' 라는 생각이 들었다. 현재 최소 요구 버전은 23인데, 우리 팀은 다 33 이상에서만 테스트를 하고 있었다. 그렇다면 32 버전에서의 에러도 어떻게 보면 모를 수밖에 없었던 것이다. 이렇게 하면 해당 안드로이드 버전에서의 오류는 무시가 가능하다. 다만 걱정되는 부분은 일단 버전을 올려버리면 해결되는 것이 맞는지, 그에 대한 단점은 없을지였다. 

 

그런데 정말 다행히, 왜인지는 모르겠지만 우리를 애먹게 하던 안드로이드 버전 오류가 구글 플레이스토어를 다시 보니 해결되어 있었다. 그래서 해당 고민은 더 이상 하지 않아도 되었다. 

 

그리고 프론트 앱 배포에 필요한 테스터 20명도 모집했다. 이제 14일간 비공개 테스트 결과를 기다리면 된다. 


그러면 이제 원래 하던 이슈들을 보면 되는데, 생각해보니 현재 프론트 서버에서 배포 버전에서는 프로덕션 서버에 요청을 보내고 있었는데, 막상 프로덕션 서버에 몇 가지의 문제가 있었다. 

 

첫 번째는 main 브랜치로 코드를 반영할 때 워크플로우가 실패한다는 점, 두 번째는 안드로이드 클라이언트 ID를 요청하는 API가 프로덕션 서버에 반영되지 않았다는 점, 세 번째는 프로덕션 서버에서 HTTPS 대신 HTTP를 사용한다는 점이 문제이다. 마지막으로 네 번째는 이렇게 프로덕션 서버에 어떤 API가 있는지를 /swagger URL을 통해 알 수 있었는데, 그 URL이 프로덕션 서버에는 나오지 않는 문제였다. 

 

우선 첫 번째 문제의 경우 이전에 develop 브랜치에서 ECS에서 사용하는 태스크 정의 파일을 JSON 파일 템플릿에서 동적으로 환경변수를 주입하도록 바꿔 주었는데, 그 부분이 문제인 것 같았다. 정확히는 해당 템플릿에서 ECS 개발 클러스터에 대한 고유한 정보가 포함되어 있어서, 이를 main 브랜치를 통해 프로덕션 서버에서 ECS 태스크를 생성하려고 했을 때 '해당 이름의 컨테이너는 없다'는 에러가 난 것이었다. 

 

그래서 기존에 사용하던 ecs-task-def.json 파일 말고 프로덕션 서버 배포 시 사용하는 템플릿으로 ecs-task-prod-def.json 파일을 하나 더 만들어주었더니 해당 문제는 해결되었다. 

 

이제 두 번째 이슈를 해결해야 했다. 왜 main 브랜치에도 안드로이드 클라이언트 ID값을 반환하는 API가 잘 정의되어 있는데 막상 프로덕션 서버에는 없다고 나오는 것일까? 아마도 깃허브 워크플로우 자체는 정상적으로 실행되었지만 이후에 ECS에 의해 롤백되었을 가능성이 있겠다. AWS ECS의 프로덕션 클러스터의 서비스>이벤트에서 롤백과 관련된 로그를 찾을 수 있었다. 

 

그렇다면 왜 롤백되었을까? 해당 서비스의 태스크로 들어가서 로그를 보자. 정확히는 CloudWatch에서 해당 시각에 실행된 태스크의 로그를 보니 답을 찾을 수 있었다. 단순 typo 때문에 생긴 오류였다. 고치고 다시 깃헙 워크플로우를 실행시켰다. 

 

그리고 서버가 HTTP를 사용하여 통신하는 문제를 고치기 위해서 방법을 찾아봤다. AWS의 ACM이나 CloudFront 같은 새로운 서비스를 사용하라고 나와서 제법 복잡하다고 느껴졌다. ACM은 AWS Certificate Manager의 약자인 듯 해서 여러가지 인증서를 관리하는 서비스라고 이해했고, CloudFront는 '글로벌 콘텐츠 전송 네트워크'라고 나와있어서 사실 무슨 서비스인지 와닿지는 않았다. 

 

 오늘 배운 것

1. 특정 안드로이드 API 버전에서 나는 에러는 어떻게 해결할까?

2. 최소 안드로이드 API 버전을 올리는 것이 '옳은' 선택일까? 다른 장단점은 없을까? 

3. 안드로이드 API에서 타깃 버전과 최소 요구 버전의 차이는 무엇일까?

4. ACM과 CloudFront는 정확히 무슨 역할을 하는 서비스일까? 

 

 오늘의 러닝 인증

컨디션 난조(편두통)로 오늘 인증은 패스하겠습니다ㅜㅜ

 

+ Recent posts