생성형 AI 활용한 클라우드&보안 전문가 양성 캠프
오늘은 조금 특별하게 중간에 SK쉴더스 팀장님께서 오셔서 피자를 사주셨다
감사합니다 팀장님~ 너무 잘먹었습니다.
오늘의 정리 핵심 내용
※ S3 에 모든것
S3(Simple Stroage Service)
어렵게 설명말고 간단하게 설명하자면 S3는 슈퍼 큰 USB 같은 저장소라고 생각하면 된다.
정리를 하자면
------------------------------------------------------------------------------------------------------------------------------------
무제한 저장 용량을 제공하는 스토리지 서비스
최소 3개의 가용영역(AZ)에 데이터를 자동 분산 저장하기 때문에 성능, 확장성, 가용성, 내구성이 높음
대표적인 사용사례
- 백업 및 복원
- 재해 복구(DR)
- 아카이브
- 클라우드 스토리지
- 정적 웹 사이트 호스팅
버킷(bucket)
- 객체 저장 공간
- 버킷은 리전 단위로 생성
- 버킷 이름은 유니크 해야 함 (다른 AWS 사용자와도 중복되지 않아야 함)
객체(object)
- 파일
- 개별 파일 업로드 사이즈는 최대 5TB 허용
이렇게 정리 할 수 있고,
세부적으로 얘기하자면
S3 버전 관리
- 객체(파일)이 여러 버전을 가질 수 있음
버전이 여러개로 생성되게 할 수 있기 때문에 이미지가 바뀐 경우 전에 이미지도 볼 수 있다.
- 동일한 파일 이름을 업로드하면 여러 버전으로 저장
오늘의 수업에서는 강아지라는 이름의 객체를 여러가지로 이름을 동일시하여 저장해보는 테스트를 하였다.
- 실수로 객체를 덮어쓰거나 삭제한 경우, 이전 버전으로 복구가 가능
- 실수로 객체를 삭제하는 것을 방지하기 위해 MFA Delete 옵션을 추가할 수 있음
~~~
Multi-Factor Authentication (다중인증)
- 객체를 하나의 파일이 아닌 여러 버전으로 보존할 수 있음
- 버전 관리 기능을 사용하려면 해당 기능을 활성화해야 함 ⇒ 기본적으로 버전 관리 기능은 비활성화되어 있음
S3 객체 암호화
- 데이터를 전송 중에 그리고 스토리지에 저장된 동안 보호하기 위해 암호화를 사용한다.
- S3 객체의 암호화 유형 (SSE = Server Side Encryption)
- SSE-S3 S3에서 관리하는 암호화
- SSE-KMS KMS(키 관리 서버)에서 관리하는 암호화
- SSE-C 고객(사용자)가 관리하는 암호화
- 클라이언트측 암호화
S3 정적 웹 사이트 호스팅
- 정적 웹 사이트 => 내용을 변경하지 않는 이상 항상 같은 내용이 제공되는 사이트 (예시 HTML 구성된 회사소개 페이지)
- 동적 웹 사이트 => 사용자 또는 환경에 따라서 다른 내용이 만들어져서 제공되는 사이트 (예시: 게시판 조회 페이지)
- S3에서 웹 사이트 호스팅을 하면 EC2 등의 별도의 웹 서버를 운영하지 않고 정적 웹 서비스를 제공할 수 있음
- 웹 사이트 주소는 버킷이름.S3-website-리전.amazonaws.com 형식으로 생성
- 정적 웹 호스팅을 이용해서 웹 서비스를 제공하면 해당 버킷의 퍼블릭 액세스를 허용해야 함( 퍼블릿 액세스를 허용하지 않는 경우 403 Forbidden 오류를 반환)
S3 스토리지 클래스
https://aws.amazon.com/ko/s3/storage-classes/?nc=sn&loc=3
객체 수명주기 관리(Lifecycle Policy)
객체가 저장되고 삭제될 때까지의 수명주기를 비용효율적으로 관리하는 기능
예시)
30일 경과 60일 경과 365일 경과
S3 Standard --------> S3 Standard-IA --------------------> Glacier -----------------> 삭제
이벤트 알림
S3에 이벤트가 발생할 때 마다 알리는 기능
이벤트는 객체를 생성, 복제 복원 등이 있음
생성된 이벤트 알림을 SNS, SQS, Lambda 등으로 보낼 수 있음
예) 객체(파일)가 삭제될 때 마다 S3에서 SNS로 이벤트 알림을 보내 사용자에게 이메일을 발송
------------------------------------------------------------------------------------------------------------------------------
RDS(Relational Database Service)
VPC를 생성 후 Public 서브넷 2개 private subnet 2개를 생성 하겠습니다.
sesac2_inst_vpc 10.0.0.0/16
sesac2_inst_public_subnet_a 10.0.10.0/24 첫번째 가용영역 ⇐ t2.micro 인스턴스 유형을 제공하는 가용영역을 선택
sesac2_inst_public_subnet_c 10.0.30.0/24 세번째 가용영역
sesac2_inst_private_subnet_a 10.0.20.0/24 첫번째 가용영역
sesac2_inst_private_subnet_c 10.0.40.0/24 세번째 가용영역
sesac2_inst_public_subnet_* ⇐ sesac2_inst_publict_rt와 연결 ⇐ IGW으로 라우팅을 포함한 라우팅 테이블
sesac2_inst_private_subnet_* ⇐ sesac2_inst_private_rt와 연결
생성 이유:
이 구성을 만드는 이유는 보안과 효율성을 동시에 높이기 위해서인데 이 구조를 통해서, 외부 접근이 필요한 리소스와 내부에서만 사용하는 리소스를 분리 할 수 있습니다.
상세 설명:
VPC
우리만의 네트워크 환경을 만들기 위해 생성하는데 외부에서 접근할 수 있는지 여부를 우리가 제어 할 수 있다
Public과 Private subnet의 분리
Public Subnet: 이 서브넷에는 외부 인터넷과 연결되는 리소스를 넣는다 웹 서버 같은, 외부에서 접근해야 하는 서버를 배치할 수 있다.
Private Subnet: 이 서부넷에서는 외부 인터넷과 직접 접근할 수 없는 구역이다 보안이 중요한 데이터베이스 서버 같은 것을 보관하면 된다.
라우팅 테이블 설정
- Public Subnet은 sesac2_inst_public_rt와 연결되어 있으며, 여기에는 IGW로의 라우팅이 포함돼 있어요. 그래서 Public Subnet 안의 리소스는 인터넷과 통신할 수 있어요.
- Private Subnet은 sesac2_inst_private_rt와 연결되어 있고, 여기에는 IGW가 없기 때문에 외부 접근이 차단돼요. 필요하다면 NAT Gateway 등을 추가하여 내부 리소스에서만 인터넷에 접근하게 설정할 수 있어요.
-------------------------------------------------------------------------------------------------------------------------------------------
RDS 사용법
mysql workbench 설치
https://dev.mysql.com/downloads/workbench/
RDS 인스턴스의 연결 정보를 확인한다.
베스천 호스트 생성
베스천 호스트는 외부 네트워크와 내부 네트워크를 안전하게 연결해 주는 중간 서버이다
쉽게 설명하면 보안 게이트웨이라고 생각하면 될거 같다.
-----------------------------------------------------------------------------------------------------------------------------------------------
람다 함수 작성
우선 vs code를 설치한다.
https://code.visualstudio.com/
람다 함수 작성
import sys
import pymysql
config = {
"host": "sesac2-inst-rds.c3ueygoy6ya8.ap-northeast-2.rds.amazonaws.com",
"port": 3306,
"database": "sampledb",
"user": "admin",
"password": "password"
}
try:
conn = pymysql.connect(**config)
except Exception as e:
print("Error connecting to MariaDB Platform: ", e)
sys.exit()
print("Connected to MariaDB Platform")
# event = { "title": "제목", "contents": "내용", "user": "사용자 이름" }
def lambda_handler(event, context):
print(event)
with conn.cursor() as cur:
query = "INSERT INTO t_board (title, contents, created_id, created_dt) VALUES (%s, %s, %s, CURRENT_TIMESTAMP)"
cur.execute(query, (event["title"], event["contents"], event["user"]))
conn.commit()
return {
"statusCode": 200,
"body": "Success"
}
람다 함수 실행에 필요한 패키지를 설치
c:\aws> pip install pymysql --target .
Collecting pymysql
Downloading PyMySQL-1.1.1-py3-none-any.whl.metadata (4.4 kB)
Downloading PyMySQL-1.1.1-py3-none-any.whl (44 kB)
Installing collected packages: pymysql
Successfully installed pymysql-1.1.1
[notice] A new release of pip is available: 24.2 -> 24.3.1
[notice] To update, run: python.exe -m pip install --upgrade pip
c:\aws> dir
C 드라이브의 볼륨에는 이름이 없습니다.
볼륨 일련 번호: 9027-83B9
c:\aws 디렉터리
2024-11-01 오후 04:19 <DIR> .
2024-11-01 오후 04:19 <DIR> ..
2024-11-01 오후 04:15 891 lambda_function.py
2024-11-01 오후 04:19 <DIR> pymysql
2024-11-01 오후 04:19 <DIR> PyMySQL-1.1.1.dist-info
1개 파일 891 바이트
4개 디렉터리 160,357,494,784 바이트 남음
배포를 위해서 zip 파일로 압축
c:\aws> tar -acf lambda_function.zip . ⇐ 현재 디렉터리(.)의 모든 파일과 하위 디렉터리를
lambda_function.zip 파일로 압축
c:\aws> dir
C 드라이브의 볼륨에는 이름이 없습니다.
볼륨 일련 번호: 9027-83B9
c:\aws 디렉터리
2024-11-01 오후 04:21 <DIR> .
2024-11-01 오후 04:21 <DIR> ..
2024-11-01 오후 04:15 891 lambda_function.py
2024-11-01 오후 04:21 131,978 lambda_function.zip
2024-11-01 오후 04:19 <DIR> pymysql
2024-11-01 오후 04:19 <DIR> PyMySQL-1.1.1.dist-info
2개 파일 132,869 바이트
4개 디렉터리 160,361,058,304 바이트 남음
람다 함수를 생성 후 코드를 추가하여 테스트
------------------------------------------------------------------------------------------------------------------------------
테스트와 실제로의 람다 함수 작업은 내일 진행하기로 해서
결과는 내일 올리겠습니다.
오늘의 수업 끝