업로드를 위해 S3 호환 객체 저장소 제공자 구성하기

Cloudflare의 R2가 마침내 공개적으로 사용 가능해졌습니다(대략 1년이 걸렸다고 하네요). (원래 발표 링크: Announcing Cloudflare R2 Storage: Rapid and Reliable Object Storage, minus the egress fees | Cloudflare Blog)

저는 버킷을 생성했습니다.

다음과 같은 권한을 포함하는 토큰을 생성했습니다: “Edit: 모든 객체에 대한 편집 액세스 허용 및 모든 버킷에 대한 List, Write, Delete 작업 허용”

다음과 같은 설정을 시도해 보았습니다:

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: auto
  DISCOURSE_S3_ACCESS_KEY_ID: redacted
  DISCOURSE_S3_SECRET_ACCESS_KEY: redacted
  DISCOURSE_S3_CDN_URL: https://pub-72eaa03782c542edbe00598fd1666be1.r2.dev
  DISCOURSE_S3_BUCKET: lc-testing
  DISCOURSE_S3_BACKUP_BUCKET: lc-testing/backups
  DISCOURSE_BACKUP_LOCATION: s3
  DISCOURSE_S3_ENDPOINT: https://cb46accbfcc3db1bdbba2bce07f8b509.r2.cloudflarestorage.com
  DISCOURSE_S3_INSTALL_CORS_RULE: false
  DISCOURSE_S3_CONFIGURE_TOMBSTONE_POLICY: false
  FORCE_S3_UPLOADS: 1

그러나 업로드 시 다음 오류가 발생했습니다:

Aws::S3::Errors::NotImplemented: Header 'x-amz-acl' with value 'public-read' not implemented

그 후, Public buckets · Cloudflare R2 docs 설명된 대로 버킷을 공개로 설정해야 한다는 것을 기억해냈습니다.

하지만 여전히 작동하지 않았습니다.

https://developers.cloudflare.com/r2/data-access/s3-api/api/에서 x-amz-acl이 구현되지 않았음을 확인할 수 있습니다.

Discourse 코드를 살펴보니, 코어 변경 없이 R2를 작동시킬 수 있는지 명확하지 않습니다.

업로드를 비활성화한 후에도 백업은 작동하므로, R2는 S3 백업을 매우 저렴하게 사용할 수 있는 방법인 것으로 보입니다. 하지만 해당 버킷을 공개로 설정했기 때문에 백업 파일도 공개되었습니다(파일 이름을 추측할 수 있다면). 따라서 이 문제가 해결된다면 백업과 업로드를 위한 별도의 버킷을 사용해야 할 것입니다.

다음 링크의 줄을 제거한 후 파일이 업로드되었음을 확인했고, s3_cdn_url로 커스텀 도메인을 사용하여 파일에 액세스할 수 있었습니다. (s3 rake task에 유사한 수정을 적용하면 에셋이 업로드되도록 할 수 있습니다.)

5개의 좋아요