🚨주의) 2024.02.27 기준 엘라스틱 본사에 문의한 결과 AWS는 자신들 관할이 아니라 답변을 제대로 해줄 수 없다는 연락이 와서 결국 연결하지 못했음. 그래도 서버리스 외에 APM agent를 서버로 운영할 때는 APM agent 연결부분만 바꾸면 되기에 기록을 남긴다.
필자는 AWS Lambda를 이용해서 서버리스 프로젝트를 구현중이다. 그래서 해당 서버에 대한 로그를 Elastic APM(Application Performance Monitoring)을 활용해서 기록하고자 한다.
그것과 관련된 흐름은 아래와 같다.
- Elastic APM 서버 설정
- Elasticsearch 클러스터 연결
- APM Server에 Lambda를 연결
- Lambda 함수 구성
- IAM 역할 및 정책 구성
- 모니터링 및 로깅 (ex. Kibana)
들어가기 앞서 APM 에 대해서 간단히 알아보고 진행해보자.
APM Components (https://www.elastic.co/guide/en/apm/guide/8.6/apm-components.html)
Elastic APM 공식문서에 따르면 이 시스템은 아래의 주요 구성 요소로 구성된다.
Elastic APM의 구성요소와 관련하여 "APM Integration"이라는 용어가 등장한 것은 Elastic Stack의 최신 개발 방향성과 Elastic Agent의 도입과 관련이 있다. 기존에는 APM Server가 독립적인 컴포넌트로서 APM Agents로부터 데이터를 수집하고, 이를 Elasticsearch로 전송하는 역할을 담당했다. 그러나 Elastic Stack 7.11 이후부터 Elastic Agent와 Fleet의 도입으로 인프라스트럭처 및 애플리케이션 모니터링 방식에 중요한 변화가 생겼다.
APM Server: 이전까지 APM Server는 Elastic APM 데이터를 처리하고 Elasticsearch로 전송하는 독립 실행형 서버로 운영되었으며 사용자는 APM Server를 별도로 설치하고 관리해야 했다.
APM Integration: Elastic Agent는 여러 Elastic Observability 기능을 통합하는 역할을 하며, "APM Integration"은 이러한 새로운 패러다임에서 APM 기능을 Elastic Agent와 통합하는 방식을 의미한다. 이를 통해 사용자는 Elastic Agent를 통해 APM을 포함한 다양한 데이터 수집 작업을 관리할 수 있게 되었다. APM Integration을 사용하면, Elastic Agent가 APM Server의 역할을 수행하게 되어, 별도의 APM Server 설치 없이도 APM 기능을 사용할 수 있다.
결론적으로, "APM Integration"은 Elastic Agent를 통해 제공되는 APM 기능을 의미하며, 이는 전통적인 APM Server의 기능을 포함하고 있다.
Elastic APM의 데이터 모델은 애플리케이션 성능 모니터링 데이터를 구조화하는 방법을 정의한다. 이 모델은 여러 구성 요소로 나뉘며, 각각은 애플리케이션에서 수집된 다양한 유형의 데이터를 대표한다. 주요 구성 요소로는 트랜잭션(Transactions), 스팬(Spans), 에러(Errors), 및 메트릭(Metrics)이 있다.
APM Server를 구성하기 위해서 두가지 방법을 고려할 수 있다.
출처: 공식문서 사진
- APM Server 통합 활성화 (Elastic Cloud 사용 시): Elastic Cloud에서 제공하는 APM 및 Fleet 옵션을 사용하여 APM Server를 활성화한다. 배포 설정에서 APM을 선택하고, APM 서버를 배포에 추가한다.
- APM Server 구성 (자체 호스팅 시):
APM Server를 설치한다. apm-server.yml 구성 파일을 편집하여 Elasticsearch 클러스터와의 연결을 설정한다.
여기서 나는 Elastic Cloud 사용을 할 것이기에 Fleet 서버를 사용하기로 결정했다. 관련 설정을 하기 위해 팔로 팔로미🙏
엘라스틱 키바나 콘솔에 로그인한다음에 Management에 있는 Fleet로 간다.
그러면 이런 화면이 나오는데 Add Fleet Server를 눌러보자.
get started with fleet 를 디폴트값을 그대로 반영하고 Install Fleet Server 를 위해 ec2 인스턴스를 하나 만들고 해당 명령어를 실행해서 깔아보자.
여기서 Fleet Server를 설치한다는 것은 Elastic Agent를 실행할 호스트 머신에 Fleet Server 기능을 설치하는 것을 의미한다.
위의 명령어를 모두 수행하게되면 Elastic Agent부분이 다 설정된 것! APM agent를 람다함수에 연결해주면 된다.
ec2를 터미널 상에서 접근하는 흐름은 다음과 같다.
- ec2 인스턴스 생성시 발급받은
.pem
파일이 있는 위치로 이동한다.chmod 400 ec2key.pem
를 통해 권한을 축소시킨다.ssh -i "checkbara.pem" ec2주소.ap-northeast-2.compute.amazonaws.com
를 실행한다.
그런다음에 Install Fleet Server 명령어를 모두 실행한다. 그러면 다음단계로 넘어간다.
Fleet Server: Elastic Agent를 중앙에서 관리하고, 데이터를 수집하는 서비스
Elastic Agent: 실제 데이터를 수집하고, Fleet Server에 보내는 에이전트
일반적으로 Fleet Server는 중앙 관리 서버로 단독으로 설치되고, Elastic Agent는 Fleet Server에 연결하여 여러 호스트에서 데이터를 수집하는 용도로 설치된다. 하지만, 테스트 목적이거나 소규모 환경에서는 Fleet Server와 Elastic Agent를 동일한 호스트에 설치하는 것이 가능하다.
📍 결론적으로, EC2 인스턴스에 Fleet Server, Elastic Agent도 설치하면 인스턴스가 데이터 수집과 중앙 관리의 두 역할을 모두 수행하게 된다.
🚨 주의)실제 운영 환경에서는 보통 Fleet Server는 별도의 관리 호스트에 설치하고, Elastic Agent는 각각의 데이터를 수집할 호스트에 설치한다.
근데?!? 사실은 이러면 안된다..
Error: already installed at: /opt/Elastic/Agent
명령어를 수행하면 이런 에러가 발생한다.
애초에 fleet server install 하는 명령어가 agent도 깐거라서 그냥 안하면 된다. 나중에 다른 인스턴스에 설치할 때는 위 명령어를 수행하자!
나는 총 2가지 방법을 시도했다.
- 람다 핸들러 함수내에 agent를 하드코딩하기
- 람다 환경변수에 agent 관련 내용 적기
결론부터 말하자면 둘다 실패했다.
1번을 수행하기 위해 아래와 같이 agent를 넣어주었다.
SERVICE_NAME = os.getenv('SERVICE_NAME')
SECRET_TOKEN = os.getenv('SECRET_TOKEN')
SERVER_URL = os.getenv('SERVER_URL')
# Elastic APM 구성
client = elasticapm.Client({
'SERVICE_NAME': SERVICE_NAME,
'SECRET_TOKEN': SECRET_TOKEN,
'SERVER_URL': SERVER_URL,
})
근데 나온 에러는 Failed to submit message: 'HTTP 401: {"error":{"root_cause":[{"type":"security_exception","reason":"unable to authenticate with provided credentials and anonymous access is not allowed for this request","additional_unsuccessful_credentials":"oauth2 token: invalid token","header":{"WWW-Authenticate":["Basic realm=\\"security\\" charset=\\"UTF-8\\"","Bearer realm=\\"security\\"","ApiKey"]}}],
와 여러가지 설정을 만졌는데 'HTTP 400: 400 Bad Request'
이런에러를 만났었다...
그래서 나는 컨테이너를 통해 람다함수를 만든 것이라 다른 건가 싶어서 공식 Docs를 확인해봤다.
람다 apm 관련 공식문서
위 레퍼런스를 참고로 해서 그대로 환경변수 설정을 다 해줬는데 agent가 제대로 실행이 안되는 건지 Elastic에 있는 observability에 APM에 내가 사용하고자 하는 람다 로그가 안쌓였다... 이걸 진짜 3일 내내 여러가지 시도를 했는데 결국 원인을 찾지 못했고 관계자분께 여쭤보니 맨 위에 언급한 답변을 주셨다...
어찌됐건 실패했으나 agent부분만 바꾸면 실행될 것이기에 기록은 남긴다.
그래도 왜 실패한건지 프로젝트가 끝났음에도 끊임없이 탐구하는 내 자신이 진짜 개발자의 길로 들어가는 것 같아 많은 생각이 들게하는 로깅하기 좌충우돌 우당탕탕 작업이였다!