목록DevOps & Infra (153)
오늘도 한 뼘 더

# 배경 현재 회사에서 AWS 클라우드를 사용하고 있고 인프라 관리를 쉘스크립트를 통해서 진행하고 있다. 최근 많은 회사들이 Terraform, Ansible과 같은 IaC(Infrastructure as Code)를 많이 사용하고 있다고 해서 관심을 같게 되었다. 같은 환경의 리소스를 복제하여 만들 때 유익하다는 이야기를 듣고 클러스터 복원하는 스크립트를 만들어볼 수 있을 것 같다는 생각으로 시작하게 되었다. # Terraform이란? Terraform(테라폼)은 하시코프에서 오픈소스로 개발 중인 클라우드 Infrastructure 자동화를 지향하는 IaC(Infrastructure as Code) 도구이다. # Terraform 구성 출처 : https://developer.hashicorp.com/..

# 주석 코멘트나 코드를 비활성화하기 위한 주석처리를 '#'를 사용하여 진행한다. # 다음과 같은 방식으로 주석처리 # #에!를 붙이면 주석처리가 되지 않는다. #!/bin/bash echo "Hello" # 입력/출력 read : read를 통해서 입력을 받을 수 있다. echo : echo를 통해서 출력을 할 수 있다. #!/bin/bash read NAME echo "Hello $NAME" # 변수 변수 = "값"의 형태로 변수에 값을 지정한다. $를 통해 변수를 사용한다. #!/bin/bash NAME='jihyun' NICK='happy' echo "Hello $NICK $NAME"

# 배경 AWS Lambda에서 DB를 연결하는 과정에서 다음과 같은 에러가 발생하였다. panic: Database open error: error: default addr for network 'localhost:3306' unknown # 문제 DB를 연결하는 부분을 다음과 같이 작성하였다. [user]:[password]@localhost:3306/[table] AWS Lambda에 올린 코드는 Golang으로 작성하였는데, golang에서 디비를 연결할 때 sql-driver 라이브러리를 사용하였다. 해당 라이브러리 git을 확인해 보니 "tcp"또는 "unix"를 명시해줘야 했다. https://github.com/go-sql-driver/mysql/blob/749ddf1598b47e3cd90..

# 배경 EKS 서비스에 만들어둔 클러스터를 aws cli를 사용하여 삭제하는 과정에서 다음과 같은 경고가 발생하면서 삭제가 진행되지 않는 현상이 발생하였다. pods are unevictable from node xxxxxxx # 문제 pod의 수가 replica의 수만큼 유지되야하는데 node를 삭제하면서 pod의 수가 최소 갯수를 만족하지 못하면서 node삭제가 block되고 그 결과 cluster 삭제가 불가해졌다. # 해결 방법 pod의 replica를 무시하고 진행할 수 있도록 옵션을 줘서 진행한다. kubectl drain {NodeName} --ignore-daemonsets --delete-emptydir-data

# 배경 Grafana에서 모니터링 중 값이 일정 값을 넘어가거나 낮아지면 알림을 받고 싶다. # Grafana Alert 사용하기 출처 : Grafana 공식 문서(Overview) # Contanct points 생성하기 알림을 보내기 위한 수신 채널을 생성한다. Slack에서 webhook URL을 복사하여 작성하고 Slack Setting의 경우 메시지를 어떻게 보낼지에 따라 설정을 다르게 해서 작성한다. Notification settings에서 Disable resolved message를 선택하면 alert에 발송된 문제가 해결된 뒤에 메시지를 받지 않도록 설정하는데 문제가 해결되었는지 확인을 하기 위해서 이 부분은 선택을 하지 않았다. Test 버튼을 눌러서 성공하면 Slack에 다음과 같..

# 배경 jenkins job 중 pipeline을 사용하는 곳에서 git 체크아웃을 받을 때 branch가 아닌 tag로 체크 아웃을 하고 싶다. # 처음 시도한 것 Git Paramter로 Tag 값을 받고 git branch에 parameter값을 그대로 넘겨주었다. node { stage 'Checkout' git branch: "${params.TAG}", credentialsId: 'CRD', url: 'git@gitlab.com/jihyunb.git' ... ... } 오류 발생 git branch에 parameter 값을 넘기니 다음과 같이 찾을 수 없다는 에러가 발생하였다. # 오류 원인 파이프라인을 잘못 작성한 건가 싶어 확인을 하기 위해 Pipeline Syntax에 들어가서 확인을 ..

# 배경 사용하고 있는 DB에서 문제가 생기거나 업데이트로 인해 연결이 끊겼을 때 바로 복구될 수 있도록 DB를 이중화하는 작업을 진행하고자 한다. AWS RDS를 DB서버로 사용하고 있는데 RDS에 Multi AZ를 사용하여 이중화가 가능하다고 한다. # Multi AZ의 역할 사용하고 있는 기본(primary) 인스턴스에 문제가 생기거나 재부팅을 할 때 다른 가용영역에 DB 인스턴스를 복제해 두고 그 인스턴스가 기본으로 바뀌도록 설정하는 것이다. 참고 https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/Concepts.MultiAZSingleStandby.html 다중 AZ DB 인스턴스 배포 - Amazon Relational Database..

# Docker stats Docker 컨테이너의 사용량을 확인하고 싶다. 이때 Docker stats를 사용하면 CPU, 메모리 등을 확인할 수 있다. docker [container] stats {container name} CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 12dbewgewt1 name 1.21% 87.58MiB / 1.892GiB 4.52% 72.7MB / 3.2MB 126MB / 391MB 8 Container ID : 컨테이너 아이디 Name : 컨테이너 이름 CPU : CPU 사용률 Mem Usage / Limit : 메모리 사용량 / 컨테이너에서 사용 가능한 메모리 제한량 Mem : 메모리 사용량 ..

Ingress(인그레스) Ingress 하나로 URL 엔드포인트 하나만 생성하여 외부로 Pod을 외부로 노출하는 것이 가능 외부 요청에 대한 처리 규칙을 한 곳에서 처리 가능 [ Ingress.yaml 예시 ] apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: test-ingress annotations: alb.ingress.kubernetes.io/scheme: internal alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":80,"HTTPS": 443}]' #alb.ingress.kubernetes.io/target-type: ip spec: ingressClassName: alb rules: -..

# 배경 AWS Api Gateway에서 API의 아이디를 API 이름으로 불러오는 스크립트를 작성 중이었는데 실행하고 나니 다음과 같은 에러가 발생하였다. Error - unexpected EOF while looking for matching `'' # 문제 문제가 된 스크립트 API_ID=`aws apigatewayv2 get-apis \ --query 'Items[?Name==`'$API_NAME'`].ApiId' \ --output text` --query는 작은따옴표(')로 묶어줘야 하고 그 안의 값을 백틱(`)으로 감싸야하는데 값을 감싸는 부분에서 에러가 발생한 것이다. # 해결 방법 백틱(`)으로 감싸진 문자열에서 백틱을 사용할 때에는 백틱 앞에 \를 붙여줘야 한다. 그리고 겉의 백틱(`)..