이미지 업로드 오류: 버킷에서 ACL이 허용되지 않음

사용자뿐만 아니라 관리자도 더 이상 이미지를 업로드할 수 없습니다.
에러 로그에는 hotlink 오류가 표시됩니다.
4MB 제한이 있지만, 사용자가 문제를 신고한 후 테스트로 800KB 파일을 업로드해 보았습니다.

며칠 전(2.9.0.beta4) 업데이트를 진행했습니다.
최근에 s3 버킷을 설정했습니다.

15일 전 GitHub에서 hotlink 관련 최근 수정 사항을 발견했습니다.
GitHub에서 이슈를 생성할 수 없습니다. 여기가 버그를 보고하는 곳인가요?

Message (2 copies reported)

default: Failed to pull hotlinked image (https://jackrail.space/images/discourse-logo-sketch-small.png) post: 586
The bucket does not allow ACLs
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.121.2/lib/seahorse/client/plugins/raise_response_errors.rb:17:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-s3-1.96.1/lib/aws-sdk-s3/plugins/sse_cpk.rb:24:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-s3-1.96.1/lib/aws-sdk-s3/plugins/dualstack.rb:36:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-s3-1.96.1/lib/aws-sdk-s3/plugins/accelerate.rb:50:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.121.2/lib/aws-sdk-core/plugins/jsonvalue_converter.rb:22:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.121.2/lib/aws-sdk-core/plugins/idempotency_token.rb:19:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.121.2/lib/aws-sdk-core/plugins/param_converter.rb:26:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.121.2/lib/seahorse/client/plugins/request_callback.rb:71:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.121.2/lib/aws-sdk-core/plugins/response_paging.rb:12:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.121.2/lib/seahorse/client/plugins/response_target.rb:24:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.121.2/lib/seahorse/client/request.rb:72:in `send_request'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-s3-1.96.1/lib/aws-sdk-s3/client.rb:11274:in `put_object'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-s3-1.96.1/lib/aws-sdk-s3/object.rb:1329:in `put'
/var/www/discourse/lib/s3_helper.rb:74:in `upload'
/var/www/discourse/lib/file_store/s3_store.rb:116:in `store_file'
/var/www/discourse/lib/file_store/s3_store.rb:30:in `store_upload'
/var/www/discourse/lib/upload_creator.rb:212:in `block (2 levels) in cr...

Backtrace

/var/www/discourse/app/jobs/regular/pull_hotlinked_images.rb:243:in `public_send'
/var/www/discourse/app/jobs/regular/pull_hotlinked_images.rb:243:in `log'
/var/www/discourse/app/jobs/regular/pull_hotlinked_images.rb:58:in `rescue in block in execute'
/var/www/discourse/app/jobs/regular/pull_hotlinked_images.rb:35:in `block in execute'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/nokogiri-1.13.4-x86_64-linux/lib/nokogiri/xml/node_set.rb:234:in `block in each'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/nokogiri-1.13.4-x86_64-linux/lib/nokogiri/xml/node_set.rb:233:in `upto'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/nokogiri-1.13.4-x86_64-linux/lib/nokogiri/xml/node_set.rb:233:in `each'
/var/www/discourse/app/jobs/regular/pull_hotlinked_images.rb:34:in `execute'
/var/www/discourse/app/jobs/base.rb:232:in `block (2 levels) in perform'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-4.0.1/lib/rails_multisite/connection_management.rb:80:in `with_connection'

고쳤다고 생각은 하지만, 이 기능이 정확히 어떤 역할을 하는지, 아니면 내 S3 백업을 비활성화하는 건지 확실하지 않아요.
“S3 업로드 활성화”
이게 백업 절차의 일부인 줄 알고 활성화해 두었거든요.
이걸 비활성화했는데, 이제 테스트 이미지를 업로드할 때 이 오류가 더 이상 뜨지 않아요.

해당 설정은 업로드를 S3 버킷에 저장하도록 하며, 일반적인 업로드와 별도로 처리됩니다. 해당 버킷이 업로드를 위해 제대로 구성되지 않은 것으로 보입니다(자세한 내용은 업로드용 오브젝트 스토리지 사용 (S3 & Clones)을 참고하세요).

여전히 백업이 정상적으로 작동하는지 확인해야 합니다.

추측컨대 그게 문제였나 봅니다. 불만을 제기한 사용자에게 수정된 것으로 확인받았습니다.

이 이미지 업로드 기능이 정확히 무엇을 하는지 확신은 없지만, 복잡한 서버가 필요로 할 수 있는 추가 기능인 것 같습니다. 우리처럼 40명 규모의 사용자는 이런 복잡한 기능이 있는 discourse가 필요 없을 것 같습니다. 우리는 이모지 좋아요 기능이 더 관심이 있습니다.

하지만 S3 설정 지침을 따라 진행할 때, 원래 업로드용으로 만든 버킷과는 별도로 "backups"용 새 버킷을 만들어야 했습니다(설정 항목이 표시된 순서대로 진행했기 때문입니다). 다른 사람들이 더 쉽게 따라 할 수 있도록 S3 지침에 대한 답변으로 추가 정보를 제공하여 이 부분을 더 명확히 하려고 합니다. 또한 해당 도움말 스레드에 나열된 권한 정책은 존재하지 않았고, 결국 다른 웹사이트에서 “*” 솔루션을 찾아 사용했습니다. 그 스레드에서도 이 부분을 명확히 하도록 노력하겠습니다. 결국 작동은 했지만, 지침에 대한 수정과 조정이 필요했습니다.

다음 동작은 작동하지 않았습니다. 대신 *를 사용했습니다.

"Action": [
           "s3:ListAllMyBuckets",
           "s3:HeadBucket"
       ],

설정과 지침을 따르는데 참고한 스레드는 여기에 있습니다.

그곳에도 S3 업로드 활성화가 체크되어 있습니다. 일반 사용자에게 너무 복잡하게 만드는 것 같습니다.
반면, 제 백업은 이 기능이 비활성화된 상태에서도 정상적으로 작동하기를 바랍니다.

왜 *를 사용했나요?

구글링하다가 어딘가에서 찾아서, 그냥 코드를 받아들이게 하려고 그랬어요. 제가 인용한 제 게시글을 보시면 링크를 제공해 두었거든요. 대부분 그냥 구글에서 찾아서 복사해서 붙여넣기만 해요. :slight_smile:
하지만 나중에 보니 백업을 작동시키려면 이미지 업로드가 필요하지 않더라고요. 왜 그렇게 해야 하는지는 여전히 모르겠어요. 정말 필요한 건 백업뿐이에요. 두 개의 버킷은 필요 없어요. 설정에서 그 부분을 해제했는데, 여전히 업로드 오류가 있었고 사용자들은 이미지를 사용할 수 없었거든요. 그 항목을 해제하니 문제가 해결됐어요. 저희는 작은 서버 그룹이라 오랫동안 문제없이 사용할 수 있을 거예요.