본문 바로가기

Monitoring

access_log 파일 참조 불가 문제 해결

나는 앱을 만들때, 같은 디렉토리에 access_log 파일을 테스트로 둔채, 개발을 진행했다. 따라서 다음과 같은 코드는 파일을 잘 가르키고 있었다.

const accessLogFile = process.env.ACCESS_LOG_FILE_LOCATION

왜냐면? 같은 디렉토리에 있으니까 잘 참조가 되었다. 그래서 환경변수를 처리해주어 EC2에서도 경로만 잘 지정하면 파일을 잘 참조할 수 있을줄 알았다. 그러나 에러가 발생하였다. 에러내용을 보자.

throw new ERR_INVALID_ARG_TYPE(propName, ['string', 'Buffer', 'URL'], path);
    ^

TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string or an instance of Buffer or URL. Received undefined

파일을 감시하는 라이브러리인 fsundefined 인 파일을 전달받았다고 한다. 즉, 파일을 찾지못했단 소리이다. access_log 의 경로를 바로 지정해도 똑같았다.


실험

정말 작업중인 디렉토리 외에는 파일을 참조할 수 없는지 확인해보기위해 실험을 진행하였다.

실제 access_log222는 없는 파일인데 콘솔을 찍어보면 뜬다. 이것은 그냥 문자열로 인식했다는 소리이다. 파일참조가 전혀 이루어지지않고 있다.

혹시나해서 fs 모듈을 적용시켰다. 그랬더니 파일이 잘 참조가 되는것이다.

맞다. 방법은 틀리지 않았다. 경로를 제대로 지정해준다면 파일을 참조할 수 있는 것이고, 이번 실험을 통해 다른 문제라는 것을 확신한다.

권한문제

일반적으로 access_log 를 읽고, 쓰는 권한은 일반적인 user 에게 부여되지 않는다.

인스턴스의 사용중인 ec2-user 에게도 access_log 를 읽을 권한을 줘야지만, watchFile.js 를 실행하는 앱도 그 파일을 참조할 수 있을 것이다.

리눅스 전문가가 되려면 보안을 잘 알아야하는데, 권한설정과 관련된 부분이 그 시작점이지싶다. chmod 로 파일 혹은 디렉토리의 권한을 수정할 수 있다.

조사를 하다 알게된 흥미로운 내용을 적어보겠다.

  • 리눅스는 사용자명과 같은 이름의 그룹을 만든다. 예를들어 ec2-user라는 사용자를 만들었다면, ec2-user라는 그룹이 만들어지고 해당 사용자가 속하게된다.
  • 실행권한(x)가 있어야 디렉토리에 들어갈 수 있다.

권한문제 해결

ls -l 명령어를 사용하여, 현재 파일, 디렉토리에 부여된 권한을 모두 확인할 수 있다. 부여된 권한을 확인해보고 내가 필요한대로 바꾸어본다.

access_log 가 위치한 httpdroot 사용자만, 읽고 쓰고 실행을 할 수 있다.

나는 모든 사용자가 httpd 에 접근할 수 있도록 실행권한을 주고싶다.

chmod +x httpd

다시 확인해보니, 실행권한이 모두 부여되었다.

그래서 해당 디렉토리에 들어가서 access_log 파일을 읽어봤다.

디렉토리의 다른 내용은 권한부족으로 볼 수 없지만, 원하는 로그파일은 성공적으로 읽었으니 됐다!


에러 해결

const accessLogFile = process.env.ACCESS_LOG_FILE_LOCATION
console.log(typeof(accesslogFile));

access_log 파일의 위치를 환경변수로 빼주면, 추후 다른 사용자도 앱을 사용하기 편하리라 생각했다.

그런데, accesslogFile의 위치를 환경변수로 하면, 올바른 파일을 받아올 수가 없고, typeof() 를 해보면 undefined 가 출력되는 것을 알 수 있다.

어쩔수없이 하드코딩으로 url 주소를 적으니 성공적으로 동작한다.

에러는 해결했지만, 더 좋은 방법이 없을까?