Firebase Cloud Funtions 사용 시 EAI_AGAIN 오류

Firebase의 Cloud Functions를 사용하여 개발을 하는데, EAI_AGAIN 오류가 발생한 것에 대해 원인을 찾아보고 관련해서 정리한다.

로컬에서 함수를 실행하여 테스트할 때 node-fetch로 정상적으로 호출되던 것이 Firebase 서버로 배포를 하고나면 EAI_AGAIN 오류가 나는 것이었다.
아래는 해당 에러 로그이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FetchError: request to https://foo.com/bar failed, reason: getaddrinfo EAI_AGAIN foo.com:443
at ClientRequest.<anonymous> (/srv/node_modules/node-fetch/lib/index.js:1455:11)
at emitOne (events.js:116:13)
at ClientRequest.emit (events.js:211:7)
at TLSSocket.socketErrorListener (_http_client.js:401:9)
at emitOne (events.js:116:13)
at TLSSocket.emit (events.js:211:7)
at emitErrorNT (internal/streams/destroy.js:66:8)
at _combinedTickCallback (internal/process/next_tick.js:139:11)
at process._tickDomainCallback (internal/process/next_tick.js:219:9)
message: 'request to https://foo.com/bar failed, reason: getaddrinfo EAI_AGAIN foo.com:443',
type: 'system',
errno: 'EAI_AGAIN',
code: 'EAI_AGAIN'

해당 문제의 원인을 찾기위해 구글링을 했는데, Stack Overflow의 한 질문에서 원인을 알아냈다.
문제의 원인은 Firebase 요금제를 Spark 요금제를 사용하고 있기 때문이었다.

왜 Spark 요금제를 사용하는게 문제가 되냐면,
Spark 요금제에서는 외부 네트워크로 요청을 할 때는 구글 서비스만 요청이 가능하다.


Firebase 요금제 비교표에서 Cloud Functions의 Outbound networking을 보면 Google services only이다.
그렇기 때문에 외부 API를 호출하여 EAN_AGAIN 문제가 발생한 경우 Flame이나 Blaze 요금제로 변경해야한다.

나 역시 node-fetch를 통해 외부 API를 사용하려고 했는데, 개발용 Firebase 프로젝트는 Spark 요금제를 사용하고 있기 때문에 해당 이슈가 발생했던 것이다.
node-fetch를 통해 직접 API를 호출하는 것이 아니어도 외부 API를 호출하는 패키지를 사용한다면, 해당 패키지를 사용할 때 문제가 발생할 것이다.


참고
https://stackoverflow.com/questions/56066659/some-error-occures-after-send-request-to-the-function-url

Share