상당히 트래픽이 많은 사이트에서 업로드를 S3로 이동하려고 하고 있습니다. rake uploads:migrate_to_s3를 실행할 때를 제외하고는 모든 것이 계획대로 진행되는데, 다음과 같은 오류가 표시됩니다:
Updating the URLs in the database...
Removing old optimized images...
Flagging all posts containing lightboxes for rebake...
2023 posts were flagged for a rebake
rake aborted!
FileStore::ToS3MigrationError: 1 of 9629 uploads are not migrated to S3. S3 migration failed for db 'default'.
/var/www/discourse/lib/file_store/to_s3_migration.rb:132:in `raise_or_log'
/var/www/discourse/lib/file_store/to_s3_migration.rb:79:in `migration_successful?'
/var/www/discourse/lib/file_store/to_s3_migration.rb:373:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:66:in `migrate'
/var/www/discourse/lib/tasks/uploads.rake:123:in `migrate_to_s3'
/var/www/discourse/lib/tasks/uploads.rake:102:in `block in migrate_to_s3_all_sites'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-4.0.0/lib/rails_multisite/connection_management.rb:80:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-4.0.0/lib/rails_multisite/connection_management.rb:90:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:100:in `migrate_to_s3_all_sites'
/var/www/discourse/lib/tasks/uploads.rake:96:in `block in <main>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => uploads:migrate_to_s3
(See full trace by running task with --trace)
특히 이 줄이 제 주의를 끌었습니다. FileStore::ToS3MigrationError: 1 of 9629 uploads are not migrated to S3. S3 migration failed for db 'default'.
이것은 문제 있는 파일 하나가 전체 rake 태스크 실패를 유발하고 있다는 뜻일까요? 문제를 일으키는 파일이 무엇인지 파악하는 방법, 그리고 나머지 태스크가 순조롭게 완료되도록 해당 파일만 제거하는 방법이 있을까요?
일부 업데이트:
사이트가 정상적으로 로딩되는 것으로 보이며, 제가 확인한 바로는 업로드된 이미지가 CDN에서 서빙되고 있습니다.
모든 업로드된 파일의 로컬 복사본은 여전히 서버에 남아 있습니다. 이는 마이그레이션이 실패로 표시되었기 때문인 것으로 추정됩니다.
도움이 될 수 있다면 rake uploads:s3_migration_status 출력을 공유합니다.
# rake uploads:s3_migration_status
1 of 9630 uploads are not migrated to S3. S3 migration failed for db 'default'.
19 posts are not remapped to new S3 upload URL. S3 migration failed for db 'default'.
No posts require rebaking
Site is not ready for migration
Admin > Logs > Error Logs에서 어떤 파일이 실패했는지에 대한 참조를 찾을 수 있습니다.
그것이 도움이 되지 않는다면, 마이그레이션 상태에 언급된 19개의 게시글 목록을 얻으려면 yourdomain/uploads/를 포함하는 cooked 속성이 있는 게시글을 데이터베이스에서 검색하는 것이 좋습니다. 최악의 경우, 해당 게시글을 수동으로 확인하여 업로드된 파일과 S3에 있는 파일을 비교할 수 있습니다.
예를 들어:
rails c
Post.where("cooked like '%discourse.example.com/uploads/%'")
제안해 주신 방법들을 시도해 보았지만, 불행히도 에러 로그에서 관련 정보를 찾지 못했습니다. Failed to optimize image: unknown reason라는 항목은 확인되지만, 그 자체보다 더 많은 정보를 제공하지는 않습니다.
또한 제안해 주신 쿼리도 실행해 보았는데, 여러 게시글이 결과로 나오긴 했지만 실제로 해당 게시글들을 방문해 보면 원박스(Onebox) 미리보기에서 생성된 썸네일들이 다수 포함되어 있었습니다. 해당 썸네일에서 새 탭으로 이미지를 열려고 하면, 이미지들이 CDN에서 로드되는 것으로 보입니다.
19개 게시물 중 18개, 혹은 실패한 업로드가 여러 업로드가 포함된 게시물에 있는 경우 19개 모두에서 그런 것을 볼 것이라고 예상할 것입니다.
더 쉬운 방법은 쿼리 결과에서 모든 파일명(예: f8a2d9381889b8693db2777acac566bd7b134fa5.png)을 추출한 후 S3에서 검색하는 것입니다. 이론적으로는 정확히 하나만 누락되어 있어야 합니다. 파생본은 무시하고, 경로에 /originals/가 포함된 것만 찾으면 됩니다.
조금 번거롭지만, 해당 쿼리가 그 19개 게시물만 선택했다면 오래 걸리지는 않을 것입니다.
성공적으로 업로드하는 데 명확한 해결책이 없다면, 옵션 1이나 3 중 어느 쪽을 선택하는 것이 좋은 방법일 것입니다. 옵션 2는 Discourse에 맡기는 것이 좋으며, 구체적으로는 고아 업로드를 정리하는 작업입니다. 이 작업의 간격은 clean orphan uploads grace period hours 설정으로 제어됩니다.
다만, 파일이 삭제되기 전에 확보해 두는 것이 좋은 아이디어일 수 있습니다. 민감한 데이터가 포함되어 있지 않다면, 마이그레이션 중에 업로드가 되지 않는 이유를 테스트하는 데 유용할 수 있습니다.
파일을 삭제하고 마이그레이션을 완료한 후(실패한 파일을 다운로드한 상태라면) 다시 시도해 볼 수 있는 방법은 게시물을 다시 편집하여 파일을 원래 위치에 되돌려 두는 것입니다. 파일이 S3에 완전히 업로드되지 않는 것인지, 아니면 마이그레이션 작업 중에만 실패하는 것인지 확인하면 흥미로울 것입니다.
SKIP_FAILED=100 rake uploads:migrate_to_s3 명령을 실행해 보았습니다.
=> 0개 파일
S3 파일 나열
… .. => 81,070개 파일
S3로 파일 동기화 중
데이터베이스의 URL 업데이트 중…
기존 최적화 이미지 삭제 중…
라이트박스를 포함하는 모든 게시물을 재처리(rebake)하도록 표시 중…
54,453개의 게시물이 재처리 대상으로 표시되었습니다.
53개의 게시물이 새 S3 업로드 URL로 매핑되지 않았습니다. ‘default’ 데이터베이스의 S3 마이그레이션이 실패했습니다.