파이널 프로젝트(트러블 슈팅)

Numberbeen·2023년 3월 22일
0

AWS

목록 보기
13/13

SES 서비스에 대한 연결 테스트.

프라이빗 lambda 함수에서 vpc endpoint 를 통해 접근하여 dynamo db 에서 지정한 데이터를 가져와 SES 서비스로 가는 vpc endpoint 를 통해서 전달하는 테스트를 진행하고 있다.

1차로 어제 DB에 접근하는 것보다 난관이었다. 모든게 잘되는데 자꾸 TASK TIMEOUT 에러가 출력되는 것.

vpc 와 서브넷 설정 보안그룹 설정 모든걸 확인 했으나 해결을 못했다.

정훈님에게 SOS 요청했으나 우리가 확인 한 방법대로가 맞고 그렇게 했을 때 되는게 정상이라고 하셨다… 하지만… 안됬다.

결국 우린 원인을 찾지 못한채 삭제하고 다시 해보자 하던중 동훈님께서 갑자기 성공하셨다. 과정에 대해 물으니... 그냥 똑같이 삭제하고 똑같이 만들었다.

결국 원인을 못찾고 이 부분에서는 넘어갔다.

DB에서 받은 데이터를 SES 전송 테스트

DB 에서 받은 데이터를 통해 SES 서비스로 보내줘야되는데 받기만 하고 SES 서비스로 보내지를 않는다…

환경변수에 위와 같이 입력하고 테스트를 하게되면?

로그는 성공이라 하지만 end point 값이 달라서 error 가 뜨고 있다. 성공인데 왜 앤드포인트를 못찾는 거지? 우리가 적은 엔드포인트가 이상한건가? (vpce-01984a4efad70611f-email-smtp.ap-northeast-2.amazonaws.com) 챗 GPT와 구글에 온갖 검색을 해도 저게 맞는거 같은데…. 어지럽다.

한번더 해당 vpc endpoint 가서 확인해보았다.

유심히 보던중 DNS 이름이 눈에 보였다. 첫번째 DNS 를 가져와서 환경변수 값에 넣어봤다.

그러고 테스트를 다시 해보니?

실패가 뜨는 대신에 endpoint 가 잘못됬다는 메시지는 사라진걸로 확인된다.

다만 task timed out 라는 6초동안 실행해도 안됬다는 오류만 뜨는걸 확인 할 수 있다.

여기서 나의 킹리적인 의심에 의한 추측으로는 endpoint 주소는 저기서 가져오는게 맞는게 아닌가???

위의 timed out 오류는 대부분 권한에 문제라고 했는데 어딘가 권한이 잘못된건가…?

아니면 디비에 못갔을때 처럼 다시만드면 되는 것인가…?

혹시 몰라서 퍼블릭 환경에서 테스트할때는 잘만 된다… ㅜㅜ

혹시 몰라서 환경변수의 1이라고 값을 입력하고 테스트를 돌려본다.

테스트 성공이라 나오지만 아래의 에러의 오류로 확인 했을때 처음에 입력했던 엔드포인트의 에러와 같은걸 볼 수 있다.

그럼 엔드포인트 주소는 두번째 테스트에서 사용한 그 주소가 맞다는 거라고 추측해본다.

(vpce-01984a4efad70611f-orh7rxhg.email-smtp.ap-northeast-2.vpce.amazonaws.com)!

해당 lambda 의 vpc 구성.

해당 람다의 연결된 vpc endpoint

결국 성공하지 못한채... 하루를 마무리 했다.

다음날 테스트 시작...

시간이 없다 오늘 해내야된다.
우리는 이벤트 푸쉬알림에서 바로 SES 서비스로 연결하였고 성공까지 하였다.

문제는 프라이빗…서브넷에 넣으면서 모든 원흉이 시작이 되었다.

보안적인 측면을 위해서도 퍼블릭이 아닌 프라이빗에 위치하고 싶었고 이를 해결하는데 2~3 일 정도 소요되었다.

저놈의 task timeout 만 뜨고 자세한 오류도 안나오고 권한 다줬고… 서브넷 지정 다했고 라우터테이블 다 설정하고 vpc endpoint 로 ses 와 연결까지 다했다.

