[AWS] 3개월차 백엔드의 AWS 도전기 - 1

초이지수·2022년 6월 6일
1

PROJECT

목록 보기
5/9

🤸‍♂️ Client log 정보 (ip, 요청시간) 를 띄우고 PostgreSQL에 저장해보자!


👻 시작 전에 참고!

🌵 EC2 (Amazon Elastic Compute Cloud)

아마존에서 제공하는 클라우드 컴퓨팅 서비스.
아마존에서 세계 각 지역에 만들어놓은 인프라 (데이터 센터)에서 한 대의 컴퓨터를 임대한다는 개념. 네트워크를 통해 제어.

  • 인스턴스 : 가상 컴퓨팅 환경
  • 인스턴스 유형 : 인스턴스를 위한 CPU, 메모리, 스토리지, 네트워킹 용량의 여러 가지 구성 제공
  • 탄력적 IP 주소 : 동적 클라우드 컴퓨팅을 위한 고정 IPv4 주소

🌱 EC2의 장점

  1. 하드웨어에 선투자할 필요가 없어 더 빠르게 애플리케이션을 개발하고 배포할 수 있다.
  2. 원하는 수의 가상 서버를 구축하고 보안 및 네트워킹을 구성하며 스토리지를 관리할 수 있다.
  3. 확장 또는 축소를 통해 요구 사항 변경 또는 사용량 스파이크를 처리할 수 있으므로 트래픽을 예측할 필요성이 줄어든다.

🌵 VPC (Virtual Private Cloud)

예전에는 전세계 모든 아마존 사용자들의 인스턴스가 아주 랜덤하게 위치했었다.
그래서 AWS 클라우드 내에 여러 사용자의 가상머신들이 한 네트워크에 함께 구성되어있었다.

  • 다른 고객들과 완벽하게 격리된 한 사용자만의 네트워크를 구성하고 가상의 데이터센터를 설정할 수 있게 만들었다.

  • 서브넷 단위로 VPC내에서 공간 구분을 해 가상머신을 위치시킬 수 있다. (바운더리)

🌵 AWS RDS (PostgreSQL)

AWS RDS도 Docker와 비슷한 루트로 생각하면 된다!

AWS PostgreSQL을 아마존이 띄운 PostgreSQL 이미지라고 보면 되고, 항상 엔드포인트를 준다. (Front와 Back이 소통할 때 주고받는 주소처럼)

AWS PostgreSQL은 S3와 연동되는데 백업을 위해 커밋을 해, 저장해서 백업용으로 사용한다. 순간 사진처럼 쌓이는 이미지라고 해서 스냅샷이라고 부름.

local상의 PostgreSQL과 달리 AWS에서 생성한 PostgreSQL은 퍼미션이 엄격해서 연결이 어렵다.

🌵 Lambda

  • Lambda 함수 핸들러 는 event를 처리하는 함수 코드의 메서드
  • API 게이트웨이 - CloudWatch에서 로그 보기 - 로그 스트림 - event 볼 수 있음!

👻 일단 lambda 함수부터 출력해보자!

🙋‍♀️ 1. lambda 함수 생성

  • AWS에서 lambda 함수를 생성한다.

🙋‍♀️ 2. API GATEWAY 생성

  • AWS에서 lambda에서 트리거 추가로 API GATEWAY를 생성한다.

🙋‍♀️ 3. lambda 함수 코드 작성

import json

def lambda_handler(event, context):
    ip = event['requestContext']['identity']['sourceIp']
    #headers_ip = event['headers']['X-Forwarded-For']
    requestTime = event['requestContext']['requestTime']
    
    return {
        'statusCode': 200,
        
        'body': json.dumps({
            'client_ip_address' : ip,
            #'headers_ip' : headers_ip,
            'request_time' : requestTime
        })
    }
  • sourceIP, X-Forwarded-For 총 두 곳에서 로그 기록을 가져올 수 있다!

