AWSのS3に画像やstaticファイルをアップロードする方法

# AWSコンソールでS3を作成
1. AWSのコンソールにログイン
2. S3にアクセス
3. `バケットを作成`をクリック
4. `バケット名`を入れて、後はデフォルトの設定で`バケットの作成`をします。
5. 作成されたバケットをクリックして詳細画面へ
6. アクセス許可のタブを開きます
7. Cross-Origin Resource Sharing (CORS)の中身を以下に編集します。

```
[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "POST",
            "GET",
            "PUT"
        ],
        "AllowedOrigins": [
            "*"
        ]
    }
]
```

# AWSコンソールでIAMユーザーの作成
次にS3を操作できる権限を持ったユーザーを作るためにIAMを使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450257/c3f668f2-7c5c-7b8e-c19e-93ff8530ac7a.png)

ユーザー名とアクセスの種類の両方に✔して次のステップへ行きます。

#
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450257/ee1cb077-dc8c-20e2-e796-204892e3ba79.png)

既存のポリシーを直接アタッチから`S3`と検索して`AmazonS3FulAccess`にチェックを入れます。
後は、次のステップに進み続けてユーザーを作成します。

その際に`ACCESS_ID`と`SECRET_KEY`(重要)が出てくるのでそれを控えておいてください。
控えておかないと新しいユーザーを作成しなおさなければなりません。

# 必要なパッケージをインストール

```
$ pip install django-storages
$ pip install boto3
```

# settings.pyの設定
INSTALLED_APPSに`storages`を追加します。

```settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # My apps
    'blog',
    'searches',
    # aws
    'storages', #追加します。
]

```
`settings.py`の一番下で作成したS3バケットの設定を書きます。

```settings.py
#S3 BUCKETS CONFIG
"""
AWS_ACCESS_KEY_ID = '***********' # Iamのuserid
AWS_SECRET_ACCESS_KEY = '**********' # Iamのuser key
AWS_STORAGE_BUCKET_NAME = 'renren-django-blog' #S3バケットの名前
AWS_S3_FILE_OVERWRITE = False #同じ名前のファイルを上書きするか？
AWS_DEFAULT_ACL = None # 
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
"""
```
より細かい設定についてみたい方は[公式ドキュメント](https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html)をみてください。



実際にS3にアップロード
表示されない場合はinspectモードを起動(windowsなら`F12`)し、ファイルのパスを調べる
python manage.py collectstaticで自動でAmazonに上げてくれる

`AWS_ACCESS_KEY_ID`や`AWS_SECRET_ACCESS_KEY`等は機密情報として`.env`ファイルに書きそれを参照するのが推奨されます。以下のサイトを参考にして設定してください。
参考サイト：[【Django】環境変数を効率的に管理する「django-environ」の使い方](https://vector-ium.com/django-environ/)

結論だけ言うとsettings.pyファイルが以下のようになります。

```setting.py
AWS_ACCESS_KEY_ID = env('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = env('AWS_SECRET_ACCESS_KEY') 
AWS_STORAGE_BUCKET_NAME = env('AWS_STORAGE_BUCKET_NAME')
AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
```
```　.env
AWS_ACCESS_KEY_ID=***********
AWS_SECRET_ACCESS_KEY=**********
AWS_STORAGE_BUCKET_NAME=**************
```

# S3バケットへのアップロード

`python manage.py collectstatic`を実行することで、今現在ローカルのstaticフォルダにあるファイルが全てS3上にアップロードされます。
mediaフォルダに画像がある場合は最初だけ手動でアップロードする必要があります。

# 参考
[公式ドキュメント](https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html)
[File Storage with AWS S3 Buckets Upload | Django (3.0) Crash Course Tutorials (pt 22)](https://www.youtube.com/watch?v=inQyZ7zFMHM&list=PL035m_6_QBCgQ8nU6JK0o8xFDvhW9A9E1&index=20)