안된다….. 원인도 모르겠다. 도중에 SNS 서비스로 전환을 해볼까도 싶었지만 프로젝트에서 우리가 사용한 서비스들의 다양성을 추구하기 위해 끝까지 SES 를 물고 늘어졌다.

그래서 마지막 지푸라기라도 잡는 심정으로 한번 해보자는 식으로 우린 NAT Gateway 를 붙였다.

NAT 는 신이다.

(이건 왜 아직도 vpc endpoint 로 구현이 안됬는지 의문임)

ECR 배포 문제

프라이빗 서브넷에 ECS 넣어놓고 vpc앤드포인트로 dynamo db 연결됬고 이제 ecs 배포하면 딱 되야되는데 또 안된다… 또 머리 싸매며 고민하다.
코드도 수정하고 권한도 다시줘보고 삭제도 해보고 별걸 다 해보던중...
그러다 배포해 실패한 테스크들에 접속하여 무슨 이유에서 꺼졌는지 확인해보았다.

위의 사진처럼 테스크 하나만 확인했고 어 이에러는 뭐지 하며 그 에러에 대한 디버깅만 계속 하다 해결이 되지않아 아무생각 없이 다른 테스크들도 확인해보니 어라...? 멈춘 이유가 다 다르다?? 뭐지... 그럼 권한도 아니고... 이런 경우는 어떻게 대처를 해야할지 몰랐다.

이번에도 지푸라기라도 잡는 식으로 마음으로는 장난식으로 한번 NAT 붙여볼까요?

낫트는 GOAT 다.

바로 성공해버렸다… 정상 배포가 된다… 그치만 이 NAT 를 연결하면 굳이 ECS 를 프라이빗 서브넷에 놓는 의미가 없다…

그래서 우리는 낫트게이트웨이를 배포가 끝나면 삭제하는 방향으로 진행하려고 했으나 한가지 문제점을 발견했다.

ECS 에서 컨테이너 이미지가 새로운 버전일때나 수정됬을때 새로운 버전으로 배포가 안된다는 점이었다.

우린 이를 낫트 게이트웨이를 지움으로써 배포가 안된다고 문제를 축소시켰고, 각종 구글링과 챗 gpt에 물어 물어 가며 진행하였다 그러던중 아래와 같은

사이트에서 정답을 찾았다. 이틀을 앓던 일이 속시원히 해결된 것이다.

결론부터 말하자면 vpc endpoint 로 각각의 서비스와 연결시켜줬어야 했는데. 우리는 dynamo db에 연결만 하면 되겠지라는 생각에 dynamo db 의 endpoint 만 만들어주고 테스트를 진행했기 때문에 안되는 거였다.

사실 여러개의 endpoint 를 달아서 진작에 끝냈을 수 도 있던 문제였는데, 문제는 우리가 테라폼 진행하기전에 만들어논 서비스가 잘 돌아가고 있었던게 문제라면 문제였다.

테라폼 작성할때 원래 가용중인 서비스를 기반으로 작성했고, 어 이건 이거랑만 연결되있네? 이러면서 진행했기 때문에 다른 서비스에 vpc endpoint 를 연결해볼 생각도 안했다.

아래는 공식 사이트에서 따온 캡쳐본과 링크이다.

https://aws.amazon.com/ko/premiumsupport/knowledge-center/ecs-fargate-tasks-private-subnet/ (링크)

lambda 함수 IAC 작업 이슈

우리팀에서는 테라폼 관련한 이슈가 굉장히 많다. 이번에도 원래의 서비스를 테라폼으로 구현하다 생긴 이슈이다.

문제는 lambda 함수에 RESET API GATEWAY 를 붙이는 작업에서 생겼다. 수많은 코드를 써가며 공식문서도 찾으며 챗 GPT 와 협업을 하며 진행했지만…

아무리 지우고 다시 만들어도 api gateway 가 정상 작동을 하지 않는 것… 그래서 우린 terraform 으로 실행된 lambda 함수에 api gateway 를 콘솔에서 붙여보았다.

