공간이 부족하거나 권한 문제로 발생하는 도커 오류이다.

다음과 같은 스크립트로 해결할 수 있다.

 

1. docker image prune

2. systemctl stop docker

3. rm -rf /var/lib/docker

4. systemctl start docker

 

이후 permission issue가 발생한다면

 

5. sudo chmod 666 /var/run/docker.sock

'Docker & k8s' 카테고리의 다른 글

[K8S] 2. Kubernetes Commands  (0) 2022.02.03
[K8S] 1. Kubernetes Core Component  (0) 2022.02.03
도커란? (Docker)  (0) 2020.12.17
쿠버네티스(k8s)는 무엇인가  (0) 2020.12.17
도커 컨테이너 한꺼번에 종료  (0) 2020.11.28
  1. mysql -u root -p 로 mysql shell 접속
  2. select @@global.sql_mode; 로 모드에 STRICT_TRANS_TABLES 가 포함된 것 확인
    • STRICT_TRANS_TABLES : 데이터 타입이 틀린 데이터를 추가하거나, 범위를 벗어날 때 오류 발생. 하지만 비활성화하여 해야하는 경우가 더러 있다.
  3. set @@global.sql_mode = "ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 으로 해당 모드 비활성화
  4. 여전히 안된다면 SET GLOBAL max_allowed_packet = 1024 * 1024 * 32; 을 통해 패킷 수신 최대 크기 한계 조정

'Database' 카테고리의 다른 글

mysql 테이블 전체 삭제  (0) 2020.11.30

부분합 - BOJ

부분합 - BOJ

  • 대표적인 투포인터 문제
  • 포인터를 두 개 설정(start, end)하여, end를 한 칸씩 늘려가며 target보다 부분합이 작을 때까지만 부분합을 더하고, target보다 커지면 start를 1칸 올려주는 식으로 구현
N, S = map(int, input().split())
li = list(map(int, input().split()))

end = 0
summary = 0
shortest_len = float('inf')

for s in range(N):
    while summary < S and end < N:
        summary += li[end]
        end += 1
    if summary >= S:
        shortest_len = min(shortest_len, end - s)
    summary -= li[s]

if shortest_len == float('inf'):
    print(0)
else:
    print(shortest_len)
  • EC2에서는 컴퓨터 한 대를 인스턴스, S3에서는 버킷, Lambda에서는 함수라고 부름
  • Serverless 제품
  • 서버 프로비저닝 및 관리 없이 코드 실행
  • 사용량에 따라 지속적으로 백엔드에서 규모가 자동으로 지정되기 때문에 Scaling을 신경쓸 필요가 없다.
  • 높은 가용성 및 자동 복구
  • 1초에서 최대 15분(900초) 동안 실행하도록 함수를 구성할 수 있게 되어 있다.

사용 방법

  1. 함수 생성
  2. 새로 작성
    • 함수 이름
    • 런타임 : 어떤 언어로 할 것인지
def lambda_handler(event, context):
    return
  • lambda_handler는 약속된 이름의 함수. 람다를 실행했을 때 이 함수가 실행되도록 약속되어 있음.
  • save하고 Deploy 버튼을 눌러야 실행 가능한 상태가 된다.

콘솔에서 테스트

테스트 이벤트 선택(실행될 때 어떠한 값을 입력할 것인지) -> 테스트 이벤트 구성 -> 이름 입력 -> 생성 -> 테스트 -> 함수 실행

입력값

  • 테스트 이벤트 선택 -> 테스트 이벤트 구성 -> json {key: value} 형태로 입력값 입력 -> 생성
  • lambda_handler의 event parameter로 들어간다.

디버깅

  • CloudWatch에서 lambda 함수에 대한 로그를 확인할 수 있다.
  • 코드를 수정하면 새로운 log 스트림 안에 쌓이게 된다.

트리거

  • 다른 AWS 서비스(API 게이트웨이, DynamoDB, S3 등)와 연동되기 때문에 Lambda가 사용되는 것.
  • Trigger를 통해서 다른 서비스에서 변화가 생겼을 때 람다를 실행할 수 있다.
  • 데이터 변화, 직접 또는 endpoint 호출, 리소스 상태 변화, CloudWatch 알람, Cron 주기별

S3와 연동

  1. 트리거에 Bucket 지정 + 모든 객체 이벤트 유형(PUT, COPY 등) + 재귀호출
  2. S3의 속성에 이벤트 알림에 Lambda 함수 추가된 것 확인
  3. S3로 파일을 업로드
  4. CloudWatch에서 S3에서 Lambda로 전달한 event값 확인할 수 있음
  5. 테스트 이벤트 구성에 들어가서 해당 event값 붙여넣기 (json 형식을 지키기 위해서 작은따옴표를 큰따옴표로 변경 - JSON formatter & validator)
  6. 필요한 값 접근

실행 모델

  • 동기식 : Amazon API Gateway
  • 비동기식 : SNS, CloudWatch, S3
  • Stream-based : Kinesis, DynamoDB

