사전 서명 URL로 객체 업로드하기
사전 서명 URL로 객체 업로드하기
사전 서명 URL을 사용해 다른 사람이 여러분의 Amazon S3 버킷에 객체를 업로드하도록 허용할 수 있어요. 사전 서명 URL을 사용하면 상대방이 AWS 보안 자격 증명이나 권한을 가지지 않아도 업로드할 수 있어요. 사전 서명 URL은 그것을 만든 사용자의 권한에 의해 제한돼요. 즉, 객체를 업로드하는 사전 서명 URL을 받았다면, URL을 만든 사람이 그 객체를 업로드할 필요한 권한을 가질 때만 객체를 업로드할 수 있어요.
누군가 그 URL로 객체를 업로드하면 Amazon S3는 지정된 버킷에 그 객체를 만들어요. 사전 서명 URL에 지정된 것과 같은 키를 가진 객체가 이미 버킷에 존재한다면 Amazon S3는 기존 객체를 업로드된 객체로 대체해요. 업로드 후에는 버킷 소유자가 그 객체를 소유하게 돼요.
사전 서명 URL에 대한 일반 정보는 사전 서명 URL로 객체 다운로드·업로드하기를 참고하세요.
코드를 작성하지 않고 객체 업로드용 사전 서명 URL을 AWS Explorer for Visual Studio로 만들 수 있어요. AWS SDK로 프로그래밍 방식으로 사전 서명 URL을 생성할 수도 있어요.
참고
현재 AWS Toolkit for Visual Studio는 Visual Studio for Mac을 지원하지 않아요.
- _AWS Toolkit for Visual Studio User Guide_의 Toolkit for Visual Studio 설치·설정 지침에 따라 AWS Toolkit for Visual Studio를 설치합니다.
- _AWS Toolkit for Visual Studio User Guide_의 AWS에 연결 단계에 따라 AWS에 연결합니다.
- AWS Explorer로 표시된 왼쪽 패널에서 객체를 업로드할 버킷의 컨텍스트 메뉴를 엽니다.
- **Create Pre-Signed URL...**을 선택합니다.
- 팝업 창에서 사전 서명 URL의 만료 날짜와 시각을 설정합니다.
- Object Key에 업로드할 파일의 이름을 설정합니다. 업로드하는 파일은 이 이름과 정확히 일치해야 합니다. 같은 객체 키를 가진 객체가 이미 버킷에 있다면 Amazon S3는 기존 객체를 새로 업로드된 객체로 대체합니다.
- 이 사전 서명 URL이 객체 업로드에 사용될 것임을 지정하려면 PUT을 선택합니다.
- Generate 버튼을 선택합니다.
- URL을 클립보드에 복사하려면 Copy를 선택합니다.
- 이 URL을 사용하려면
curl명령으로 PUT 요청을 보낼 수 있습니다. 파일의 전체 경로와 사전 서명 URL 자체를 포함하세요.
curl -X PUT -T "/path/to/file" "presigned URL"
제한된 시간 동안 S3 작업을 수행할 수 있는 사전 서명 URL을 생성할 수 있어요.
참고
AWS CLI 또는 AWS SDK를 사용하면 사전 서명 URL의 만료 시간을 최대 7일까지 설정할 수 있어요. 자세한 내용은 사전 서명 URL의 만료 시간을 참고하세요.
출처: 문서
본문
Python
다음 Python 스크립트는 S3 일반 용도 버킷에 객체를 업로드하기 위한 PUT 사전 서명 URL을 생성해요.
- 스크립트 내용을 복사해 "
put-only-url.py" 파일로 저장합니다. 다음 예시를 사용하려면user input placeholders를 여러분의 정보(예: 파일 이름)로 바꾸세요.
import argparse
import boto3
from botocore.exceptions import ClientError
def generate_presigned_url(s3_client, client_method, method_parameters, expires_in):
"""
Generate a presigned Amazon S3 URL that can be used to perform an action.
:param s3_client: A Boto3 Amazon S3 client.
:param client_method: The name of the client method that the URL performs.
:param method_parameters: The parameters of the specified client method.
:param expires_in: The number of seconds the presigned URL is valid for.
:return: The presigned URL.
"""
try:
url = s3_client.generate_presigned_url(
ClientMethod=client_method,
Params=method_parameters,
ExpiresIn=expires_in
)
except ClientError:
print(f"Couldn't get a presigned URL for client method '{client_method}'.")
raise
return url
def main():
parser = argparse.ArgumentParser()
parser.add_argument("bucket", help="The name of the bucket.")
parser.add_argument(
"key", help="The key (path and filename) in the S3 bucket.",
)
parser.add_argument(
"--region", help="The AWS region where the bucket is located.", default="us-east-1"
)
parser.add_argument(
"--content-type", help="The content type of the file to upload.", default="application/octet-stream"
)
args = parser.parse_args()
# Create S3 client with explicit region configuration
s3_client = boto3.client("s3", region_name=args.region)
# Optionally set signature version if needed for older S3 regions
# s3_client.meta.config.signature_version = 's3v4'
# The presigned URL is specified to expire in 1000 seconds
url = generate_presigned_url(
s3_client,
"put_object",
{
"Bucket": args.bucket,
"Key": args.key,
"ContentType": args.content_type # Specify content type
},
1000
)
print(f"Generated PUT presigned URL: {url}")
if __name__ == "__main__":
main()
- 파일 업로드용
PUT사전 서명 URL을 생성하려면 버킷 이름과 원하는 객체 경로로 다음 스크립트를 실행합니다.
다음 명령은 예시 값을 사용해요. user input placeholders를 여러분의 정보로 바꾸세요.
python put-only-url.py amzn-s3-demo-bucket <object-path> --region us-east-1 --content-type application/octet-stream
스크립트는 PUT 사전 서명 URL을 출력해요.
Generated PUT presigned URL: https://amzn-s3-demo-bucket.s3.amazonaws.com/object.txt?AWSAccessKeyId=AKIAIO...MPLE&Signature=vjbyNxybdZaMmLa%2ByT372YEAiv4%3D&Expires=1741978496
- 이제 생성된 사전 서명 URL을 curl로 파일을 업로드할 수 있습니다. URL을 생성할 때 사용한 것과 같은 콘텐츠 유형을 포함해야 합니다.
curl -X PUT -T "path/to/your/local/file" -H "Content-Type: application/octet-stream" "generated-presigned-url"
URL을 생성할 때 다른 콘텐츠 유형을 지정했다면, curl 명령에서도 같은 콘텐츠 유형을 사용해야 합니다.
AWS SDK로 객체 업로드용 사전 서명 URL을 생성하는 더 많은 예시는 AWS SDK로 Amazon S3용 사전 서명 URL 만들기를 참고하세요.
SignatureDoesNotMatch 오류 문제 해결
사전 서명 URL을 사용할 때 SignatureDoesNotMatch 오류가 발생하면 다음을 확인하세요.
- 시스템 시계가 신뢰할 수 있는 시간 서버와 동기화되었는지 확인하세요
- 수정 없이 생성된 그대로의 URL을 정확히 사용하고 있는지 확인하세요
- URL이 만료되었는지 확인하고 필요한 경우 새 URL을 생성하세요
- 업로드 요청의 콘텐츠 유형이 URL을 생성할 때 지정한 콘텐츠 유형과 일치하는지 확인하세요
- 버킷에 대해 올바른 리전을 사용하고 있는지 확인하세요
- curl을 사용할 때 특수 문자를 올바르게 처리하도록 URL을 따옴표로 감싸세요