최신 베타 버전을 사용 중이며, 업로드된 파일을 관리하기 위해 S3를 활성화했습니다.
게시물 내 업로드는 정상적으로 작동합니다(파일이 S3에 업로드되고 게시물에 표시됨), 하지만 이제 프로필 사진을 업로드하려고 하면 UI에서 “Access Denied” 오류가 발생합니다. 관리자 오류 로그에는 아무것도 기록되어 있지 않습니다.
초기 사용자 중 일부는 아바타 이미지를 업로드하는 데 성공한 것 같지만, 이 이미지들은 로컬에 저장되어 있습니다. 예를 들어 소스를 보면 다음과 같습니다:
<img alt="" width="45" height="45" src="/user_avatar/example.com/jackie/90/29_2.png" class="avatar" title="image title" aria-label="Imagery/FIT">
프로필 이미지를 S3로 마이그레이션하고, 새 이미지가 S3에 업로드되도록 보장하는 방법이 있을까요?
수정: 보안 미디어 업로드를 활성화해 두었다는 점을 언급해야 했습니다.
1개의 좋아요
혹시 Cloudflare를 사용하고 계신가요? 프로필 이미지는 실제로 S3에 저장되어 있지만, 서버를 통해 프록시된다고 생각합니다. 비슷한 문제(업로드된 모든 아바타가 빈 화면으로 표시되는 문제)를 해결한 적이 있는데, Cloudflare에서 서버 IP 주소를 화이트리스트에 추가해야 해결되었습니다.
1개의 좋아요
감사합니다 - 하지만 아니요, CDN을 사용하지 않습니다. 보안 미디어를 사용하는 순수 S3만 사용하고 있습니다. 요청이 프록시를 거치는지 확인하는 방법을 모르겠는데, 아래는 curl 헤더 출력입니다:
이것을 보면 프록시를 거치지 않는 것 같지만, 확신할 만큼은 알지 못합니다…
curl -I https://example.com/user_avatar/discourse.psy.plymouth.ac.uk/jackie/90/29_2.png
HTTP/2 200
server: nginx
date: Thu, 09 Sep 2021 11:26:33 GMT
content-type: image/jpeg
content-length: 4068
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-download-options: noopen
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
x-discourse-route: user_avatars/show
last-modified: Thu, 09 Sep 2021 09:38:05 GMT
content-transfer-encoding: binary
cache-control: max-age=31556952, public, immutable
1개의 좋아요
해당 URL 구조는 프록시된 아바타와 일치하는데, 이는 혼란을 야기합니다(메타에서 아바타 URL 구현 방식은 표준 Discourse 인스턴스와 다릅니다). curl 출력만으로는 Discourse가 아바타를 프록시하는 것을 배제할 수 있는 정보가 있는지 확신하기 어렵습니다(전문가는 아니므로).
과거 경험을 바탕으로 볼 때, 게시물의 이미지가 S3에 업로드되는 경우 아바타도 마찬가지로 S3에 업로드됩니다. 매우 커스텀한 설정을 하지 않는 한 말입니다. 보안 미디어 업로드를 사용해 본 적도 없고, CDN 없이 S3를 사용한 적도 없어서, 이러한 설정들이 상당한 차이를 만들 수 있을 것 같습니다.
새로운 아바타를 업로드한 후, 해당 파일이 로컬 저장소인지 S3 버킷에 있는지 확인해 보는 것이 좋습니다.
추측컨대, 서버 IP가 S3에 화이트리스트로 등록되어야 하는 문제일 것 같습니다. 다만 전문가가 아니므로, 다른 분이 답변해 주시면 좋겠습니다.
1개의 좋아요
문제는 s3 업로드가 게시물에는 작동하지만 아바타 이미지 업로드에는 작동하지 않는다는 점입니다. 제 추측으로는 아바타가 있는 사용자들은 s3가 설정되기 전에 이미지를 업로드한 사람들뿐일 것 같지만, 확인은 할 수 없습니다.
1개의 좋아요
이 정보가 도움이 될 수 있습니다: How are avatars stored and accessed? - #5 by DanielMarquard
저도 비슷한 문제를 겪었습니다. 게시글 이미지는 정상적으로 표시되었지만, 프로필 이미지는 표시되지 않았습니다. 두 경우 모두 S3에 업로드가 성공적으로 이루어졌지만, 표시하는 과정에서 문제가 발생했습니다(서버 IP가 속도 제한 또는 차단됨).
2개의 좋아요
아바타를 업로드하려고 하면 진행률이 업데이트되어 100%까지 올라간 후, 그때서야 "Error: Access Denied"라는 메시지가 표시되는 것을 확인했습니다.
js 콘솔을 확인해 보면 다음과 같은 오류가 발생합니다:
https://discourse.psy.plymouth.ac.uk/uploads.json?client_id=0a2569993a6b43d6b5f8c60fdd2c913e
Failed to load resource: the server responded with a status of 422 ()
그 URL을 직접 따라가 보면:
{"errors":["The requested URL or resource could not be found."],"error_type":"not_found"}
S3 버킷을 확인해 보았지만, ‘Originals’ 폴더에는 아무것도 저장되지 않았습니다.
반면, 게시물에 이미지를 업로드하는 경우에는 모든 것이 정상적으로 작동하며, 이미지가 S3 버킷에 나타나고 썸네일 생성 및 최적화도 이루어집니다.
1개의 좋아요
HTTP 상태 코드 422은Apparently '처리할 수 없는 엔티티(Unprocessable Entity)'를 의미합니다. 이는 Discourse가 업로드를 어떤 이유로든 받아들이지 못하고 있음을 시사하지만, 다른 원인일 수도 있습니다. 422는 기본적으로 "요청 형식은 올바르지만 요청 내용 중 잘못된 부분이 있다"는 뜻에 가깝다고 생각합니다.
업로드하려는 이미지가 특이한 이미지 형식이거나, 혹은 매우 큰 이미지일까요?
해당 이미지 파일을 게시물에 직접 포함시켜 보셨나요?
아바타는(기본적으로) 다양한 크기로 리사이즈되므로, 이미지가 매우 크면 메모리 한도에 도달하는 등 그 과정에서 실패할 수 있습니다. 다만 이는 대부분 추측에 불과합니다.
S3에서 422 오류가 발생한다고 생각되지 않으며, S3 API 참고 문서의 오류 응답 목록에도 해당 코드가 나와 있지 않으므로, S3에 업로드를 시도하기 전에 Discourse 내부에서 문제가 발생하고 있다고 생각합니다.
1개의 좋아요
확실히 아바타 이미지 처리와 관련이 있는 것 같습니다. 방금 같은 이미지로 다시 시도해 봤는데(이번에는 iOS 모바일 클라이언트를 사용했습니다), 게시물 내에서 업로드는 정상적으로 이루어지지만, 같은 이미지를 아바타로 사용할 때는 동일한 액세스 거부 오류가 발생합니다.
S3와 보안 미디어를 사용하는 다른 분들도 이 오류를 재현해 보셨나요? 게시물 업로드는 정상적으로 작동하므로, 버킷 권한과 관련이 있을 수 있을까요?
1개의 좋아요