사전 서명된 URL 작성
IBM Cloud® Object Storage 의 사전 서명된 URL은 액세스 시 추가 사용자 신임 정보 없이 오브젝트를 공유하는 데 사용할 수 있는 임시 링크를 작성합니다.
물론 인증에 대한 추가 정보를 제공할 필요 없이 PUT 요청을 전송하기 위한 임시 대상을 제공 할 수도 있습니다. 미리 서명된 URL을 만드는 가장 쉬운 방법은 다음을 사용하는 것입니다.AWS CLI.
그러나 먼저 사용자 고유의 HMAC 사용 서비스 인증 정보 에서 액세스 키 ID및 시크릿 액세스 키를 설정하기 위해 aws configure
를 실행해야 할 수 있습니다. CLI 구성을 완료하면 다음 예제를 템플리트로 사용하고 버킷의 엔드포인트
및 이름을 적절한 정보로 대체하십시오.
$ aws --endpoint-url=https://{endpoint} s3 presign s3://{bucket-name}/{new-file-key}
HMAC 신임 정보를 생성하는 데 사용되는 서비스 신임 정보 (위의 액세스 키 ID및 시크릿 액세스 키 구성으로 사용됨) 가 삭제되면 사전 서명된 URL에 대한 액세스가 실패합니다.
URL의 만기 시간(초)을 설정할 수도 있습니다(기본값은 3600).
$ aws --endpoint-url=https://{endpoint} s3 presign s3://bucket-1/new-file --expires-in 600
이를 프로그래밍 방식으로 생성하는 것도 가능합니다. 다음 내용은 Python으로 작성된 기본 GET
오퍼레이션에 대한 예입니다. 엔드포인트에 대한 자세한 정보는 엔드포인트 및 스토리지 위치를 참조하십시오.
AWS S3와 달리, IBM Cloud Object Storage 은 최대 7일 (604800초) 의 만기 시간을 적용하지 않습니다. 긴 만기 값을 사용하여 사전 서명된 URL을 작성할 수 있지만 확장된 공용 액세스가 필요한 대부분의 유스 케이스는 대신 버킷에서 공용 액세스 정책을 구현 하여 더 나은 서비스를 제공합니다.
객체를 다운로드하려면 미리 서명된 URL을 생성하세요.
Python 예
import ibm_boto3
import os
bucket_name = '<bucekt name>'
key_name = '<object key name>'
http_method = 'get_object'
expiration = 600 # time in seconds, default:600
access_key = os.environ.get('COS_HMAC_ACCESS_KEY_ID')
secret_key = os.environ.get('COS_HMAC_SECRET_ACCESS_KEY')
# Current list avaiable at https://control.cloud-object-storage.cloud.ibm.com/v2/endpoints
cos_service_endpoint = 'https://s3.<region>.cloud-object-storage.appdomain.cloud'
cos = ibm_boto3.client("s3",
aws_access_key_id=access_key,
aws_secret_access_key=secret_key,
endpoint_url=cos_service_endpoint
)
signedUrl = cos.generate_presigned_url(http_method, Params={
'Bucket': bucket_name, 'Key': key_name}, ExpiresIn=expiration)
print("presigned download URL =>" + signedUrl)
Java 예
import java.util.Date;
import com.ibm.cloud.objectstorage.auth.AWSCredentials;
import com.ibm.cloud.objectstorage.auth.AWSStaticCredentialsProvider;
import com.ibm.cloud.objectstorage.client.builder.AwsClientBuilder.EndpointConfiguration;
import com.ibm.cloud.objectstorage.HttpMethod;
import com.ibm.cloud.objectstorage.services.s3.AmazonS3;
import com.ibm.cloud.objectstorage.services.s3.AmazonS3ClientBuilder;
import com.ibm.cloud.objectstorage.services.s3.model.GeneratePresignedUrlRequest;
String bucketName = "<bucket name>";
String keyName = "<object key name>";
HttpMethod httpMethod = HttpMethod.GET;
Date expiration = new Date();
long expTimeMillis = expiration.getTime();
expTimeMillis += 1000 * 60 * 60;
expiration.setTime(expTimeMillis);
String accessKey = "<COS_HMAC_ACCESS_KEY_ID>";
String secretAccessKey = "<COS_HMAC_SECRET_ACCESS_KEY>";
// Current list avaiable at https://control.cloud-object-storage.cloud.ibm.com/v2/endpoints
String cosServiceEndpoint = "https://s3.<region>.cloud-object-storage.appdomain.cloud";
AmazonS3 cosClient = AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(new EndpointConfiguration(cosServiceEndpoint, "us-east-1"))
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretAccessKey))).withPathStyleAccessEnabled(true)
.build();
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, keyName)
.withMethod(httpMethod)
.withExpiration(expiration);
URL signedUrl = cosClient.generatePresignedUrl(generatePresignedUrlRequest);
System.out.println(signedUrl);
객체를 업로드하려면 미리 서명된 URL을 만드세요.
Python 예
import ibm_boto3
import os
bucket_name = '<bucket name>'
key_name = '<object key name>'
http_method = 'put_object'
expiration = 600 # time in seconds, default:600
access_key = os.environ.get('COS_HMAC_ACCESS_KEY_ID')
secret_key = os.environ.get('COS_HMAC_SECRET_ACCESS_KEY')
# Current list avaiable at https://control.cloud-object-storage.cloud.ibm.com/v2/endpoints
cos_service_endpoint = 'https://s3.<region>.cloud-object-storage.appdomain.cloud'
cos = ibm_boto3.client("s3",
aws_access_key_id=access_key,
aws_secret_access_key=secret_key,
endpoint_url=cos_service_endpoint
)
signedUrl = cos.generate_presigned_url(http_method, Params={
'Bucket': bucket_name, 'Key': key_name}, ExpiresIn=expiration)
print("presigned upload URL =>" + signedUrl)