목록DevOps (11)

LogQLLogQL은 Log Stream Selector를 통해 동작한다. Log Stream Selector는 ,로 분리된 여러 쌍의 Key-Value 형태로 명시된다. 여러 쌍의 Key-Value 데이터들을 { } 로 감싸서 Stream Selector를 구분하게 된다. Grafana에서 제공하는 intro-to-mltp 프로젝트에서 Builder를 통해 label을 선택하게 되면 아래쪽에 Log Stream Selector를 확인할 수 있다.{level="error", beast="beholder"} 위 예제의 Log Stream Selector는 모든 Log Stream들 중에서 명시된 Key-Value의 label들을 가지는 스트림들만 쿼리 결과에 포함시키게 된다. LogQL은 이외에도 여러 연..

Project Architecture Diagram아래의 아키텍처는 Grafana에서 제공하는 intro-to-mltp라는 프로젝트의 아키텍처로, 본 글은 Grafana의 Loki, Grafana, Tempo, Mimir를 통해 해당 프로젝트에서 발생하는 에러의 원인을 파악하는 것을 목적으로 한다.Loki로그는 어디서든 발생할 수 있기 때문에 로그에서 특정한 내용을 찾으려고 할 때 다소 어려움이 존재할 수 있다. 또한 시스템의 가동 시간이 길어지고 사용량이 많아질 수록 기록이 방대해지면서 저장 공간의 필요성도 커지고 있다. 또한, 방대한 양의 로그를 어떤 식으로 결합하고 의미있는 방식으로 집계할지에 대한 고민이 필요하다.이에 더해, 영구적이지 않은 저장소에서 정보를 추출하는 것은 불확실성을 내포하고 있기..

Observability란?인체는 서로 다른 기능을 수행하는 여러 시스템으로 구성되어 있다. 소화계, 호흡계, 신경계, 근육 등 모든 시스템이 모여 하나의 인체를 형성한다.이중 하나 이상의 시스템이 제대로 동작하지 않을 때, 우리는 원인 모를 질병에 시달리거나 기력을 상실할 것이다. 이를 해결하기 위해 우리는 인체의 전문가 즉, 의사를 찾아간다. 의사는 인체의 체온, 혈압, 산소 수치 등과 같은 신체 지표를 우선 측정한다. 해당 진찰을 통해 우리의 신체 지표 중 이상이 발생한 부분을 발견하고 원인을 파악하기 위해 다양한 검진을 진행할 수 있다. 이를 통해 의사는 우리 인체 내부에서 무슨 일이 발생하는지 어디서 발생하는 지를 더 자세히 알아볼 수 있다. 또한, 이를 통해 의사는 문제를 해결하고 동일한 문제..

top 명령어로 확인하는 프로세스 정보리눅스 환경에서 사용하는 top 명령어는 주로 동작하고 있는 프로세스의 정보를 손쉽게 확인하여 리눅스 시스템의 상태를 전반적으로 빠르게 확인할 수 있는 명령어다. top 명령어를 사용하게 되면 프로세스의 상태가 여러 수치들과 함께 화면에 표현되는데 이 수치들이 각각 어떤 의미를 가지고 있는지 알아보도록 하자.각 수치가 의미하는 정보현재 서버의 시간과 서버의 구동 시간이 표시된다.사용자가 몇 명이나 로그인해 있는지, 시스템의 Load Average는 어느 정도인지 보여준다.Load Average란 현재 시스템이 얼마나 많이 동작하고 있는지 보여주고 있는 지표로 해당 수치가 높으면 높을 수록 서버가 열심히 일하고 있다는 것을 의미한다.현재 시스템에서 구동 중인 프로세스의..
Overview컨테이너로 배포되는 애플리케이션은 컨테이너 이미지의 크기가 작을수록 빠르게 실행하고 확장할 수 있으며 이미지 보관 및 전송에 드는 비용이 절감된다. Java 기반의 애플리케이션은 JVM이 함께 배포되어야 하기 때문에 Go 언어와 같은 바이너리 형태로 배포되는 애플리케이션에 비해 컨테이너 이미지의 크기가 비대하다. 이번 글에서는 jdeps와 jlink가 각각 어떤 명령어인지 알아보고 해당 명령어를 통해 Java 기반의 애플리케이션 컨테이너를 경량화 하는 방법에 대해 알아보고자 한다. 본 포스팅은 AWS 기술 블로그와 일본 개발자분의 포스팅을 토대로 작성되었다. https://qiita.com/yTakada-gxp/items/f681d28f31e999e5dfaehttps://aws.amazon..

