참고 : API Gateway + lambda로 REST API 만들기(GET) 참고 : API Gateway + lambda로 REST API 만들기(POST) REST API(POST)를 만든 lambda 함수에서 다른 lambda 함수를 호출해 post로 온 값을 보내고, 그 lambda 함수에 pymysql 모듈을 import해서 데이터베이스에 요청 값을 넣어봅시다. lambda 함수에서 lambda 함수 호출 GET, POST 요청 글을 참고해서 람다함수 test2를 만든다. 기존에 쓰던 test 람다함수에서 test2 람다함수를 호출하기위해서 test 람다함수의 추가적인 권한이 필요하다. 이 포스팅에 IAM 역할에서 Lambda_Fullaccess 권한을 가진 역할을 만들어서 처음 람다함수 만..
백준 1068번 트리 백준 1068번 트리 설명 부모노드의 리스트, 지울 노드로 dfs를 호출한다. 지울 노드 값의 부모 리스트를 -2로 바꾸고 부모 리스트를 돌면서 지울노드가 있는지 찾는다. 있으면 지울 노드의 자식 노드들이 있다는 말이기 때문에 그 값을 지울 노드로 해서 dfs를 호출해서 그 값을 -2로 바꿔준다. 이렇게 하면 지울노드와 그 자식노드 모두다 그 위치에 부모노드 리스트에 -2가 박힌다. 그 다음 부모 노드 리스트 인덱스로 쭈욱 돌면서 그 값이 -2가 아니고, 인덱스가 부모리스트에 아에 없는 값이 있으면 count를 1 증가 시키고, count가 정답 인덱스가 부모 리스트에 없으면 그 인덱스를 부모로 가지는 자식이 없다는 말이기 때문에 그 인덱스는 리프노드임 코드 import sys fr..
AWS API Gateway에 API키 등록하기 만든 API에 아무나 접근을 하지 못하도록 키 값을 넣어 암호화 할 수 있다. post요청글에서 만든 REST API에 API키를 등록해보자. 메서드 실행의 설정쪽에서 API 키가 필요함을 True로 바꿔준다. 다음으로 API키를 만들고, 사용량 계획과 연결하는 형태이다. API키, 사용량 계획을 만들어야한다. 먼저 API키를 하나 생성하자. 사용량 계획을 만든다. 만들면서 API를 배포했을 때 스테이지를 연결하고, API 키도 연결한다. 그리고 API를 다시 배포해준다. 키 값을 확인하고, postman으로 post요청을 테스트해보자(post글 참고). 키 값을 적지 않고 그냥 요청했을 때는 message forbidden이 뜨고, 값을 확인 할 수 없다..
AWS API Gateway, Lambda로 post 요청 만들기(REST API) get 요청 만드는 포스팅을 참고해서 API Gateway와 Lambda를 만든다. lambda 함수 import json def lambda_handler(event, context): """post 요청으로 들어온 값들이 body-json으로 묵여 있고, 전체를 body 변수에 저장(통합요청에 매핑 템플릿을 보면 body-json이 있음)""" body = event['body-json'] # TODO implement return { 'success': True, 'data': { # 거기서 star를 가지고옴 'star': body['star'] } } 통합 요청 → 매핑 템플릿 통합 요청에서 매핑 템플릿을 위에 ..
백준 1005번 ACM Craft 백준 1005번 ACM Craft 설명 진입 차수 배열을 만들어서 해당 건물 전에 미리 지어야 할 건물이 있으면 해당 건물을 인덱스로해서 배열의 값을 1씩 증가시킨다. 각 건물마다 지을 때까지 걸리는 시간을 넣기위한 배열 dp를 만든다. 맨 처음에 진입 차수가 0인 건물을 큐에 다 집어 넣고, 그러면서 동시에 해당 건물의 dp 값도 해당 건물을 짓는데 걸리는 시간으로 다 바꿔준다(진입 차수가 0이니깐 그냥 그 해당 건물을 바로 지을 수 있음). 큐를 왼쪽부터 하나씩 빼면서 그 건물 다음으로 지을 수 있는 건물을 확인하면서 진입 차수를 1씩 빼준다. (다음 지을 수 있는 건물의 dp 값)과 (바로 전건물의 dp + 다음 지을 수 있는 건물 건설시간) 이 둘을 비교해서 더 ..
API Gateway, AWS Lambda REST API GET 요청 만들기(2가지) AWS API Gateway, Lambda를 사용해서 GET 요청을 Lambda 함수 내부로 가져오는 예제를 해보자. GET 방식에서 파라미터를 넘길 때는 파라미터가 끝에 쿼리 스트링으로 있는 경우와 url 중간에 존재하는 경우 크게 2가지로 나눌 수 있다. /cafes?latitude=x&longitude=x 카페의 위도, 경도를 쿼리 스트링으로 넘겨줌 /cafes/123142/reviews 숫자는 ID → cafe ID에 따라 까페의 리뷰들을 요청 url 맨끝에 쿼리 스트링으로 넘겨주는 경우 API Gateway 서비스로가서 API 생성 → REST API(프라이빗 x)로 간 뒤에 위에 화면처름 이름, 유형등을 적..
API Gateway Amazon API Gateway Amazon API Gateway는 사용자가 쉽게 API를 생성, 게시, 관리, 모니터링, 보안까지 관리가 가능한 완전관리형 서비스이다. Amazon API Gateway는 트래픽 관리, CORS 지원, 권한 부여 및 액세스 제어, 제한 모니터링 및 API 버전 관리 등 최대 수십만 개의 동시 API 호출을 수신 및 처리하는 데 관계된 모든 작업을 처리한다. 선택 옵션으로는 REST API, WebSocket API, HTTP API가 있다. REST API REST는 'Representational State Transfer'의 약자이다. (대표적인 상태 전달) REST API 특징 클라이언트/서버 REST 서버는 API를 제공하고 이를 클라이언트..
권한관리 AWS IAM IAM(AWS Identity and Access Management)은 AWS의 권한을 관리하는 서비스. 처음 AWS에 계정을 이메일로 생성하면 모든 서비스에 접근할 수 있는 SSO(Single Sign-ON) ID가 생성되고 이를 루트 권한이라고 한다. 사내에서 AWS를 이용하고자 하는 경우에 각자의 부서/팀별로 계정을 생성하여 부여한다. 이때 IAM을 이용하여 필요한 권한을 세분화하여 Role을 부여함으로써 불필요한 접근을 막을 수 있다. IAM에서는 AWS 계정 인증에 MFA(Multi Factor Authentication)를 지원한다. 여기서 펙터란 사용자의 신원을 확인하는 방법에 따라서 지식 기반, 소유 기반, 속성 기반의 인증으로 총 3가지 방법으로 나누어 지는데, ..
서버리스 Cloud Native Patterns Legacy : 인프라부터 애플리케이션까지 구축 IaaS : 하드웨어와 가상화 OS 등 인프라 요소를 서비스로 제공(EC2) Caas : 서비스 형태로 제공되는 컨테이너를 호라용하여 배포(ECS) Paas : 애플리케이션 개발에 집중할 수 있도록 인프라와 런타임 환경을 제공(Elastic Beanstalk) FaaS : 실행할 함수코드만 구현(Lambda) Saas : 제공되는 소프트웨어 사용(Gmail) 서버리스의 형태 Baas(Backend as a Service) Faas(Function as a Service) Baas는 그동안 개발자가 직접 구현하던 백엔드의 부분부분을 서비스로 제공받는 것(Auth0, AWS Cognito, Firebase). F..
백준 1520번 내리막 길 백준 1520번 내리막 길 그냥 탐색으로 풀면 시간초과가 난다.. 그래서 dp 기법을 추가로 사용해야한다. 탐색해서 결과가 나오면 그걸 dp에 저장하고 다른 탐색 때 사용한다..흠.. 코드 import sys, heapq from typing import List input = sys.stdin.readline sys.setrecursionlimit(10**6) class Solution: def down_hill(self, M: int, N: int, graph: List[List[int]]): """dfs로 탐색을 하고 dp기법을 사용하여 배열에 각 칸마다의 결과 값을 저장해나가면서 이전에 갔었던 칸을 지나갈시에 dp에서 답을 가져와서 사용함으로써 깊이 탐색의 시간을 줄인다..
백준 1766번 문제집 백준 1766번 문제집 위상정렬을 사용한다.. 조건이 있는 문제의 번호들중 뒤쪽에 와야 되는 번호들에 차수를 계속해서 매긴뒤에, 아닌 번호들을 먼저 최소 힙에 다 넣고, 힙의 원소들을 빼면서 그 문제번호보다 뒤쪽에 와야하는 문제의 번호 차수를 1씩 차감하면서 0이되어야지 heap에 추가 시킨다. 차수가 0이 아니면 heap에 아직 현재 차감하고 있는 차수의 원소보다 더 빨리 풀어야하는 문제가 있기 때문에 최소 힙에 넣으면 안된다. 코드 import sys, collections, heapq from typing import List input = sys.stdin.readline class Solution: def workbook(self, N: int, M: int, check:..
백준 1167번 트리의 지름 백준 1167번 트리의 지름 아무점을 잡고 dfs로 가장 거리가 먼 정점을 찾는다. 이 정점을 기준으로 다시 dfs로 가장 먼 거리를 찾는다. 코드 from typing import List, Tuple import sys import collections input = sys.stdin.readline sys.setrecursionlimit(10**6) class Solution: def diameter(self, V: int, graph: List[List[Tuple]]): def dfs(u, count): visited[u] = True for v, w in graph[u]: if not visited[v]: vertex, weight = dfs(v, count+w) i..
백준 11779번 최소 비용 구하기 2 백준 11779번 최소 비용 구하기 2 경로와 비용을 defaultdict로 따로 만들어줬다. 두번째 코드는 왜 틀리는지 모르겠다..ㅠㅠ 코드 import sys import collections import heapq import copy from typing import List, Tuple input = sys.stdin.readline class Solution: def min_cost(self, start: int, end: int, g: List[List[Tuple]]): Q = [] heapq.heappush(Q, (0, start)) # 경로 저장 path = collections.defaultdict(list) # 비용 dist = [sys.maxs..
쿠버네티스를 시작하기 전에 도커 스웜 모드와 비교해서 쿠버네티스만이 가지는 고유한 특징들을 살펴보자. 모든 리소스는 오브젝트 형태로 관리된다. 도커 스웜 모드에서 컨테이너의 묶음을 표현하기 위해 서비스라는 것을 사용했는데 이것도 컨테이너 리소스의 집합을 정의한 것이기 때문에 일종의 오브젝트라고 볼 수 있다. 그러나 쿠버네티스는 이러한 개념을 더욱 폭넓고 세밀한 단위로 사용한다. 예를 들어 쿠버네티스에서는 컨테이너의 집합(Pods), 컨테이너의 집합을 관리하는 컨트롤러(Replica Set), 심지어 사용자(Service Account), 노드(Node)까지도 하나의 오브젝트로 사용할 수 있다. 쿠버네티스에서 사용할 수 있는 오브젝트는 kubectl api-resources 명령어를 사용해 확인할 수 있다..
백준 2206번 벽 부수고 이동하기 백준 2206번 벽 부수고 이동하기 큐의 마지막 원소에 1(벽뚫기가능), 0(벽뚫기불가능)을 넣는다. visited에는 각 좌표마다 [0,0]을 만들고 인덱스가 0이면 벽이미 뚫어서 못뚫고, 인덱스가 1이면 벽을 뚫 수 있다. 인덱스가 어딘지에 따라서는 벽뚫을 수 있는 여부를 판단하고, 별개로 원소 값이 0이면 방문가능하고, 1이상이면 방문 불가로 판단해서 다시는 그곳을 방문하지 않는다. 방문한 곳의 개수를 visited에 계속 쌓아가면서 나중에 그걸 답으로 뱉는다. 코드 from typing import List import sys input = sys.stdin.readline import sys from collections import deque class So..
가장 기초가 되는 도커 컨테이너를 다루기 위해 도커 엔진을 공부했고, 여러 대의 도커 엔진을 효율적으로 관리하기 위해 도커 스윔의 개념과 사용 방법을 다뤘다. 그리고 여러 종류의 컨테이너를 YAML 파일로 선언적으로 정의해 생성할 수 있는 도커 컴포즈의 사용 방법 또한 알아봤다. 이러한 프로젝트들의 개념을 한군데로 모아 사용할 수 있는 더욱 훌륭한 프로젝트가 바로 쿠버네티스다. 그리스어로 조타수라는 뜻의 쿠버네티스는 오늘날 사실상 표준으로 사용되고 있는 컨테이너 오케스트레이션 도구이다. 쿠버네티스는 도커 스웜 모드처럼 여러 대의 도커 호스트를 하나의 클러스터로 만들어 준다는 점은 같지만, 세부적인 기능을 더욱 폭넓게 제공하고 있다. 쿠버네티스의 장점 서버 자원 클러스터링, 마이크로서비스 구조의 컨테이너 ..
백준 1987번 알파벳 백준 1987번 알파벳 흠.. bfs에다가 set자료형으로 실행시간을 최대한 줄여서 풀어봤습니다.. 시간을 더 어떻게 줄일까요ㅠㅠ,, 코드 import collections from typing import List import sys input = sys.stdin.readline class Solution: def alphabet(self, R: int, C: int, board: List): """bfs를 탐색하기 위해 큐를 만드는데 set자료형으로 같은것을 없애야지 시간을 단축할 수 있음 예를 들면 IEHFALKC는 IEHF쪽에서 2가지의 경우로 A를 갈 수 있으므로 이런 경우 다 set으로 없애준다.""" # 큐에서 원소는 순서대로 x좌표, y좌표, 지금까지거쳐간 알파벳들..
도커 컴포즈 도커 컴포즈를 사용하는 이유 여러 개의 컨테이너가 하나의 애플리케이션으로 동작할 때 이를 테스트하려면 각 컨테이너를 하나씩 생성해야 한다. 매번 run 명령어에 옵션을 설정해 CLI로 컨테이너를 생성하기보다는 여러 개의 컨테이너를 하나의 서비스로 정의해 컨테이너 묶음으로 관리할 수 있다면 좀더 편리하다. 이를 위해 도커 컴포즈는 컨테이너를 이용한 서비스의 개발과 CI를 위해 여러 개의 컨테이너를 하나의 프로젝트로서 다룰 수 있는 작업 환경을 제공한다. 도커 컴포즈 설치 # ubuntu, 루트에서 해야함, 최신버전찾기 : https://github.com/docker/compose $ curl -L https://github.com/docker/compose/releases/download/(..
백준 10799번 쇠막대기 백준 10499번 쇠막대기 코드 import sys input = sys.stdin.readline bar_razor = list(input().rstrip()) answer = 0 stack = [] for i in range(len(bar_razor)): # '('일 경우 계속 스택에 저장 if bar_razor[i] == '(': stack.append('(') else: #()라면 (를 pop하고 현재 스택에 들어있는 ( 수만큼 값을 더해준다. if bar_razor[i-1] == '(': stack.pop() answer += len(stack) else: stack.pop() #끄트머리 막대기 부분을 더해준다 answer += 1 print(answer)
백준 4949번 균형잡힌 세상 백준 4949번 균형잡힌 세상 re 모듈 sub 함수로 괄호를 빼고 다 없애준다. stack으로 괄호 짝이 맞는지 판별 코드 import sys input = sys.stdin.readline import re # 괄호들만 있는 문자열을 인자로 받아서 유효한 괄호인지 판단하는 함수 def is_valid(s): if len(s) == 0: return True stack = [] table = {')':'(', ']':'['} for char in s: if char not in table: stack.append(char) elif not stack or table[char] != stack.pop(): return False return len(stack) == 0 # ..
도커 데몬 도커의 구조 $ which docker $ ps aux | grep docker 컨테이너나 이미지를 다루는 명령어는 /usr/bin/docker/에서 실행되지만 도커 엔진의 프로세스는 /usr/bin/dockerd 파일로 실행된다. 이는 docker 명령어가 실제 도커 엔진이 아닌 클라이언트로서의 도커이기 때문이다. 도커의 구조는 크게 두 가지로 나뉜다. 하나는 클라이언트로서의 도커이고, 다른 하나는 서버로서의 도커이다. 실제로 컨테이너를 생성하고 실행하며 이미지를 관리하는 주체는 도커 서버이고, 이는 dockerd 프로세스로서 동작한다. 도커 엔진은 외부에서 API 입력을 받아 도커 엔진의 기능을 수행하는데, 도커 프로세스가 실행되어 서버로서 입력을 받을 준비가 된 상태를 도커 데몬이라고 이..
백준 10830번 행렬 제곱 백준 10830번 행렬 제곱 divide and conquer로 제곱승, 제곱승x제곱승=4제곱승, 4제곱승x4제곱승=16제곱승 형태로 계산수를 줄인다. 곱한다음 1000으로 나눈 나머지나 1000으로 나눈 나머지 곱이나 같으므로, 받을 때, 곱할 때, 곱하고 나서 모두 1000으로 나눈 나머지로 바꿔준다. 안그럼 커짐. 행렬곱은 외워두는게 좋겠다.. 코드 import sys sys.setrecursionlimit(10**6) input = sys.stdin.readline def multiply_matrix(arr1, arr2): answer = [] for idx1 in range(len(arr1)): row = [] for idx2 in range(len(arr2[0]))..
Dockerfile 이미지를 생성하는 방법 아무것도 존재하지 않는 이미지로 컨테이너 생성 애플리케이션을 위한 환경을 설치하고 소스코드 등을 복사해 잘 동작하는 것을 확인 컨테이너를 이미지로 커밋(commit) 위의 방법은 애플리케이션이 동작하는 환경을 구성하기 위해 일일이 수작업으로 패키지를 설치해야한다. 그래서 도커는 아래와 같이 일련의 과정을 손쉽게 기록하고 수행할 수 있는 빌드 명령어를 제공한다. 완성된 이미지를 생성하기 위해 컨테이너에 설치해야 하는 패키지, 추가해야 하는 소스코드, 실행해야 하는 명령어와 셸 스크립트 등을 하나의 파일에 기록해 두면 도커는 이 파일을 읽어 컨테이너에서 작업을 수행한 뒤 이미지로 만들어낸다. 이러한 작업을 기록한 파일의 이름을 Dockerfile이라 하며, 빌드 명..
백준 1946번 신입 사원 백준 1946번 신입 사원 문제를 잘 읽어야한다. 성적의 순위를 입력 받으니깐 더 작은 값일수록 성적이 좋음. 서류랑 면접중 적어도 한개만 다른 지원자들보다 떨어지지 않으면 입사가능. 서류 성적 순위를 오름차순으로 정렬해서 서류성적이 가장 좋은 리스트의 첫번째 부분은 적어도 서류성적은 무조건 다른 지원자보다 좋으므로 답으로 가능. 그 뒤에 애들은 서류 성적이 전애들보다 무조건 안좋음. 그래서 면접 성적이 더 좋아야 입사 가능. 첫 친구의 면접 성적을 저장해두고 비교해가면서 만약 면접 성적이 더 좋으면(순위가 더 작으면) 서류 성적은 안좋지만 면접 성적은 좋으므로 답 가능임. 그 다음 면접 성적 비교 변수도 계속 지금까지의 가장 좋은 면접 성적 순위로 업데이트 해줘야함. 코드 i..
백준 12015번 가장 긴 증가하는 부분 수열 2 백준 12015번 가장 긴 증가하는 부분 수열 2 부분 수열의 길이만 찾으면 되므로, 수열 처음부터 증가하는 부분수열을 구해주면서 전 값보다 더 작은 값이 나와서 증가하는 부분수열이 멈추게 되면, 전까지의 증가하는 부분수열에서 현재의 수열 값의 위치를 찾아 정렬되게끔 리스트에서 값을 아에 교체해주면 길이는 결국 같게된다. 코드 import sys import bisect input = sys.stdin.readline N = int(input()) prog = list(map(int, input().split())) # N이 1이면 답 1 출력 if N == 1: print(1) exit(0) # answer 리스트에 수열 첫번째 값 넣고 두번째 부터 f..
도커 이미지 도커는 기본적으로 도커 허브라는 중앙 이미지 저장소에서 이미지를 내려받는다. 이미지 저장소를 다른 사람들에게 공개하지 않기 위해 비공개 저장소를 사용하려면 비공개 저장소의 수에 따라 요금을 지불해야 한다. 이를 해결하기 위해 도커 이미지 저장소를 직접 구축해 비공개로 사용할 수도 있다. 도커 엔진에서 docker search 명령어를 사용하여 어떤 이미지가 있는지 확인할 수 있다. $ docker search ubuntu 도커 이미지 생성 컨테이너에 애플리케이션을 위한 특정 개발 환경을 직접 구축한 뒤 사용자만의 이미지를 직접 생성해야 하는 경우가 많다. 컨테이너 안에서 작업한 내용을 이미지로 만드는 방법을 알아보자. $ docker run -it --name commit_test ubunt..
백준 1967번 트리의 지름 백준 1967번 트리의 지름 루트에서 리프노드까지 탐색해서 최대 거리인 리프노드를 구하면 그 리프노드는 최대 거리에서의 한 점이 된다. 그 리프노드에서 다른 리프노드까지의 거리를 구하고 거기서 최대 값을 뽑아낸다. 루트 노드에서 간선이 한개밖에 없을때, 트리형태로 보면 루트노드가 리프노드처럼 보이므로 1번 최대 리프노드에서 루트까지의 거리도 고려해줘야함 코드 import sys import collections input = sys.stdin.readline graph = collections.defaultdict(list) n = int(input()) # n이 1일 때는 간선이 없으므로 0을 출력하고 종료 if n == 1: print(0) exit(0) # 리프노드 집합..
백준 13549번 숨바꼭질3 백준 13549번 숨바꼭질3 bfs 다익스트라로 최소 거리를 계산함. 순간이동은 비용 0이라서 데크 appendleft()로 맨 앞에다 넣어줘야함. 코드 import sys import collections input = sys.stdin.readline N, K = map(int, input().split()) Q = collections.deque([(N, 0)]) visited = [False]*100001 while Q: loc, count = Q.popleft() if loc == K: print(count) break if not visited[loc]: visited[loc] = True if 0
컨테이너 로깅 json-file 로그 사용하기 도커는 컨테이너의 표준 출력과 에러 로그를 별도의 메타데이터 파일로 저장하며 이를 확인하는 명령어를 제공한다. $ docker run -d --name mysql \ > -e MYSQL_ROOT_PASSWORD=1234 \ > mysql:5.7 docker logs 명령어는 컨테이너 내부에서 출력을 보여주는 명령어이다. $ docker logs mysql 컨테이너가 정상적으로 실행 및 동작하지 않고 docker attach 명령어도 사용하지 못하는 개발 환경에서 docker logs 명령어를 쓰면 간단하고 빠르게 에러 확인 가능. --since 옵션에 유닉스 시간을 입력해 특정 시간 이후의 로그를 확인할 수 있으며, -t 옵션으로 타임스탬프를 표시할 수도 있..
Python Code Snippet 리스트를 문자열로 바꾸면서 앞, 뒤에 문자열 추가하고 중간 중간에 들어갈 문자열도 직접 지정하기 iu = ["1", "2", "3"] print("", sep='') # 결과 : 리스트 2개 이상의 기준으로 정렬하기 iu = [[4,3],[2,1]] iu.sort(key=lambda x: (x[0], x[1])) print(iu) # [[2, 1], [4, 3]] 리스트에서 특정 단어 및 숫자의 인덱스가 여러개 있을 때 test_list = [1, 3, 4, 3, 6, 7] print("Original list : " + str(test_list)) res_list = list(filter(lambda x: test_list[x] == 3, range(len(test_..