事前署名 URL の作成
IBM Cloud® Object Storage の事前署名 URL は、アクセス時に追加のユーザー資格情報を必要とせずにオブジェクトを共有するために使用できる一時リンクを作成します。
もちろん、認証のための追加情報を提供することなく、 PUT 要求を送信するための一時ターゲットを提供する こともできます。 事前署名 URL を作成する最も簡単な方法は、 AWS CLI を使用することです。 ただし、最初に aws configure
を実行して、独自の HMAC 対応サービス資格情報 からアクセス・キー ID と秘密アクセス・キーを設定する必要がある場合があります。 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)