Provider테라폼은 terraform 바이너리 파일을 시작으로 로컬 환경이나 배포 서버와 같은 원격 환경에서 원하는 대상을 호출하는 방식으로 실행된다. 이때 호출되는 대상은 프로바이더가 제공하는 API를 호출해 상호작용 하게 된다. 즉, 테라폼이 대상과의 상호작용을 할 수 있도록 하는 것을 프로바이더라 한다. 각 프로바이더의 API 구현은 서로 다르지만, 테라폼의 고유 문법으로 동일한 동작을 수행하도록 구현되어 있다. 프로바이더는 플러그인 형태로 테라폼에 결합되어 대상이 되는 클라우드, SaaS, 기타 서비스 API를 사용해 동작을 수행한다. 각 프로바이더는 테라폼이 관리하는 리소스 유형과 데이터 소스를 사용할 수 있도록 연결한다. 그렇기 때문에 테라폼은 프로바이더 없이는 어떤 종류의 인프라와 서비스..

Terraform 조건식테라폼에서의 조건식은 삼항 연산자 형태를 갖는다. ? : 조건식의 각 조건은 비교 대상의 형태가 다르면 테라폼 실행 시 조건 비교를 위해 형태를 추론하여 자동으로 변환되는데, 혼란이 발생할 수 있기 때문에 명시적인 형태로 작성하는 편이 좋다.var.example ? tostring(12) : "hello" # 권장var.example ? "12" : "hello" # 권장 count와 조건식을 결합하여 사용하는 경우 특정 조건에 따라 리소스 생성 여부를 선택하는 방식으로 작성할 수 있다.variable "enable_file" { default = true}resource "local_file" "foo" { count = var.enable_file ? 1 : 0..

Helm?헬름은 The Package Manager for Kubernetes, 즉 쿠버네티스의 패키지 관리를 위한 툴이다. 여기서 패키지란, Helm Charts를 패키징한 것을 의미한다. 여기서 차트란 쿠버네티스의 리소스 yaml 파일을 템플릿화하여 메타 정보 파일 등을 압축한 파일을 뜻한다. 템플릿이란 쿠버네티스 환경에서 특정 프로그램을 실행시킬 수 있도록 해주는 리소스인 Deployment 혹은 Service 등을 포함하는 일종의 리소스 모음을 의미한다.Helm Chart StructureHelm의 공식문서를 살펴보면 헬름 차트는 이와 같은 구조를 갖는다. 구조에서 확인할 수 있는 각 파일 및 폴더는 다음과 같은 역할을 한다. templates/ 디렉토리는 template 파일을 보관하기 위한 디..

Terraform 반복문list 형태의 값 목록이나 Key-Value 형태의 문자열 집합인 데이터가 있는 경우 반복문을 통해 관리할 수 있다. 또한, 단순한 자료구조뿐만 아니라 리소스 내에 생성된 블록에 대한 것도 반복문을 통해 코드의 중복 없이 동적으로 생성이 가능하다.count리소스 또는 모듈 블록에 count값이 정수인 인수가 포함된 경우 선언된 정수 값만큼 리소스나 모듈을 생성하게 된다.count에서 생성되는 참조값은 count.index이며, 반복하는 경우 0부터 1씩 증가해 인덱스가 부여된다. main.tf를 아래와 같이 작성해보자.resource "local_file" "abc" { count = 5 content = "abc" filename = "${path.module}..

Terraform initterraform init 명령어는 테라폼 구성 파일이 있는 작업 디렉토리를 초기화하는데 사용한다. 이 작업을 실행하는 디렉토리를루트 모듈이라고 부른다. 테라폼에서의 모듈이란?테라폼이 실행되는 디렉토리를 모듈이라고 부른다. 모듈에는 테라폼 코드 정의를 위한 tf 또는 tf.json 확장자의 파일과 tfvars 같은 변수를 정의하는 파일이 포함된다. 일반적으로 기본 작업 디렉토리의 정의된 파일 집합을 루트 모듈이라고 부른다. 루트 모듈은 다른 모듈을 호출해 해당 루트 모듈이 구성하는 리소스 구성을 포함시킬 수 있고, 이렇게 호출되는 모듈을 자식 모듈이라고 한다. 테라폼을 시작하는데 사용되는 첫 번째 명령어로 테라폼에서 사용되는 프로바이더, 모듈 등의 지정된 버전에 맞춰 루트 모듈을..