S3 버킷 간 이동

다음 토론을 이어서 진행합니다: How do I move my s3 upload bucket from one provider to another?

GCP 버킷에서 AWS S3 버킷으로 이동을 시도하고 있습니다. 기존 시스템은 S3 CDN을 사용하지 않았습니다(설치를 맡았던 분이 정확히 무엇을 하고 있는지 몰랐던 것 같습니다).

s3cmd를 사용하여 기존 GCP 버킷을 로컬 파일 시스템으로 동기화한 후, 다시 s3cmd를 사용해 에셋을 새로운 S3 버킷으로 업로드했습니다. 현재 시스템은 Using Object Storage for Uploads (S3 & Clones)에 설명된 대로 S3 및 사이트 CDN이 올바르게 구성되어 있습니다.

위에서 링크한 주제에서는 게시글을 업데이트하기 위해 rake posts:remap을 사용하라고 제안했습니다(모든 게시글을 다시 베이킹해야 할까요? 아니면 최소한 기존 버킷에 해당하는 게시글만 처리해야 할까요?).

posts:remap을 실행했을 때 게시글 1개만 리맵핑되었습니다.

 Upload.order(Arel.sql('RANDOM()')).limit(10).pluck(:id, :url)

을 실행해 보니 모두 기존 버킷을 가리키고 있었습니다… 아, 그게 문제였군요. rake posts:remap이 아니라 https://meta.discourse.org/t/change-the-domain-name-or-rename-my-discourse/16098에 설명된 discourse remap이 필요합니다.

네. 저도 그렇게 생각합니다.

조금만 있으면 그 작업을 진행해 보겠습니다. @Falco , 큰 그림으로 보면 다음과 같습니다.

  • 새 버킷과 해당 CDN을 생성하고, 새 버킷/CDN을 사용하도록 컨테이너를 재구축한 후 정상 작동하는지 확인합니다.
  • s3cmd를 기존 버킷에 맞게 설정하고 데이터를 로컬로 동기화합니다.
  • s3cmd를 새 버킷에 맞게 설정하고 데이터를 새 버킷으로 동기화합니다.
  • discourse remap OLD-BUCKET-DOMAIN-NAME NEW-BUCKET-DOMAIN-NAME을 실행합니다.
  • 다시 베이킹(rebake)을 수행합니다.

이런 순서가 맞는 것 같나요?

기존 버킷과 새 버킷에 동일한 CDN을 사용하는 경우 다시 베이킹할 필요가 없을 수 있지만, 그 타이밍을 정확히 맞추기는 다소 까다로워 보입니다(데이터가 새 버킷에 들어가기 전까지는 CDN 오리진을 변경할 수 없지만, 동기화 과정에서 기존 버킷에 아무것도 업로드되지 않도록 어떻게 보장해야 할까요?)–가능하다고만 언급해 두는 것이 좋을 수도 있습니다.

가이드에는 공식 AWS CLI를 사용하는 것이 더 나을까요?

여기서는 DbHelper.remap을 사용하세요.

불필요합니다

동일한 CDN을 사용하여 CDN 패널에서 CDN 소스를 변경하거나, 새로운 CDN을 사용하고 DbHelper.remap으로 리맵하세요. 어느 쪽이든 rebake는 필요하지 않습니다.

아, 알겠습니다. 그 부분을 살펴보겠습니다… AWS CLI를 AWS가 아닌 버킷과 함께 사용할 수 있을까요?

라파엘, 안녕. 거의 다 끝났어. 현재 이 가이드에서 저는 aws cli와 gsutil을 사용해 기존 버킷에서 로컬로, 그리고 로컬에서 새 버킷으로 동기화하도록 안내하고 있어 (해당 도구를 링크하고, 버킷 이름을 플레이스홀더로 채운 커맨드라인 명령만 제공하고 있지). 그다음 DbHelper를 사용해 테이블을 업데이트해. 중간 크기의 사이트인 내 경우 꽤 빠르게 실행돼. 정말 좋아.

지금 겪는 문제는 기존 설정에 s3_cdn_url이 없어서 해당 이미지들이 게시물에서 여전히 버킷(CDN이 아닌)에 직접 링크되어 있다는 거야. Rebaking(재처리)으로는 해결되지 않아. 새로 업로드된 이미지는 CDN에 올바르게 링크되긴 해. DISCOURSE_S3_ENDPOINT: ''를 설정해서 이 문제를 해결할 수는 없어. 아무런 효과가 없거든. 그래서 데이터베이스를 복원한 후 SiteSetting을 지워야 했어. 그 자체로는 큰 문제가 아니지만, 그걸 알아내려면 여러 번 재빌드를 해야 해서 좀 골치 아팠어.

기존 설정에는 S3 CDN이 정의되어 있지 않았어. 버킷 URL/호스트명이 포함된 1250개의 게시물을 모두 rebake하면 이 문제를 해결할 수 있지만, 그러면 해당 이미지들이 모두 다운로드되고 최적화(최적화 작업)가 수행돼 (기존 서버는 2.7.0.beta5를 실행 중이라 최근 재최적화가 이미 일부 완료되어 있을 줄 알았거든). 이 작업으로 내 가엾은 2GB 서버(Postgres와 redis는 RDS와 elasticache 사용)가 꽤 오랫동안 높은 부하(평균 부하 10~20)를 겪어. 어차피 이 사이트에는 더 큰 EC2 인스턴스가 필요할 수도 있지만, 이 rebake 작업이 서버를 완전히 무너뜨리는(UX에서 500 에러 발생) 점은 좀 의외였어.

대신 해당 게시물들의 cooked 필드에서 버킷 호스트명을 CDN URL로 대체하는 방식으로 처리하는 게 나을까?

@pfaffman 여기까지 이끌어 주셔서 감사합니다.
하지만 제 문제는 마지막 2단계에서 더 복잡해졌습니다.

현재 문제: 일부 이미지가 누락되어 해당 위치에 작은 아이콘만 표시됩니다. 마우스를 올렸을 때 ‘olds3bucket’ 주소가 표시되지만, 클릭하면 전체 크기로 정상적으로 표시되며 URL 바에는 ‘news3bucket’ 경로가 표시됩니다.

  1. 주로 기존 버킷의 데이터를 새 버킷으로 동기화하라고 하셨는데, 이는 이미 성공적으로 수행했습니다.
  2. 그 후 Discourse 웹 UI에 새 버킷 설정을 입력해야 하는데, 저는 이미 1년 동안 이를 사용하고 있습니다.
  3. 이제 기존 버킷 URL을 새 버킷으로 'remap’하라고 하시고, 그 후 rebake를 하라고 합니다. 바로 여기에 문제가 있습니다. 이 작업을 수행하면 (또는 ‘remap’ 단계를 먼저 수행하든 하지 않든, 'rebake’를 하거나, 게시글 설정 메뉴에서 'Rebuild Html’을 실행하든), 아이콘만 표시되던 제 이미지들이 완전히 사라집니다. 해당 위치에는 'white-space’만 표시됩니다. 그래서 즉시 되돌리거나 복원합니다.

다시 한번 감사합니다.
(매우 작은 웹사이트를 운영하고 있으며, 마찬가지로…).

rclone은 여러 백엔드로 동기화할 수 있는 좋은 도구입니다. 현재 백업용으로 사용하고 있습니다.

제이 씨,

죄송하지만 이 글을 다시 올립니다. 가이드 작성에 더 진전이 있었나요? 감사합니다!