본문 바로가기

IT 매일매일

Django - AWS S3 연동, AWS Lambda 함수 생성

장고의 기능을 활용하여 AWS의 S3와 연동해보려 한다.

 

-준비F

AWS RDS,AWS S3 ,Django 

-장고에서 pip install boto3 django-storages

준비한 DB와 Django의 연결은 Django의 setting.py 파일에서 한다.
위와 같이 세팅을 해주고,

AWS_REGION = 'ap-northeast-2'
AWS_STORAGE_BUCKET_NAME = 'kjs27-s3'
AWS_ACCESS_KEY_ID = ''
AWS_SECRET_ACCESS_KEY = ''

AWS_S3_CUSTOM_DOMAIN = '%s.s3.%s.amazonaws.com' % (AWS_STORAGE_BUCKET_NAME, AWS_REGION)


STATIC_URL = "https://%s/static/" % AWS_S3_CUSTOM_DOMAIN
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

MEDIA_URL = "https://%s/'media/" % AWS_S3_CUSTOM_DOMAIN
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

위 설정이 끝나면 

models.py

from django.db import models

# Create your models here.
class Picture(models.Model):
    img = models.ImageField(upload_to="", blank=True)

urls.py

from django.urls import path
from django.conf import settings
from django.conf.urls.static import static
import app.views


urlpatterns = [
                path('main/', app.views.main),
                path('register/', app.views.register),


] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

 

views.py

from django.shortcuts import render, redirect
from app.models import Picture
import app

# Create your views here.
def main(request):
    pictures = Picture.objects.all()

    return render(request, 'main.html', {'result': pictures})


def register(request):
    if request.method == 'GET':
        return render(request, 'register.html')
    elif request.method == 'POST':
        images = request.FILES.getlist("image")
        for image in images:
            picture = Picture()
            picture.img = image
            picture.save()

        return redirect('/main/')

main.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% if result %}

    {% for picture in result %}
        <img src="https://kjs27-s3.s3.ap-northeast-2.amazonaws.com/{{ picture.img }}">

    {% endfor %}
{% endif %}
</body>
</html>

register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="file" multiple name="image">
    <button>업로드</button>
</form>
</body>
</html>

이후 오타, 설정을 잘못한게 없다면 장고에서

python .\manage.py renserver - url 접근 후

 

이미지 파일 선택 후 업로드
업로드 성공!

!Lambda
서버 없이 사용자가 등록해놓은 코드를 실행시킬수 있다.
CPU,메모리 없다. = 하지만 AWS측에 컴퓨터가 있기 때문에 아예 없다고 볼수는 없다.
함수를 몇번 실행 했는지에 따라 요금 계산
구성에서 제한시간 확인가능 = 3초안에 코드 불러오지 못하면 오류처리 하겠다. (늘릴수 있다.)
기본 설정은 제한시간 3초, 메모리 128MB, 임시 스토리지 512MB

함수 생성 - 함수 이름 - 함수 선택 - 함수 성생 완료

밑에 내려가서 코드 소스에 테스트 - 테스트 이름 - 이벤트 생성 - Deploy로 배포 - 실행

 

- 코드 배포하기

python에서 코드 짠것

import pymysql

def lambda_handler(event, context):
    conn = pymysql.connect(host='web1.c0k4bofs0rrt.ap-northeast-2.rds.amazonaws.com',
                           user='',
                           password='',
                           db='web',
                           charset='utf8')

    sql = "SELECT * FROM student"
    with conn:
        with conn.cursor() as cur:
            cur.execute(sql)
            result = cur.fetchall()
            for data in result:
                print(data)

 

-파이참에서 새 프로젝트에 아래 코드 입력

 

이후

pip install pymysql -t .\ 해서 모듈을 내가 있는 프로젝트에 설치 후 압축 파일로 만들어서 

 

람다 - 함수 - 코드소스 오른쪽 업로드로 압축파일 업로드 - 테스트에서 테스트 실행 후 저장 - 로그 보기

'IT 매일매일' 카테고리의 다른 글

AWS 서버리스(server less) 3Tier conn 1  (0) 2023.03.16
AWS API GATEWAY?  (0) 2023.03.15
AWS S3 버킷 생성  (0) 2023.03.15
클라우드와 AWS의 기초  (0) 2023.03.13
파이썬 기초 2  (0) 2023.02.20