👻 이제 PostgreSQL과 연결..!

🙋‍♀️ 1. RDS 생성 (PostgreSQL)

  • AWS에서 PostgreSQL 생성
    • 프리 티어
    • DB 인스턴스 식별자 입력
    • 마스터 사용자 이름 입력
    • 마스터 암호 입력
    • 퍼블릭 액세스 : 예

🙋‍♀️ 2. EC2 인스턴스에 연결하기

  1. EC2 인스턴스에서 RDS 인스턴스에 접근할 수 있도록 설정
  2. EC2 인스턴스의 웹 어플리케이션이 RDS 인스턴스의 데이터베이스 서버에 접근할 수 있도록 설정

🙋‍♀️ 3. Lambda 함수에서 import 지원하지 않는 모듈 설정

⚡️ Lambda 함수 안에 Layer 쌓기

1. 터미널에 디렉토리 생성

$mkdir python
$cd python

2. 필요한 모듈을 해당 디렉토리에 설치

$pip install aws-psycopg2 -t .

3. 필요한 모듈 설치 완료 됐으면 압축하기

4. 압축 파일 업로드

(1) Lambda 계층
(2) 계층 생성
(3) .zip 파일 업로드 
(4) 호환 런타임 : Python 3.6, Python 3.7, Python 3.8, Python 3.9 
	일단 Python 다... 했음
(5) 생성

5. Lambda에 계층 추가하기

(1) Lambda 함수
(2) 계층
(3) Add a layer
(4) 사용자 지정 계층
(5) AWS 계층에서 4번에서 추가했던 계층 선택
(6) 추가 

🙋‍♀️ 4.Lambda 코드 다시 작성

  • 첫번째 환경변수만 적용한 코드
import psycopg2
import sys
import boto3
import os
import json

def lambda_handler(event, context):
    conn = psycopg2.connect(
        host = os.environ['HOST'],
        dbname = os.environ['DBNAME'],
        user = os.environ['USER'],
        password = os.environ['PASSWORD'],
        port = os.environ['PORT']
        )
        
    return{
        'statusCode':200,
        'body':json.dumps('제발돼라제발')
    }
  • PostgreSQL 에 저장 및 출력까지 하는 코드
import psycopg2
import sys
import boto3
import os
import json

def lambda_handler(event, context):
    conn = psycopg2.connect(
		#psycopg2에서 지원하는 connect 메소드
		#터미널상에서 postgresql로 해도 되는데 python으로 연결 시키는 코드
        host = os.environ['HOST'],
        dbname = os.environ['DBNAME'],
        user = os.environ['USER'],
        password = os.environ['PASSWORD'],
        port = os.environ['PORT'],
        )
		#람다 환경변수 불러오기
        
    ip_address = event['requestContext']['identity']['sourceIp']
    access_time = event['requestContext']['requestTime']

    cursor = conn.cursor()
		#connection으로부터 cursor생성
        #cursor : DB의 sql구문을 실행시키고 조회된 결과를 가져오는 class

    psl = "INSERT INTO lambda_logs (ip_address, access_time) VALUES (%s, %s)"
    val = (ip_address, access_time)
    cursor.execute(psl, val)
    conn.commit()
    #commit을 해야 DB에 저장됨

    cursor.execute('select * from lambda_logs')
    #execute 매서드로 select문 실행
	#conn.cursor().execute('select * from lambda-logs' 이거랑 같음.

	#excute는 커밋을 하지 않아도 연결이 되어있는 동안은 상태를 기억한다.
    #연결이 끊어지면 커밋을 안 하면 데이터가 사라짐
    
    rows = cursor.fetchall()
    #fetchall 메서드로 모든 데이터를 한꺼번에 client로 가져옴
    
    #print(rows)
    a = []
    for row in rows:
        a.append({"ip_address":row[1], "access_time":row[2]})
        # #print("{0} {1} {2}".format(row[0],row[1],row[2]))
        # #print(row[0], row[1], row[2])
        
    return{
        'statusCode':200,
        'body':json.dumps(a)
    }

