반응형

전체 글 60

AWS Lambda에 Jenkins + Bitbucket 연동해서 코드 배포하기

Jenkins와 Bitbucket을 이용하여 AWS Lambda에 코드 배포하는 전과정을 경험 해보자. 먼저 Jenkins를 설치하고, 플러그인을 설치한 후, Bitbucket과 AWS에 연결하기 위한 Credential을 설정한다. 그 후 연동된 Bitbucket에서 가져온 Jenkinsfile을 이용해서 배포 파이프라인을 구성하여 최종적으로 Serverless Framework을 통해 AWS Lambda에 코드가 배포되는 과정을 확인해 볼 것이다. Jenkins 설치 Jenkins 설치는 간단하다. brew를 이용해서 아래와 같은 명령어를 입력하면 된다. $ brew install jenkins 설치가 완료되었다면, 아래의 명령어로 Jenkins를 시작/종료/재시작 할 수 있다. $ brew serv..

Server System/CICD 2022.11.08

IAM 사용자에게 비용 권한 부여하기

계정을 운영하다보면, 비용 정보를 확인하고, 분석할 일이 있다. 그런데 기본적으로는 Root 계정에"만" 그 권한이 있는데, AWS 권장 사항에 따르면 Root 계정에 계속 접속하는 것은 보안상의 이유로 지양된다. 가이드에 따르면 Root 계정은 최초 계정 생성시에 접속하여 첫 IAM 사용자를 생성하는데 까지만 사용하고, 그 이외에는 접속하지 않는 것을 권장한다 (당연히 MFA 설정은 해야한다). 때문에 비용 정보도 IAM 사용자에게 권한을 부여해서, 해당 사용자의 계정을 통해 확인할 수 있도록 하는 것이 좋다. 본 글에서는 IAM 사용자에게 비용 관련 권한을 부여하는 방법을 소개 한다. 권한 설정은 크게 두 가지 단계로 이루어진다. Step 1. "결제 정보에 대한 IAM 사용자 및 역할 액세스" 활성..

AWS/ETC 2022.10.31

AWS KMS 개념과 응용 - 2

지난 "AWS KMS 개념과 응용 - 1"에서 KMS를 사용하는 이유와 KMS가 제공하는 기본적인 기능들에 대해서 살펴보았다. 이번에는 실제로 KMS를 이용해서 암/복호화하는 것은 어떻게 하는지 먼저 알아보고, Slack에서 KMS을 이용하여, 서로 다른 계정에서 Key를 어떻게 제어하는지 알아보자. 1. 암/복호화 API 개발 API Gateway + Lambda를 활용하여 암/복호화 API를 개발할 수 있다. API Gateway를 통해 요청이 들어오면, Lambda 내에서 KMS API를 이용하여 Data key를 생성하여 암/복호화를 수행한다. Lambda에 작성되는 코드를 세부적으로 살펴보면 다음과 같이 나눌 수 있다. (1) 라이브러리와 변수 초기화 import base64 import bot..

AWS/KMS 2022.10.14

AWS KMS 개념과 응용 - 1

이 글에서는 AWS KMS의 기본 개념에 대해서 알아본다. 바로 응용편 부터 보고싶다면 "AWS KMS 개념과 응용 - 2"를 보자. 1. 배경 암호화를 적용하는 개발자들은 항상 두 가지 문제를 신경써야 한다. 데이터를 암호화 하는데, 어떻게 정확하게 키를 생성하고 사용할 것인가. 사용 후, 키를 안전하게 보호하는 방법은 무엇인가. 첫 번째의 경우 제공되는 SDK 등을 통해서 해결이 가능하다. 두 번째의 경우 다음과 같은 조건으로 관리될 수 있어야 한다. (1) 데이터를 암호화한 키가 노출되지 않도록 해야 한다. 이 때, 데이터를 암호화한 키는 데이터베이스에 저장하지 말아야 한다. 그리고 복호화는 할 수 있어야 하므로, 복호화 할 수 있는 키는 어딘가에 보관해야 한다. (2) 최악의 경우 복호화 관련 키..

AWS/KMS 2022.10.13

GPT-3에 대한 얕고 넓은 지식

