2016-12-15 10 views
0

Amazon S3から私のDjangoプロジェクト(Herokuでホストされている)で静的ファイルとメディアファイルを提供しようとしています。静的ファイルはローカルとデプロイの両方で適切に提供されていますが、メディアファイルはローカルでのみ動作します。 localhostが提供するファイルがバケットから正しく追加されていることを確認できますが、セーブやローディングのどちらも本番環境では動作しません。Herokuが展開したdjangoプロジェクトのS3メディアファイルがありません

<Error> 
    <Code>AccessDenied</Code> 
    <Message>Access Denied</Message> 
    <RequestId>7430A21BE321C26B</RequestId> 
    <HostId> 
     h/c1VQF57wrLJ7JdHXuJ8LCrQdZL9PfQZN4G38Ihg8UYCxSt0znbxWfiTSDxz0dCooQoqgW9tpw= 
    </HostId> 
</Error> 

私は(セキレイの画像アップロードを介して)、ファイルを保存しようとすると、私が手に:私は(私は手動でバケットに追加された)メディアイメージにサービスを提供しようとすると、私は403個のアクセス拒否エラーを取得しますむしろ一般的なInternal Server Error - 500です。私は問題が何であるかについて迷っています。私が静的だがメディアファイルではないという事実は、とても混乱している(そしてそれは単なる許可エラーではないと思う)の一部です。問題に関連していると思われるものがあります。

編集:私の生産設定でDEBUG = Trueが異なる生産エラーをデバッグすることがわかった。これをFalseに設定すると、静的ファイルのメディアファイルに対して403エラーが発生するようになりました。

私のバケットポリシー:settings.py

{ 
    "Version": "2008-10-17", 
    "Statement": [ 
     { 
      "Sid": "PublicReadForGetBucketObjects", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "*" 
      }, 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::owen-tribune/*" 
     }, 
     { 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "arn:aws:iam::494147019987:user/jtebert" 
      }, 
      "Action": "s3:*", 
      "Resource": [ 
       "arn:aws:s3:::owen-tribune", 
       "arn:aws:s3:::owen-tribune/*" 
      ] 
     }, 
     { 
      "Sid": "somethingElse", 
      "Action": "s3:ListBucket", 
      "Effect": "Allow", 
      "Resource": [ 
       "arn:aws:s3:::owen-tribune", 
       "arn:aws:s3:::owen-tribune/*" 
      ], 
      "Principal": { 
       "AWS": [ 
        "arn:aws:iam::494147019987:user/jtebert" 
       ] 
      } 
     } 
    ] 
} 

関連部分:custom_storages.py

AWS_ACCESS_KEY_ID = '###########' 
AWS_SECRET_ACCESS_KEY = '################' 
AWS_S3_HOST = 's3-us-east-2.amazonaws.com' 

#AWS_SECRET_ACCESS_KEY = env['AWS_SECRET_ACCESS_KEY'] 
#AWS_ACCESS_KEY_ID = env['AWS_ACCESS_KEY_ID'] 
AWS_STORAGE_BUCKET_NAME = 'owen-tribune' 

AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME 

STATICFILES_LOCATION = 'static' 
STATICFILES_STORAGE = 'owen.custom_storages.StaticStorage' 
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION) 

MEDIAFILES_LOCATION = 'media' 
MEDIA_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION) 
DEFAULT_FILE_STORAGE = 'custom_storages.MediaStorage' 

カスタムストレージ:

# custom_storages.py 
from django.conf import settings 
from storages.backends.s3boto import S3BotoStorage 

class StaticStorage(S3BotoStorage): 
    location = settings.STATICFILES_LOCATION 

class MediaStorage(S3BotoStorage): 
    location = settings.MEDIAFILES_LOCATION 

答えて

0

静的ファイルの問題を解決するには、によるものでした圧縮機。

STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage' 

COMPRESS_OFFLINE = True 
COMPRESS_CSS_FILTERS = [ 
    'compressor.filters.css_default.CssAbsoluteFilter', 
    'compressor.filters.cssmin.CSSMinFilter', 
] 
COMPRESS_CSS_HASHING_METHOD = 'content' 

デバッグがFalseだったときにこれはのみ従事していた、私は静的ファイルがデバッグ=真で正しく務めなった理由である:私は私の生産の設定で次のコードを持っていました。デバッグをオフにすると、圧縮された静的ファイルはS3バケットではなくアプリ内に保存されていましたが、アプリはまだS3で圧縮された静的ファイルを探していました。私は設定でこれらの行をコメントアウトするだけでこの問題を解決しました。

メディアファイルも正しくアップロードされますが、自動生成されたサイズ変更はまだ機能していません。それについての別の質問を投稿し、解決策があればここで更新します。

関連する問題