[AWS]django S 3の使い方


django s 3アップロード設定


aws s s 3 bucket作成方法の省略
iamユーザーの情報が必要です
  • access鍵id、secret access鍵が必要
  • django静的ファイル関連設定


    モジュールのインストール

  • pip install boto3-S 3モジュール
  • pip install django-storages-モジュール
  • settings.py設定

    # django-storages를 사용하기 위해 installed apps에 storages 추가
    INSTALLED_APPS = [
    	...
    	'storages',
    ]
    
    # S3 설정을 위한 변수
    # access key와 secret key는 본인이 생성한 iam의 정보를 사용할 것
    AWS_ACCESS_KEY_ID = MY_AWS_ACCESS_KEY_ID
    AWS_SECRET_ACCESS_KEY = MY_AWS_SECRET_ACCESS_KEY
    
    AWS_REGION = 'ap-northeast-2'
    AWS_STORAGE_BUCKET_NAME = 'beap-test-shop'
    AWS_S3_CUSTOM_DOMAIN = '%s.s3.%s.amazonaws.com' % (
        AWS_STORAGE_BUCKET_NAME, AWS_REGION)
    AWS_S3_OBJECT_PARAMETERS = {
        'CacheControl': 'max-age=86400',
    }
    AWS_DEFAULT_ACL = 'public-read'
    AWS_LOCATION = 'static'
    STATIC_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
    STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static')
    ]
    
    DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

    静ファイルS 3にアップロード(静ファイル収集)

  • ./manage.py collectstatic
  • S 3パケット権限の設定





  • Select Type of Policy - S3 Bucket Policy
  • Effect - Allow
  • Principal - *
  • Actions-GetObject(読み取り)/PutObject(書き込み)-通常はこの2つの
  • を使用します.
  • ARN - arn:asw:s3:::{my_bucket_name}/*
  • 以降のAdd Statementがアクティブな場合は、クリックしてJsonファイルをコピーし、bucketポリシーに貼り付けます.

    djangoでboto 3を使用してファイルをアップロードする

    import boto3
    
    s3_client = boto3.client(
    	's3',
    	aws_access_key_id='my_access_key_id',
    	aws_secret_access_key='my_access_secret_key',
    )
    
    file = request.FILES.get('file')
    
    # 방법1
    s3_client.upload_fileobj(
    	file,
    	'my_bucket_name',  # s3에 생성한 버킷 이름
    	's3_upload_file_name',  # s3에 업로드될 경로 및 파일이름
    	ExtraArgs={
    		'ContentType': file.content_type,  # file의 확장자 타입
    	}
    )
    
    # 방법2
    s3_client.upload_file(
    	file,
    	'my_bucket_name',  # s3에 생성한 버킷 이름
    	's3_upload_file_name',  # s3에 업로드될 경로 및 파일이름	
    )
    방법1방법2の違いupload_fileobj()の主なポイントは、ファイルオブジェクトがまずローカルディスクに格納される必要はないが、RAMにファイルオブジェクトとして表示されることである.
    各方法で見ることができ、upload fileobj()を使用するとurlで直接画像を表示することができます.
    upload file()を使用すると、ローカルディスクに画像を保存して表示できます.
    速度の観点から見ると、방법1の方が速い.
    ただし、画像拡張子(jpg、png、...)ファイルを変換してS 3に保存したい場合は、上記の方法でファイルを書き込むと、ファイルがクラッシュする場合があります.
    △個人的な経験では、img→pdfファイルに変換してアップロードすると、pdfファイルが破壊され、ファイルが確認できなくなります.
    私が解決する方法はdjangoプロジェクトにpdfファイルに変換して保存し、それを開いて保存することです.そして、この論理が終了すると、djangoプロジェクトで生成されたpdfファイルをクリアすることで論理を終了する.△これは有効な方法ではないようですが、今は私が実現できる方法を使っています.