성능 및 가격정책

  • 기본 설정에서 메모리 용량 높일 수 있고, 메모리에 비례하여 더 좋은 CPU가 할당된다.
  • 함수 요청 수와 기간에 따라 요금 청구
  • Lambda는 프리티어 무기한으로 제공. 프리티어는 월별 무료 요청 1백만 건 & 월별 400,000GB-초 컴퓨팅 시간
  • 초과가 될 경우 요청 백만 건당 0.20 USD
  • 1GB를 0.1초만큼 썻을 때 0.0000016667 USD
  • 요금 예제
    • 512MB 메모리, 1달에 3,000,000회 실행, 매번 1초간 실행 시 : 18.34 USD
    • 128MB 메모리, 1달에 30,000,000회 실행, 매번 200ms 실행 시 : 11.63 USD

Cold Start vs Warm Start

  • Lambda Function이 일정 기간 이상 실행되지 않을 경우 Stand-by 중인 컨테이너가 하나도 남지 않게 되어 호출 시 소요 시간이 증가됨 (Cold Start)
  • CloudWatch Time-based Event를 통해 주기적으로 Lambda Function을 실행하면, Lambda Function이 실행된 컨테이너가 항상 백엔드에 존재하게 되기 때문에 Cold Start를 방지할 수 있다.

Common issues and troubleshooting

실행이 안될 때 or 함수가 실패

  • CloudWatch log에 에러 확인
  • 이벤트 소스에서 lambda를 실행할 수 있는 function이 있는지 확인

함수 실행이 너무 오래 걸린다면

  • Cold Start - 여러 번 실행해보고 비교
  • 메모리 확장하여 시도 - CloudWatch log로 확인
  • 비효율적 작성 코드 - 로컬 테스트
  • Third Party, Dependency 시간 소요 - X-ray로 어떤 엔드포인트에서 얼마나 시간을 소요했는지 파악 가능

스로틀링

  • 리전별 1000개로 동시 실행 갯수 제한
  • 동기식 호출 스로틀링 : 429 에러
  • 비동기식 호출 스로틀링 : 6시간 동안 호출 재시도
  • 스트림 기반 : 최대 7일간 호출 재시도

Schedule 설정이 제대로 동작하지 않는 경우

  • CRON Expression 확인 (대한민국 표준시가 아니라 UTC 시간으로 되었는지)
  • Second level of precision을 지원하지 않음 (Lambda Function이 매일 23:00 UTC에 실행되도록 설정했다면, 23:00:00부터 23:00:59 사이에 실행된다)
  • 초단위 정밀 작업이 필요하다면 EC2, ECS를 사용하는 것을 추천

Reference

파일명 정렬 - 프로그래머스

파일명 정렬 - 프로그래머스

def solution(files):
    num_idx = 0
    splited_files, ret = [], []
    for file in files:
        for ele in file: # file이 img12.png라면
            if ele.isdigit():
                num_idx = file.index(ele)
                break
        head = file[:num_idx] # head = "img"
        next_head = file[num_idx:]
        tail_idx = len(file)  # tail이 없는 경우를 위함
        cnt = 0 
        for ele in next_head:
            cnt += 1
            if cnt == 5: # NUMBER은 최대 길이가 5라는 조건이 있음
                tail_idx = num_idx + 5 
            if ele.isalpha():
                tail_idx = next_head.index(ele) + num_idx - 1
                break
        number = file[num_idx:tail_idx] # number = "12"
        tail = file[tail_idx:] # tail = ".png"
        splited_files.append([head, head.lower(), number, tail, files.index(file)])
    splited_files.sort(key=lambda x: (x[1], int(x[2]), x[4])) 
    for each_file in splited_files:
        ret.append(each_file[0] + each_file[2] + each_file[3])
    return ret

print(solution(["img12.png", "img10.png", "img02.png", "img1.png", "IMG01.GIF", "img2.JPG"]))
print(solution(["F-5 Freedom Fighter", "B-50 Superfortress", "A-10 Thunderbolt II", "F-14 Tomcat"]))
print(solution(["img000012345", "img1.png","img2","IMG02"]))

n진수 게임 - 프로그래머스

n진수 게임 - 프로그래머스

  • 말할 숫자들을 하나의 string으로 쭉 늘어놓고, 자기 순서가 될 때, 즉, idx % m == p - 1 일 때만 결과 ret에 붙여주는 식으로 구현
  • 여기서 말할 숫자의 개수를 설정할 때 조금 애를 먹었는데, 문제에서 제시되는 충분히 큰 값인 t^2 값을 설정함으로 해결
def convert(n, base):
    T = "0123456789ABCDEF"
    q, r = divmod(n, base)
    if q == 0:
        return T[r]
    else:
        return convert(q, base) + T[r]
def solution(n, t, m, p):
    num_str = ""
    ret = ""
    for i in range(t**2):
        num_str += convert(i, n)
    for idx, j in enumerate(num_str):
        if t == len(ret):
            return ret
        if idx % m == p - 1:
            ret += j
    return ret

+ Recent posts