🙋‍♀️ 5. Lambda 환경변수 설정

(Django에서 my_settings.py 같은 느낌)

  1. Lambda 함수에서 환경변수 - 편집
  2. DBNAME, HOST(RDS엔드포인트), PASSWORD, PORT, USER의 키와 값 설정해주기

🙋‍♀️ 6. RDS 인바운드 규칙 편집

  1. RDS 보안 - VPC 보안 그룹 - 인바운드 규칙 - 인바운드 규칙 편집
  2. 모든 트래픽, Anywhere IPv4 - 규칙저장

🙋‍♀️ 7. 확인해보기!

Test로 확인 후 API GATEWAY 엔드포인트로 확인해보기!

  • ip와 accesstime이 찍히는 걸 볼 수 있다!

🔥 깨달은 점 (이라고 쓰고 공부할 점이라고 읽는다.)

로컬 PC 서버도 쉽지 않은데 저 멀리.. 어딘가 아마존의 서버를 연결하려고 하니 보이지 않는 바닷속에서 해삼.. 말미잘... 멍게를 캐고 양식장을 만드는 기분이었다.

EC2는 뭐고 트리거는 뭐고 RDS는 인스턴스를 생성하게 되면 DB까지 생성되는 건지? 단순히 루트만 만들어주는 건지?
환경변수, 계층, 보안, import되지 않는 모듈은 압축해서 넣어줘야하고... DB에 commit까지 해야된다니!
Django가 스스로 해주는게 많은! 정말. 친절한 아이였구나! 뼈저리게 깨닫게 되었다!^^

SQL문이 아니면 허락해주지 않는. PostgreSQL 덕분에 한 층 더 성장하게 되었고! pgAdimin이 없었다면.... 🙈 지금도 열심히 싸우고 있었겠지

그래도 다음에는 꼭. management tool이 아닌 터미널에서 모든 것을 해결해보고 싶다. 미래의 내가 할거야.

배움은 끝이없고 오늘도 나는 신난다. 😊 ☄️


  1. 리눅스는 꼭 알아야 한다. 리눅스 권한! 설정과 명령어들! sudo 🥲
  2. OS 체계와 흐름 디테일하게 파악하기
  3. SQL문도 공부...
  4. DBMS 종류와 특징, 사용법....
    • PostgreSQL은 왜 현업에서 많이 사용할까?
    • MySQL을 사용하지 않고 PostgreSQL을 사용하는 이유는??
      : 단순히 덜 정규화 시키는 것(데이터관련쪽 산업들)이 아니라 디테일하게 사용하는 이유 알아보기
  5. 왜 우리나라 블로그에는 아무리 서치해도 나오지 않는가!!!!!!
    • 현업 개발자들에겐 너무 기초 지식이라 그럴까?
    • 우리나라에서는 EC2에 PostgreSQL을 연결하는 것보다 더 자주 사용하는 방법이 있는 걸까? (MySQL도 서치하면 잘 안 나옴)

👏 참고했던 사이트들 (엄청 많죠?)

https://www.youtube.com/watch?v=R1UWYQYTPKo

https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/concepts.html

https://aws.amazon.com/ko/ec2/features/

https://docs.aws.amazon.com/lambda/latest/dg/python-handler.html

https://jsonformatter.curiousconcept.com/

https://it-eldorado.tistory.com/115

https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.Connecting.Python.html

https://8iggy.tistory.com/67?category=984396

https://eunsukimme.github.io/database/2019/09/12/Postgresql-Pgadmin/

https://8iggy.tistory.com/71

https://www.w3schools.com/python/python_mysql_insert.asp

https://www.fun-coding.org/mysql_basic6.html

profile
닫혀 있어서 벽인 줄 알고 있지만, 사실은 문이다.

0개의 댓글