"기사 쓰는 인공지능", "사람이냐, AI냐?!", "초거대 AI" 언제부턴가, 당장이라도 인간을 충분히 대체할 수 있는 인공지능이 개발된 듯한 기사가 쏟아지기 시작했고, 그것과 함께 따라오는 단어가 있었다. "GPT-3"다. GPT-3는 뭘까. GPT-3는 어떻게 인간을 대신할 수 있다고 할 정도로 뛰어난 성능을 보일 수 있게 되었을까. GPT-3 GPT-3(Generative Pre-trained Transformer 3)는 OpenAI사에서 만든 자연어 처리 모델 / 언어 모델이다. 다르게 표현하면, 딥러닝을 이용해 인간다운 텍스트를 만들어내는 인공지능이다. 이를 통해, 소설, 뉴스 기사 생성 등에 사용 가능하다. (참고로, OpenAI는 일론머스크가 설립했다.) GPT라는 모델은 시간에 따라 업그..

[파이썬/Python] 숫자/문자열 앞에 "0" 채우기

1. 문자열 앞에 "0" 채우기 -> zfill string_number = "1" a = string_number.zfill(2) b = string_number.zfill(4) print(a) print(b) >>> 01 >>> 0001 2. 문자열 앞에 "0" 말고도 다른 것으로 채우기 -> rjust string_number = "1" a = string_number.rjust(2, "a") b = string_number.rjust(4, "b") print(a) print(b) >>> a1 >>> bbb1 3. 숫자 앞에 "0" 채우기 -> format number = 1 a = format(number, '02') b = '{0:04d}'.format(number) print(a) print(..

[파이썬/Python] 문자열을 변수로 만들기, globals() locals()

예를 들어, 아래와 작성된다면 입력 받은 문자열이 "apple" 일 때, apple이라는 변수가 생성되고 값이 할당되는 것을 볼 수 있다. user_input = input("Enter string for variable name: \n") globals()[user_input] = 50 print(apple) print(type(apple)) >>> 50 >>> 이 때, globals는 글로벌 변수를 의미하고, locals는 로컬 변수를 의미한다. globals() 를 호출했을 때는 글로벌 변수들이, locals() 를 호출했을 때는 로컬 변수들이 Dictionary 형태로 불러와진다. 따라서, Dict의 특성에 따라, globals()["apple"] = 50 이라고 하면, 새로운 Key-Value ..

Effective Python. 메타클래스로 클래스 속성에 주석을 달자.

메타클래스와 디스크립터를 활용하면, 중복 코드를 좀 더 줄이고 깔끔한 코드를 만들 수 있다. 아래와 같은 Field 디스크립터가 있다고 가정해보자. class Field: def __init__(self, name): self.name = name self.internal_name = '_' + self.name def __get__(self, instance, instance_type): if instance is None: return self return getattr(instance, self.internal_name, '') def __set__(self, instance, value): setattr(instance, self.instance_name, value) 그리고, Field 디스크립..

Effective Python. 메타클래스로 서브클래스를 검증하자.

메타클래스를 응용하는 가장 간단한 사례는 클래스를 올바르게 정의했는지 검증하는 것이다. 클래스 계층을 만들 때 스타일을 강제하거나, 메서드를 오버라이드하도록 요구하거나, 클래스 속성 사이에 관계를 두고 싶을 수도 있다. 보통 클래스 검증 코드는 클래스의 객체가 생성될 때 __init__ 메서드에서 실행된다. 만약, 메타클래스를 검증용으로 사용하면 오류를 더 빨리 일으킬 수 있다. (즉, 서브클래스가 정의되는 시점부터 제대로 구성되었음을 보장하려면 메타클래스를 사용하면 된다) 메타클래스는 type을 상속하여 정의한다. 메타클래스는 기본으로 자체의 __new__ 메서드에서 연관된 class 문의 콘텐츠를 받는다. 여기서 타입이 실제로 생성되기 전에 클래스 정보를 수정할 수 있다. class Meta(type..

Effective Python. 지연 속성에는 __getattr__, __getattribute__, __setattr__을 사용하자.

미리 정의되어 있지 않은 속성 값에 접근하려면 어떻게 해야할까? 다시 말해, 아래와 같은 클래스를 통해 인스턴스를 만들고, data.foo 와 같이 존재하지 않는 속성에 액세스 하려고 하면 에러가 날 것이다. class LazyDB: def __init__(self): self.exists = 5 만약 이런 상황에서, data.foo와 같은 액세스를 했을 때도 에러 없이 동작하도록 하려면 어떻게 해야할까? @property 메서드, 디스크립터로는 이렇게 할 수 없다. 이럴때 __getattr__ 매직 메소드를 사용하면 된다. class LazyDB: def __init__(self): self.exists = 5 def __getattr__(self, name): value = f'Value for {n..

반응형