TIL[80].AWS_S3파일 업로드

jake.log·2020년 10월 18일
0
post-custom-banner

1. AWS S3

AWS S3 는 Amazon Simple Storage Service는 인터넷용 스토리지 서비스다.
이 서비스는 개발자가 더 쉽게 웹 규모 컴퓨팅 작업을 수행할 수 있도록 설계되어 있다.

Amazon S3에서 제공하는 단순한 웹 서비스 인터페이스를 통해 언제 어디서나 원하는 양의 데이터를 저장하고 검색할 수 있다. 또한 개발자는 Amazon이 자체 웹 사이트의 글로벌 네트워크 운영에 사용하는 것과 같은 높은 확장성과 신뢰성을 갖춘 빠르고 경제적인 데이터 스토리지 인프라에 액세스할 수 있다.

버킷, 액세스 포인트 및 객체와 같은 Amazon S3의 핵심 개념을 알아야 한다.
참고:https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/dev/Welcome.html

2. 파일 업로드 방법

1. AWS IAM

  • AWS에서 IAM을 검색한 후 사용자 IAM 리소스에서 사용자(user)를 선택
  • 사용자 추가를 클릭 후 사용자 이름을 입력 후 프로그래밍 방식 액세스 체크
    이때 "AWS management access console" 항목은 체크 하지 않음
  • 다음 버튼 클릭 후 권한 설정에서 기존 정책 직접 연결을 클릭한다.
  • 아래 정책 생성 클릭 후 JSON 탭으로 이동하여 아래와 같이 json 입력
{
    "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-bucket-name은 추후 버켓 생성되면 변경한다.
  • 이후 이름과, 설명 추가하여 정책을 생성
  • 권한설정 페이지로 돌아가 오른쪽 상단에 새로고침을 누른후 방금 만든 정책을 체크하고 다음으로 이동한다.
  • 새로운 사용자 생성이 완료되면 Download.csv 를 눌러 꼭 다운 받는다.

2. AWS S3 bucket

  • AWS S3 페이지에서 버킷 만들기를 클릭 후 이름과 region을 설정한다.
  • 그 다음 페이지에서 "모든 퍼블릭 액세스 차단(Block all public access)"를 uncheck
  • 버켓 생성을 완료한 후, 해당 버켓을 클릭해서 버켓의 설정 페이지로 들어간다.
  • 그 후 상단의 "권한" 탭에서 "버킷 정책" 클릭 후 다음의 JSON을 입력
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1507637373230",
            "Effect": "Allow",
            "Principal": {
                "AWS": "{user_arn}"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::{bucket_name}/*"
        },
        {
            "Sid": "Stmt1507637391106",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::{bucket_name}/*"
        }
    ]
}

{user_arn} 은 IAM user의 ARN 이다.
{bucket_name}은 각자 버켓의 이름이다.

  • I AM 유저의 ARN은 IAM 페이지에서 users 페이지에 해당 유저를 클릭하면 나오는 페이지에서 확인한다.
    -저장 버튼 클릭후, CORS 구성에 들어가 아래 설정을 입력한다.
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <ExposeHeader>ETag</ExposeHeader>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

3. Django에서 boto3 를 이용하여 s3와 연결 및 파일 업로드하기

AWS에서 모든 설정이 완료 되었고, django에서 boto3 AWS 파이썬용 라이브러리를 설치pip install boto3 하고 아래와 같이 엔드포인트를 만든다.

class FileUploadView(View):
    s3_client = boto3.client('s3', aws_access_key_id='{aws_access_key_id}', aws_secret_access_key='{aws_secret_access_key}')
    
    def post(self,request):
        file_urls=[]
        for file in request.FILES.getlist('file'):
            self.s3_client.upload_fileobj(
                file,'{bucket-name}',file.name,
                ExtraArgs={
                    'ContentType':file.content_type
                }
            )
            upload_file =File.objects.create(user=request.user ,title = file.name, file_url = 'https://s3.ap-northeast-2.amazonaws.com/cutedimage'+file.name)
            file_urls.append(upload_file.file_url)
              
        return JsonResponse({'files':file_urls}, status=200)
  • {aws_access_key_id}와 {aws_secret_access_key} 값은 csv 파일에서 확인 할 수 있다.
  • upload_fileobj에서 {bucket-name}은 Bucket 이름을 적는다.
  • request.FILES를 통해 장고로 파일이 전달 된다.

참고: https://community.wecode.co.kr/t/django-s3/1163/2

profile
꾸준히!
post-custom-banner

0개의 댓글