Storj DCS オブジェクトストレージ

Storj DCS は、Storj DCS S3 ゲートウェイを介して、パブリックおよびプライベート Storj バケットのオリジンとして使用できます。Storj Network 上に構築された Storj DCS は、S3 と互換性のある分散型オブジェク・トストレージ・サービスで、デフォルトでエンドツーエンドの暗号化を提供します。

前提条件

Fastly サービスのオリジンとして Storj DCS を追加する前に、Storj DCS アカウントプロジェクト、アクセス認証情報、オリジンとして機能するバケットを作成する必要があります。

オリジンとしての Storj DCS の使用

Storj DCS をオリジンとして使用し、Storj DCS S3 ゲートウェイ経由で Fastly を通じて Storj バケットを利用できるようにするには、以下の手順に従ってください。

新しいサービスの作成

新規サービスを作成する手順に従ってください。

  1. 新しいドメインとホストを作成する場合、以下を行います。
    • Create a domain ページの Domain Name フィールドに、URL として使用するホスト名を入力します (例: cdn.example.com)。
    • Origins ページの Hosts フィールドに、バケットを含む <BUCKET>.gateway.<REGION>.storjshare.io の形式を使用して Storj DCS ゲートウェイエンドポイントの IP アドレスまたはホスト名を入力します (例: origin.gateway.us1.storjshare.io)。
  2. Edit this host ページで ホストの詳細を編集する場合、以下を行ってください。
    • まだ入力されていない場合は、Name フィールドに分かりやすい任意のサービスの名前を入力します。
    • Address フィールドに、Storj DCS ゲートウェイエンドポイントの IP アドレスまたはホスト名が入力されていることを確認します。この情報はホスト作成時に入力したものです。
  3. Transport Layer Security (TLS) のセクションでホストの情報を編集する場合、以下を行ってください。
    • Storj DCS S3 ゲートウェイに対して TLS を設定している場合、Enable TLS? をデフォルト設定の Yes のままにし、Fastly とオリジン間の接続を保護します。
    • SNI hostname フィールドで、Match the SNI hostname to the Certificate hostname のチェックボックスを選択します。ホスト作成時に入力したアドレスが表示されます。
    • Certificate hostname フィールドに、Storj DCS S3 ゲートウェイの IP アドレスまたはホスト名を入力します。

結果をテストする

デフォルトでは、yourdomain.global.prod.fastly.net と呼ばれる DNS マッピングが作成されます。上記の例では、cdn.example.com.global.prod.fastly.net となります。指定したドメイン名の DNS エイリアスを作成します (例: global-nossl.fastly.net に対する cdn.example.com の CNAME)。

Fastly は、明示的な Cache-Control ヘッダーのないコンテンツを1時間にわたってキャッシュします。キャッシュヘッダーを送信しているかどうかは、curl コマンドを使用して確認することができます。以下に例を示します。

1
2
3
4
5
6
7
8
$ curl -I https://cdn.example.com

Accept-Ranges: bytes
Content-Length: 250
Content-Type: application/xml
Server: MinIO/DEVELOPMENT.GOGET
Vary: Origin
Date: Wed, 07 Oct 2020 02:31:27 GMT

この例では Cache-Control ヘッダーが設定されていないため、デフォルトの TTL が適用されます。

より詳細なキャッシュコントロール

Javascript ファイルや画像など、異なるタイプのアセットがキャッシュされる方法をより詳細にコントロールする必要がある場合は、キャッシュの鮮度に関するドキュメントをご覧ください。

オリジンホストのための Storj DCS バケットの使用

Fastly でオリジンとして Storj DCS S3 ゲートウェイを使用するには、Amazon のヘッダーベース認証のバージョン4を実装する必要があります。これは カスタム VCL を使用して行うことができます。まずは AWS から以下の情報を入手します。

項目 説明
バケット名 プライベートバケットの名前。バケットから項目をダウンロードする際に、各オブジェクトの URL パスやホスト名に記載される文字列です。
アクセスキー バケットに対して少なくとも読み取り権限を持っている Storj DCS Access Grant に関連付けられたアクセスキー文字列。
シークレットキー 上記のアクセスキーとペアになっているシークレットアクセスキー。

これらの情報が得られれば、VCL で適切なヘッダー値を計算することで、ヘッダー認証を使用してプライベートバケットに対して認証を行うように Fastly サービスを設定することができます。

まず、レギュラー VCL snippet を作成します。Storj DCS Originのような意味のある名前を付けます。スニペットを作成する際に、within subroutine を選択して配置を指定し、サブルーチンタイプとして miss を選択します。次に、VCL フィールドに以下のコードを入力します (特定の値は、お客様自身のバケットに関連するものに変更してください)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
declare local var.accessKey STRING;
declare local var.secretKey STRING;
declare local var.storjBucket STRING;
declare local var.storjGateway STRING;
declare local var.region STRING;
declare local var.canonicalHeaders STRING;
declare local var.signedHeaders STRING;
declare local var.canonicalRequest STRING;
declare local var.canonicalQuery STRING;
declare local var.stringToSign STRING;
declare local var.dateStamp STRING;
declare local var.signature STRING;
declare local var.scope STRING;


set var.accessKey = "YOUR_ACCESS_KEY";   # Change this value to your own data
set var.secretKey = "YOUR_SECRET_KEY";   # Change this value to your own data
set var.storjBucket = "YOUR_BUCKET_NAME";   # Change this value to your own data
set var.storjGateway = "STORJ-DCS_GATEWAY";   # Change this value to your own data
set var.region = "decentralized";


if (req.method == "GET" && !req.backend.is_shield) {

  set bereq.http.x-amz-content-sha256 = digest.hash_sha256("");
  set bereq.http.x-amz-date = strftime({"%Y%m%dT%H%M%SZ"}, now);
  set bereq.http.host = var.storjBucket "." var.storjGateway;
  set bereq.url = querystring.remove(bereq.url);
  set bereq.url = regsuball(urlencode(urldecode(bereq.url.path)), {"%2F"}, "/");
  set var.dateStamp = strftime({"%Y%m%d"}, now);
  set var.canonicalHeaders = ""
	"host:" bereq.http.host LF
	"x-amz-content-sha256:" bereq.http.x-amz-content-sha256 LF
	"x-amz-date:" bereq.http.x-amz-date LF
  ;
  set var.canonicalQuery = "";
  set var.signedHeaders = "host;x-amz-content-sha256;x-amz-date";
  set var.canonicalRequest = ""
	"GET" LF
	bereq.url.path LF
	var.canonicalQuery LF
	var.canonicalHeaders LF
	var.signedHeaders LF
	digest.hash_sha256("")
  ;

  set var.scope = var.dateStamp "/" var.region "/s3/aws4_request";


  set var.stringToSign = ""
	"AWS4-HMAC-SHA256" LF
	bereq.http.x-amz-date LF
	var.scope LF
	regsub(digest.hash_sha256(var.canonicalRequest),"^0x", "")
  ;

  set var.signature = digest.awsv4_hmac(
	var.secretKey,
	var.dateStamp,
	var.region,
	"s3",
	var.stringToSign
  );


 set bereq.http.Authorization = "AWS4-HMAC-SHA256 "
	"Credential=" var.accessKey "/" var.scope ", "
	"SignedHeaders=" var.signedHeaders ", "
	"Signature=" + regsub(var.signature,"^0x", "")
  ;

  unset bereq.http.Accept;
  unset bereq.http.Accept-Language;
  unset bereq.http.User-Agent;
  unset bereq.http.Fastly-Client-IP;
}
Back to Top