결과는 정상적으로 실행되며, 테스트가 만족스럽게 됬다.

그럼 문제는 축소됬다. 아 정말 api gateway 의 연결 문제구나, 저거만 붙이면 이건 되겠구나, 방식에 문제구나 코드를 다시 짰다.

# 게이트웨이와 auth lambda 연결
resource "aws_api_gateway_resource" "auth_resource" {
  parent_id   = aws_api_gateway_rest_api.please.root_resource_id
  path_part   = "auth"
  rest_api_id = aws_api_gateway_rest_api.please.id
}

resource "aws_api_gateway_method" "auth_method" {
  authorization = "NONE"
  http_method   = "ANY"
  resource_id   = aws_api_gateway_resource.auth_resource.id
  rest_api_id   = aws_api_gateway_rest_api.please.id
}

resource "aws_api_gateway_integration" "integration" {
  rest_api_id             = aws_api_gateway_rest_api.please.id
  resource_id             = aws_api_gateway_resource.auth_resource.id
  http_method             = aws_api_gateway_method.auth_method.http_method
  integration_http_method = "ANY"
  type                    = "AWS"
  uri                     = aws_lambda_function.user_auth.invoke_arn
}

위 코드처럼 만들고 테라폼을 실행하였다. 성공적으로 게이트웨이가 생겼으나… 마찬가지로 겉으로는 연결된 것처럼 보이지만 정상 작동 하지 않았다.

그래서 이게 겉만 멀쩡하고 속빈강정인가 싶어서 생성한 api gateway 를 콘솔에서 확인하였다.

지금은 Method Response, Intergraion Response 부분에 값이 들어가 있지만, 위의 코드를 실행시켰을 때 저 부분이 공백이었다.

와 씌… 그것도 모르고 계속 위의 코드만 만지작 만지작 했다… 결론은 코드가 부족했던 것

resource "aws_api_gateway_integration_response" "auth_integration_response" {
  rest_api_id       = aws_api_gateway_rest_api.please.id
  resource_id       = aws_api_gateway_resource.auth_resource.id
  http_method       = aws_api_gateway_method.auth_method.http_method
  status_code       = "200"
  response_templates = {
    "application/json" = "$input.json('$')"
  }
    depends_on = [aws_api_gateway_integration.integration]
}

resource "aws_api_gateway_method_response" "auth_method_response" {
  rest_api_id = aws_api_gateway_rest_api.please.id
  resource_id = aws_api_gateway_resource.auth_resource.id
  http_method = aws_api_gateway_method.auth_method.http_method
  status_code = "200"
  response_models = {
    "application/json" = "Empty"
  }
}

위 코드를 추가해서 다시 테라폼으로 실행하였다.

결과는……

실패.

테스트가 안된다. api gateway 콘솔에서 확인하니 정상적으로 모든 값이 들어와 있는데… 왜 안되지? 고민에 고민에 고민에 고민을 하던 찰나 이 고민을 해결해준 사람은 팀원들도 아니었고 챗 gpt 도 아니었다.

그 귀인 은 지금 유럽 어딘가에서 활동하는 개발자였다.

링크 주소까지는 기억이 안나지만… 구글링 하다 발견한 내용을 서술하자면

resource "aws_api_gateway_integration" "integration" {
  rest_api_id             = aws_api_gateway_rest_api.please.id
  resource_id             = aws_api_gateway_resource.auth_resource.id
  http_method             = aws_api_gateway_method.auth_method.http_method
  integration_http_method = "ANY"
  type                    = "AWS"
  uri                     = aws_lambda_function.user_auth.invoke_arn
}

이 코드는 내가 생성한 api gateway 와 lambda 함수를 연결해주는 코드이다.

여기서 난 우리가 사용하는 HTTP 메서드가 ANY 라서 ANY 값을 당연하게 주고 실행했으나, 여기서는 ANY 를 주면 안된다.

연결할때는 api gateway 와 lambda 메서드는 POST 로 연결해야 연결이 정상적으로 된다고 한다.

HTTP 메서드를 POST 로 바꾸고 바로 실행하니…

성공.

profile
내기 이해한 것을 보관하는 곳

0개의 댓글