<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>S3 on 얼쑤 · Team Edo</title><link>https://team-edo.github.io/tags/s3/</link><description>Recent content in S3 on 얼쑤 · Team Edo</description><generator>Hugo</generator><language>ko-kr</language><lastBuildDate>Tue, 03 Nov 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://team-edo.github.io/tags/s3/index.xml" rel="self" type="application/rss+xml"/><item><title>업로드 재시도에서 기존 파일 지키기</title><link>https://team-edo.github.io/posts/2026/11/retry-safe-object-upload-conditional-put/</link><pubDate>Tue, 03 Nov 2026 00:00:00 +0900</pubDate><guid>https://team-edo.github.io/posts/2026/11/retry-safe-object-upload-conditional-put/</guid><description>&lt;p>팀에서 음원 파일이나 폴더를 R2에 올리는 공용 명령을 만들었습니다. 폴더를 올리다 중간에 연결이 끊기면 같은 명령을 다시 실행하고 싶습니다. 그런데 같은 키에 일반 PUT을 보내면, 이미 올라간 파일이 지금 로컬에 있는 내용으로 바뀔 수 있습니다. 기본 실행은 빈 키만 채우고, 기존 파일을 바꿀 때는 교체 옵션을 명시하도록 했습니다.&lt;/p>
&lt;h2 id="쓰기-요청에-빈-키라는-조건을-넣었다">비어 있는 키에만 쓰기&lt;/h2>
&lt;p>먼저 HEAD로 키가 비어 있는지 확인하고 뒤이어 PUT을 보내면, 두 요청 사이에 다른 작업자가 같은 키에 파일을 올릴 수 있습니다. 저는 기본 PUT에 &lt;code>If-None-Match: *&lt;/code>를 넣었습니다. R2는 이 조건을 객체 쓰기와 함께 판단합니다. 키가 이미 있으면 &lt;code>412 PreconditionFailed&lt;/code>가 돌아오고, 도구는 그 파일을 건너뛰었다고 표시한 뒤 다음 파일로 넘어갑니다. &lt;code>--overwrite&lt;/code>를 준 경우에는 이 조건을 붙이지 않습니다. &lt;a href="https://developers.cloudflare.com/r2/api/s3/extensions/#conditional-operations-in-putobject">Cloudflare R2의 조건부 PUT 문서&lt;/a>&lt;/p></description></item><item><title>3바이트 업로드가 175바이트가 된 이유</title><link>https://team-edo.github.io/posts/2026/10/signed-chunk-upload-fixture/</link><pubDate>Wed, 28 Oct 2026 00:00:00 +0900</pubDate><guid>https://team-edo.github.io/posts/2026/10/signed-chunk-upload-fixture/</guid><description>&lt;p>녹음 저장소를 붙이면서 작은 파일 하나를 업로드하는 검사를 만들었습니다. SDK를 대역으로 바꾸면 서비스가 SDK를 호출했는지만 볼 수 있습니다. 실제 SDK가 메서드, 경로, 인증 헤더와 본문을 어떤 모양으로 보내는지 보려고 로컬 HTTP 서버를 저장소 주소로 넣었습니다.&lt;/p>
&lt;p>원본은 &lt;strong>3바이트&lt;/strong>였습니다. 대역 서버가 받은 본문은 &lt;strong>175바이트&lt;/strong>였고, 본문을 그대로 원본과 비교하던 검사가 실패했습니다.&lt;/p>
&lt;h2 id="요청-본문에-파일과-서명이-함께-있었다">전송 본문에 붙은 청크 서명&lt;/h2>
&lt;p>대역이 받은 본문에는 청크 길이와 청크별 서명이 들어 있었습니다. 이 요청의 SDK는 파일 데이터를 &lt;code>aws-chunked&lt;/code> 형식으로 감쌌고, 데이터가 끝나는 지점도 크기 0인 청크로 표시했습니다. 그래서 전송 본문의 길이에는 원본 외에 프레이밍과 서명 정보까지 포함됐습니다. AWS 문서에서 &lt;code>x-amz-decoded-content-length&lt;/code>는 이 메타데이터를 제외한 원본 길이입니다. &lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/developerguide/sigv4-streaming.html">AWS SigV4 청크 업로드 문서&lt;/a>&lt;/p></description></item></channel></rss>