[AWS] S3로 이미지 업로드

채록·2021년 5월 6일
16

AWS&Docker

목록 보기
3/12
post-thumbnail

🔥 이미지 관리 EC2 vs S3

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>

S3 ?
Storage Service의 줄임말.
즉, 특정 사진, 동영상 등의 파일을 저장하기 위해 사용할 수 있는 서비스 이다.

객체와 버킷

S3의 용어에는 Object(객체) 와 Bucket(버킷)의 개념이 있다.

  • Object(객체): 저장되는 파일
  • Bucket(버킷): 파일이 저장될 프로젝트

Step 1. IAM 정책 생성하기

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

1) 새 User 생성

나의 경우 기존에 만든 user가 있어서 새로 만들진 않았다.

AWS에 로그인

IAM Resources 에서 사용자 추가

Add user

  • Programmatic Access 항목에 체크한다.

    액세스 권한 유형 ?
    두가지가 있다. Programmatic access 혹은 AWS Managemenent conslone access.

  • 사용자가 API, AWS CLI, 또는 Windows PowerShell용 도구에 대한 액세스 권한이 필요한 경우, Programmatic access(프로그래밍 방식 액세스)를 선택한다. 이렇게 하면 각 사용자에 대한 액세스 키가 생성됩니다. 최종(Final) 페이지에 이르면 액세스 키를 보거나 다운로드할 수 있다.
  • 사용자에게 AWS Management 콘솔에 대한 액세스 권한이 필요한 경우, AWS Management 콘솔 access(콘솔 액세스)를 선택한다. 이렇게 하면 각 신규 사용자에 대한 암호가 생성된다.

2) 정책 추가

정책 이름 : 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을 다운받아 보관해야 한다. 이때, 생성 당시에만 다운받을 수 있고 이후에는 추가 다운로드가 불가능 하니 꼭!! 관리를 잘 해주어야 한다.


Step 2. AWS S3 bucket 생성하기

정책생성이 완료되었으면 다음으로 S3를 새로 생성한다.

Bucket 생성
Create bucket으로 버킷 이름을 입력하고, region을 선택한다.
버킷 이름 : jellogram
region : Asia/Seoul

access 허용하기
기본적으로 all public access를 block 하는 항목이 활성화 되어있다. 이를 해제해 준다.

버킷 버전관리 & 기본 암호화
버킷을 생성하면서 지정하는 값인데 일단.. 비활성화로 지정했다. (아직 과금요소인지, 무슨기능인지 정확히 파악하지 못했기 때문)


Step 3. bucket 정책 지정하기

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}/*"
        }
    ]
}
  • {user_arn} : IAM user의 ARN
  • {bucket_name} : 내 버킷의 이름

퍼블릭 경고 ?
퍼블릭으로 설정하고 나면 경고를 한다. 원칙적으로는 S3는 public access를 주지 않는것이 보안상 좋다. S3는 private하게 막고 S3 앞에 CloudFront를 붙혀서 CDN 기능을 구현하는것이 정석이긴 하다.


Step 3. CORS 설정

JSON으로 작성된 CORS 구성은 한 도메인에 로드되어 다른 도메인의 리소스와 상호 작용하는 클라이언트 웹 애플리케이션에 대한 방법을 정의한다.

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET", "PUT", "POST", "HEAD"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [
            "ETag"
        ],
        "MaxAgeSeconds": 3000
    }
]

Step 4. Django와 S3 연결하기

이를 위해선 먼저 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)
  • 장고에서는 전송된 파일이 request.FILES를 통해 전달된다.

----------------------------


끝!

이제 내 jellogram에 적용하고 postman을 이용해 image를 업로드 해보자

postman으로 test 하기 : request.FILES


postman으로 FILES 형태를 test하기 위해선 request형식을 지정해주어야 한다.

  • form-data 형식으로 key에 내가 지정한 key값을 입력하고 형식으로 File과 Text중 File를 선택한다.
  • value에 파일을 업로드 한다.

이후엔 업로드한 이미지를 내 db에 저장한 url을 통해 확인해 보자

성공-!!!😆 팀프로젝트에서 온전히 혼자 구현해보지 못했던 기능이라 참 뿌듯하다!

profile
🍎 🍊 🍋 🍏 🍇

0개의 댓글