EC2에도 S3와 같은 스토리지
가 존재한다. 일명 EBS (Elastic Block Storage)이며 EC2 instance 에 직접 붙혀서 사용하는 볼륨형 스토리지이다. 하지만 AWS의 분산 관리로 업로드된 파일은 따로 관리하곤 한다.
EC2는 코드를 위한곳!! 즉, 코드를 실행하기 위한 것으로 DB와의 연결에 관여하며, 모든 것은 EC2에 연결된다. 서버 최적화, 연동 속도관리 등.. / 그러나 파일 저장은 S3가 담당한다.
이렇게 되면 서버생성을 위해 EC2생성, 파일 저장을 위해 S3 설정, DB설정을 위해 RDS 설정 아주 번거롭다! 이를 한번에 처리하기 위해 elastic beanstalk이란 게 있다.
elastic beanstalk ?
application 배포와 클라우드에 push하는것을 도와준다.
또한 EC2, RDS, S3 설정을 자동으로 진행해준다 또한 Git과 연동되어있어서 git의 commit사항을 push하면 자동으로 업데이트!!!
S3 ?
Storage Service의 줄임말.
즉, 특정 사진, 동영상 등의 파일을 저장하기 위해 사용할 수 있는 서비스 이다.
S3의 용어에는 Object(객체) 와 Bucket(버킷)의 개념이 있다.
MySQL이 Amazon의 S3에 접근하는걸 허용하기 위해 정책을 생성해야 한다. 이때 정책은 IAM이다.
IAM ?
AWS Identity and Access Management(IAM)는 AWS 리소스에 대한 액세스를 안전하게 제어할 수 있는 웹 서비스.
IAM을 사용하여 리소스를 사용하도록 인증(로그인) 및 권한 부여(권한 있음)된 대상을 제어한다.
출처 : https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/introduction.html
나의 경우 기존에 만든 user가 있어서 새로 만들진 않았다.
AWS에 로그인
IAM Resources 에서 사용자 추가
Add user
액세스 권한 유형 ?
두가지가 있다. Programmatic access 혹은 AWS Managemenent conslone access.
Programmatic access(프로그래밍 방식 액세스)
를 선택한다. 이렇게 하면 각 사용자에 대한 액세스 키가 생성됩니다. 최종(Final) 페이지에 이르면 액세스 키를 보거나 다운로드할 수 있다.AWS Management 콘솔 access(콘솔 액세스)
를 선택한다. 이렇게 하면 각 신규 사용자에 대한 암호가 생성된다.정책 이름 : jello
새 Permission 설정하기 (permission policy 추가)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObjectAcl",
"s3:GetObject",
"s3:ListBucket",
"s3:DeleteObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::example-bucket-name/*",
"arn:aws:s3:::example-bucket-name"
]
}
]
}
위의 코드에서 example-buckt-name
부분은 이후에 내가 만든 S3 버킷 이름을 입력해야 한다.
"Download.csv" (key 정보 다운로드하기)
EC2에서 pem file을 다운받은것 처럼 IAM정책을 새로 생성하고 나면 이에 관한 access_key나 secret_key에 대한 정보가 담긴 file을 다운받아 보관해야 한다. 이때, 생성 당시에만 다운받을 수 있고 이후에는 추가 다운로드가 불가능 하니 꼭!! 관리를 잘 해주어야 한다.
정책생성이 완료되었으면 다음으로 S3를 새로 생성한다.
Bucket 생성
Create bucket
으로 버킷 이름을 입력하고, region을 선택한다.
버킷 이름 : jellogram
region : Asia/Seoul
access 허용하기
기본적으로 all public access를 block 하는 항목이 활성화 되어있다. 이를 해제해 준다.
버킷 버전관리 & 기본 암호화
버킷을 생성하면서 지정하는 값인데 일단.. 비활성화로 지정했다. (아직 과금요소인지, 무슨기능인지 정확히 파악하지 못했기 때문)
bucket이 생성되었다면 아까 지정한 정책을 적용해준다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt15076373*****",
"Effect": "Allow",
"Principal": {
"AWS": "{user_arn}"
},
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::{bucket_name}/*"
},
{
"Sid": "Stmt15076373*****",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::{bucket_name}/*"
}
]
}
퍼블릭 경고 ?
퍼블릭으로 설정하고 나면 경고를 한다. 원칙적으로는 S3는 public access를 주지 않는것이 보안상 좋다. S3는 private하게 막고 S3 앞에 CloudFront를 붙혀서 CDN 기능을 구현하는것이 정석이긴 하다.
JSON으로 작성된 CORS 구성은 한 도메인에 로드되어 다른 도메인의 리소스와 상호 작용하는 클라이언트 웹 애플리케이션에 대한 방법을 정의한다.
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"GET", "PUT", "POST", "HEAD"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": [
"ETag"
],
"MaxAgeSeconds": 3000
}
]
이를 위해선 먼저 python package설치가 필요하다.
pip install boto3
boto3 ?
boto3는 python 의 AWS library 이다.
endpoint 예제
class FileView(View):
s3_client = boto3.client(
's3',
aws_access_key_id=#key,
aws_secret_access_key=#secret_key
)
def post(self, request):
file = request.FILES['filename']
self.s3_client.upload_fileobj(
file,
"{버킷이름}",
file.name,
ExtraArgs={
"ContentType": file.content_type
}
)
return HttpResponse(status= 200)
이제 내 jellogram에 적용하고 postman을 이용해 image를 업로드 해보자
postman으로 test 하기 : request.FILES
postman으로 FILES 형태를 test하기 위해선 request형식을 지정해주어야 한다.
form-data
형식으로 key에 내가 지정한 key값을 입력하고 형식으로 File과 Text중 File를 선택한다.- value에 파일을 업로드 한다.
이후엔 업로드한 이미지를 내 db에 저장한 url을 통해 확인해 보자
성공-!!!😆 팀프로젝트에서 온전히 혼자 구현해보지 못했던 기능이라 참 뿌듯하다!