AWS S3 는 Amazon Simple Storage Service는 인터넷용 스토리지 서비스다.
이 서비스는 개발자가 더 쉽게 웹 규모 컴퓨팅 작업을 수행할 수 있도록 설계되어 있다.
Amazon S3에서 제공하는 단순한 웹 서비스 인터페이스를 통해 언제 어디서나 원하는 양의 데이터를 저장하고 검색할 수 있다. 또한 개발자는 Amazon이 자체 웹 사이트의 글로벌 네트워크 운영에 사용하는 것과 같은 높은 확장성과 신뢰성을 갖춘 빠르고 경제적인 데이터 스토리지 인프라에 액세스할 수 있다.
버킷, 액세스 포인트 및 객체와 같은 Amazon S3의 핵심 개념을 알아야 한다.
참고:https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/dev/Welcome.html
{
"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"
]
}
]
}
{
"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}은 각자 버켓의 이름이다.
<?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>
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)