Elastic Computing Service (ECS) インスタンスで Web ページを構築する際に、プライベートイメージファイルを参照する必要がある場合があります。ソフトウェア開発キット (SDK) または ossutil を使用して、有効期間の長い署名付き URL を生成できます。これにより、特定の期間、これらのファイルにアクセスできます。イメージの不正使用を防ぐために、イメージを保存するバケットに Referer ホワイトリストを設定して、ホットリンク保護を設定できます。
ステップ 1: 署名付き URL の生成
セキュリティ上の理由から、OSS コンソールでの URL のデフォルトの有効期間は 3,600 秒です。最大有効期間は 32,400 秒です。32,400 秒を超える有効期間を持つファイル URL が必要な場合は、ossutil コマンドラインインターフェイス (CLI) または OSS SDK を使用できます。
次の例は、examplebucket バケット内の exampleobject.png ファイルのファイル URL を生成する方法を示しています。署名付き URL は 30 日間有効です。
ossutil 1.0 の使用
ossutil sign oss://examplebucket/exampleobject.png --timeout 2592000次のサンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
Alibaba Cloud SDK の使用
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import java.net.URL;
import java.util.Date;
import com.aliyun.oss.common.comm.SignVersion;
public class Demo {
public static void main(String[] args) throws Throwable {
// 中国 (杭州) リージョンを例として使用します。Endpoint を実際のリージョンに設定します。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Endpoint に対応するリージョンを設定します。例: cn-hangzhou。
String region = "cn-hangzhou";
// プロジェクトコードにアクセス資格情報を保存しないことを強く推奨します。これにより、資格情報が漏洩し、アカウント内のすべてのリソースのセキュリティが損なわれる可能性があります。この例では、環境変数からアクセス資格情報を取得する方法を示します。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケット名を指定します。例: examplebucket。
String bucketName = "examplebucket";
// オブジェクトの完全なパスを指定します。例: exampleobject.png。完全なパスにバケット名を含めることはできません。
String objectName = "exampleobject.png";
// OSSClient インスタンスを作成します。
// OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// V4 署名アルゴリズムの使用を明示的に宣言します。
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 署名付き URL の有効期限を秒単位で設定します。この例では、有効期限を 30 日に設定します。ビジネスニーズに基づいて、適切な有効期限を設定してください。
// 現在の時刻をミリ秒単位で取得します。
long currentTimeMillis = System.currentTimeMillis();
// 今から 30 日後の時刻を秒単位で計算します。
long expirationSeconds = currentTimeMillis/ 1000 + 7 * 24 * 3600;
// Date コンストラクターのために秒をミリ秒に変換し直します。
Date expiration = new Date(expirationSeconds * 1000);
// GET リクエスト用の署名付き URL を生成します。訪問者は、署名付き URL の有効期間内にブラウザを使用してコンテンツに直接アクセスできます。
URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
System.out.println(url);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}<?php
if (is_file(__DIR__ . '/../autoload.php')) {
require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
require_once __DIR__ . '/../vendor/autoload.php';
}
use OSS\OssClient;
use OSS\Core\OssException;
use OSS\Http\RequestCore;
use OSS\Http\ResponseCore;
// 環境変数からアクセス資格情報を取得します。
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
// yourEndpoint を、バケットが配置されているリージョンの Endpoint に設定します。たとえば、中国 (杭州) リージョンの場合、Endpoint を https://oss-cn-hangzhou.aliyuncs.com に設定します。
$endpoint = "yourEndpoint";
// バケット名を指定します。
$bucket= "examplebucket";
// オブジェクトの完全なパスを指定します。バケット名を含めることはできません。
$object = "exampleobject.txt";
// 署名付き URL の有効期限を秒単位で設定します。この例では、有効期限を 30 日に設定します。ビジネスニーズに基づいて、適切な有効期限を設定してください。
$timeout = 2592000;
try {
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false);
// GetObject 用の署名付き URL を生成します。
$signedUrl = $ossClient->signUrl($bucket, $object, $timeout);
} catch (OssException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage() . "\n");
return;
}
print(__FUNCTION__ . ": signedUrl: " . $signedUrl . "\n");
// コードを使用して署名付き URL にアクセスするか、ブラウザのアドレスバーに入力します。
$request = new RequestCore($signedUrl);
// 生成された署名付き URL は、デフォルトで GET メソッドを使用してアクセスされます。
$request->set_method('GET');
$request->add_header('Content-Type', '');
$request->send_request();
$res = new ResponseCore($request->get_response_header(), $request->get_response_body(), $request->get_response_code());
if ($res->isOK()) {
print(__FUNCTION__ . ": OK" . "\n");
} else {
print(__FUNCTION__ . ": FAILED" . "\n");
};# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
import requests
# 環境変数からアクセス資格情報を取得します。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# yourEndpoint を、バケットが配置されているリージョンの Endpoint に設定します。たとえば、中国 (杭州) リージョンの場合、Endpoint を https://oss-cn-hangzhou.aliyuncs.com に設定します。
# バケット名を指定します。例: examplebucket。
bucket = oss2.Bucket(auth, 'yourEndpoint', 'examplebucket')
# オブジェクトの完全なパスを指定します。例: exampledir/exampleobject.txt。完全なパスにバケット名を含めることはできません。
object_name = 'exampledir/exampleobject.txt'
# 署名付き URL の有効期限を秒単位で設定します。この例では、有効期限を 30 日に設定します。ビジネスニーズに基づいて、適切な有効期限を設定してください。
# 署名付き URL を生成するとき、OSS はデフォルトでオブジェクトの完全なパス内のスラッシュ (/) をエスケープします。これにより、生成された署名付き URL は使用できなくなります。
# slash_safe を True に設定します。OSS はオブジェクトの完全なパス内のスラッシュ (/) をエスケープしません。生成された署名付き URL は直接使用できます。
url = bucket.sign_url('GET', object_name, 2592000, slash_safe=True)
print('The signed URL is: ', url)
# 署名付き URL を使用して、オブジェクトをローカルデバイスにダウンロードします。
# ローカルファイルの完全なパスを指定します。例: D:\\localpath\\examplefile.txt。
# ローカルパスを指定せず、ローカルファイル名 (例: examplefile.txt) のみを提供した場合、ダウンロードされたファイルはサンプルプログラムが存在するプロジェクトのローカルパスに保存されます。
result = bucket.get_object_with_url_to_file(url, 'D:\\localpath\\examplefile.txt')package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 環境変数からアクセス資格情報を取得します。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// OSSClient インスタンスを作成します。
// yourEndpoint をバケットの Endpoint に設定します。たとえば、中国 (杭州) リージョンの場合、Endpoint を https://oss-cn-hangzhou.aliyuncs.com に設定します。Endpoint を実際のリージョンに設定します。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// バケット名を指定します。例: examplebucket。
bucketName := "examplebucket"
// ファイルの完全なパスを指定します。例: exampledir/exampleobject.txt。完全なパスにバケット名を含めることはできません。
objectName := "exampledir/exampleobject.txt"
// OSS オブジェクトをローカルファイルにダウンロードし、指定されたローカルパスに保存します。指定されたローカルファイルが存在する場合は上書きされ、存在しない場合は作成されます。
// ローカルパスを指定しない場合、ダウンロードされたファイルはデフォルトでサンプルプログラムが存在するプロジェクトのローカルパスに保存されます。
localDownloadedFilename := "D:\\localpath\\examplefile.txt"
// バケットを取得します。
bucket, err := client.Bucket(bucketName)
if err != nil {
HandleError(err)
}
// 署名付き URL の有効期限を秒単位で設定します。この例では、有効期限を 30 日に設定します。ビジネスニーズに基づいて、適切な有効期限を設定してください。
signedURL, err := bucket.SignURL(objectName, oss.HTTPGet, 2592000)
if err != nil {
HandleError(err)
}
body, err := bucket.GetObjectWithURL(signedURL)
if err != nil {
HandleError(err)
}
// コンテンツを読み取ります。
data, err := ioutil.ReadAll(body)
body.Close()
data = data // use data.
// 署名付き URL を使用して OSS オブジェクトをローカルファイルにダウンロードします。
err = bucket.GetObjectToFileWithURL(signedURL, localDownloadedFilename)
if err != nil {
HandleError(err)
}
}using Aliyun.OSS;
using Aliyun.OSS.Common;
// Endpoint を、バケットが配置されているリージョンのものに設定します。たとえば、中国 (杭州) リージョンの場合、Endpoint を https://oss-cn-hangzhou.aliyuncs.com に設定します。
var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 環境変数からアクセス資格情報を取得します。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// バケット名を指定します。例: examplebucket。
var bucketName = "examplebucket";
// オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例: exampledir/exampleobject.txt。
var objectName = "exampledir/exampleobject.txt";
// オブジェクトのダウンロード先の完全なパスを指定します。例: D:\\localpath\\examplefile.txt。指定されたローカルファイルが存在する場合は上書きされ、存在しない場合は作成されます。
var downloadFilename = "D:\\localpath\\examplefile.txt";
// OSSClient インスタンスを作成します。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
var metadata = client.GetObjectMetadata(bucketName, objectName);
var etag = metadata.ETag;
// 署名付き URL を生成します。
var req = new GeneratePresignedUriRequest(bucketName, objectName, SignHttpMethod.Get)
{
// 署名付き URL の有効期限を時間単位で設定します。この例では、有効期限を 30 日に設定します。ビジネスニーズに基づいて、適切な有効期限を設定してください。
Expiration = DateTime.Now.AddHours(720),
};
var uri = client.GeneratePresignedUri(req);
// 署名付き URL を使用してファイルをダウンロードします。
OssObject ossObject = client.GetObject(uri);
using (var file = File.Open(downloadFilename, FileMode.OpenOrCreate))
{
using (Stream stream = ossObject.Content)
{
int length;
int bufLength = 4 * 1024;
var buf = new byte[bufLength];
do
{
length = stream.Read(buf, 0, bufLength);
file.Write(buf, 0, length);
} while (length != 0);
}
}
Console.WriteLine("Get object by signatrue succeeded. {0} ", uri.ToString());
}
catch (OssException ex)
{
Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* OSS アカウント情報を初期化します。*/
/* yourEndpoint を、バケットが配置されているリージョンの Endpoint に設定します。たとえば、中国 (杭州) リージョンの場合、Endpoint を https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
std::string Endpoint = "yourEndpoint";
/* バケット名を指定します。例: examplebucket。*/
std::string BucketName = "examplebucket";
/* オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例: exampledir/exampleobject.txt。*/
std::string GetobjectUrlName = "exampledir/exampleobject.txt";
/* ネットワークリソースを初期化します。*/
InitializeSdk();
ClientConfiguration conf;
/* 環境変数からアクセス資格情報を取得します。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
/* 署名付き URL の有効期限を秒単位で設定します。この例では、有効期限を 30 日に設定します。ビジネスニーズに基づいて、適切な有効期限を設定してください。*/
std::time_t t = std::time(nullptr) + 2592000;
/* 署名付き URL を生成します。*/
auto genOutcome = client.GeneratePresignedUrl(BucketName, GetobjectUrlName, t, Http::Get);
if (genOutcome.isSuccess()) {
std::cout << "GeneratePresignedUrl success, Gen url:" << genOutcome.result().c_str() << std::endl;
}
else {
/* 例外を処理します。*/
std::cout << "GeneratePresignedUrl fail" <<
",code:" << genOutcome.error().Code() <<
",message:" << genOutcome.error().Message() <<
",requestId:" << genOutcome.error().RequestId() << std::endl;
ShutdownSdk();
return -1;
}
/* 署名付き URL を使用してファイルをダウンロードします。*/
auto outcome = client.GetObjectByUrl(genOutcome.result());
if (!outcome.isSuccess()) {
/* 例外を処理します。*/
std::cout << "GetObjectByUrl fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
ShutdownSdk();
return -1;
}
/* ネットワークリソースを解放します。*/
ShutdownSdk();
return 0;
}ステップ 2: ホットリンク保護の設定
OSS では、バケットのホットリンク保護を設定できます。ホワイトリストを設定して、OSS リソースの不正使用を防ぐことができます。
次の手順では、examplebucket バケットのホットリンク保護を設定する方法を示します。アクセスは、http://www.example.com ドメイン名からのリクエストに制限されます。
OSS コンソールにログインします。
[バケット] をクリックし、examplebucket をクリックします。
左側のナビゲーションウィンドウで、[データセキュリティ] > [ホットリンク保護] を選択します。
[ホットリンク保護] ページで、[ホットリンク保護] スイッチをオンにします。
[Referer ホワイトリスト] テキストボックスに、
http://www.example.comと入力します。[空の Referer] セクションで、[空の Referer を許可しない] を選択します。これは、HTTP または HTTPS ヘッダーに Referer フィールドを含むリクエストのみが OSS リソースにアクセスできることを意味します。
[QueryString の切り捨て] セクションで、QueryString を切り捨てるかどうかを選択します。
[許可]: OSS は、Referer を照合するときに、デフォルトで QueryString を切り捨てます。たとえば、Referer が
http://www.example.com/?action=nopに設定されている場合、OSS は QueryString を切り捨て、照合にhttp://www.example.com/を使用します。[不許可]: OSS は、Referer を照合するときに QueryString を切り捨てません。たとえば、Referer が
http://www.example.com/?action=nopに設定されている場合、OSS は照合にhttp://www.example.com/?action=nopを使用します。詳細については、「QueryString の解析ルール」をご参照ください。
[保存] をクリックします。
詳細については、「ホットリンク保護」をご参照ください。