사전 서명 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을 지원하지 않아요.

  1. _AWS Toolkit for Visual Studio User Guide_의 Toolkit for Visual Studio 설치·설정 지침에 따라 AWS Toolkit for Visual Studio를 설치합니다.
  2. _AWS Toolkit for Visual Studio User Guide_의 AWS에 연결 단계에 따라 AWS에 연결합니다.
  3. AWS Explorer로 표시된 왼쪽 패널에서 객체를 업로드할 버킷의 컨텍스트 메뉴를 엽니다.
  4. **Create Pre-Signed URL...**을 선택합니다.
  5. 팝업 창에서 사전 서명 URL의 만료 날짜와 시각을 설정합니다.
  6. Object Key에 업로드할 파일의 이름을 설정합니다. 업로드하는 파일은 이 이름과 정확히 일치해야 합니다. 같은 객체 키를 가진 객체가 이미 버킷에 있다면 Amazon S3는 기존 객체를 새로 업로드된 객체로 대체합니다.
  7. 이 사전 서명 URL이 객체 업로드에 사용될 것임을 지정하려면 PUT을 선택합니다.
  8. Generate 버튼을 선택합니다.
  9. URL을 클립보드에 복사하려면 Copy를 선택합니다.
  10. 이 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을 생성해요.

  1. 스크립트 내용을 복사해 "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()
  1. 파일 업로드용 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
  1. 이제 생성된 사전 서명 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을 따옴표로 감싸세요

더 알아보기 (Learn more)