아마존에서 제공하는 클라우드 컴퓨팅 서비스.
아마존에서 세계 각 지역에 만들어놓은 인프라 (데이터 센터)에서 한 대의 컴퓨터를 임대한다는 개념. 네트워크를 통해 제어.
예전에는 전세계 모든 아마존 사용자들의 인스턴스가 아주 랜덤하게 위치했었다.
그래서 AWS 클라우드 내에 여러 사용자의 가상머신들이 한 네트워크에 함께 구성되어있었다.
다른 고객들과 완벽하게 격리된 한 사용자만의 네트워크를 구성하고 가상의 데이터센터를 설정할 수 있게 만들었다.
서브넷 단위로 VPC내에서 공간 구분을 해 가상머신을 위치시킬 수 있다. (바운더리)
AWS RDS도 Docker와 비슷한 루트로 생각하면 된다!
AWS PostgreSQL을 아마존이 띄운 PostgreSQL 이미지라고 보면 되고, 항상 엔드포인트를 준다. (Front와 Back이 소통할 때 주고받는 주소처럼)
AWS PostgreSQL은 S3와 연동되는데 백업을 위해 커밋을 해, 저장해서 백업용으로 사용한다. 순간 사진처럼 쌓이는 이미지라고 해서 스냅샷이라고 부름.
local상의 PostgreSQL과 달리 AWS에서 생성한 PostgreSQL은 퍼미션이 엄격해서 연결이 어렵다.
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
})
}
$mkdir python
$cd python
$pip install aws-psycopg2 -t .
(1) Lambda 계층
(2) 계층 생성
(3) .zip 파일 업로드
(4) 호환 런타임 : Python 3.6, Python 3.7, Python 3.8, Python 3.9
일단 Python 다... 했음
(5) 생성
(1) Lambda 함수
(2) 계층
(3) Add a layer
(4) 사용자 지정 계층
(5) AWS 계층에서 4번에서 추가했던 계층 선택
(6) 추가
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('제발돼라제발')
}
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)
}
Test로 확인 후 API GATEWAY 엔드포인트로 확인해보기!
로컬 PC 서버도 쉽지 않은데 저 멀리.. 어딘가 아마존의 서버를 연결하려고 하니 보이지 않는 바닷속에서 해삼.. 말미잘... 멍게를 캐고 양식장을 만드는 기분이었다.
EC2는 뭐고 트리거는 뭐고 RDS는 인스턴스를 생성하게 되면 DB까지 생성되는 건지? 단순히 루트만 만들어주는 건지?
환경변수, 계층, 보안, import되지 않는 모듈은 압축해서 넣어줘야하고... DB에 commit까지 해야된다니!
Django가 스스로 해주는게 많은! 정말. 친절한 아이였구나! 뼈저리게 깨닫게 되었다!^^
SQL문이 아니면 허락해주지 않는. PostgreSQL 덕분에 한 층 더 성장하게 되었고! pgAdimin이 없었다면.... 🙈 지금도 열심히 싸우고 있었겠지
그래도 다음에는 꼭. management tool이 아닌 터미널에서 모든 것을 해결해보고 싶다. 미래의 내가 할거야.
배움은 끝이없고 오늘도 나는 신난다. 😊 ☄️
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://8iggy.tistory.com/67?category=984396
https://eunsukimme.github.io/database/2019/09/12/Postgresql-Pgadmin/