Oracle Cloud ストレージ

Fastly では Oracle Cloud ストレージ のパブリックおよびプライベートバケットをオリジンとして使用することができます。

設定前の注意点

Oracle Cloud をオリジンとして使用するのに必要なセットアップと設定の手順を開始する前に、以下の点に留意してください。

  • 有効な Oracle Cloud アカウントが必要です。新しいバケットを作成し、Fastly が使用するファイルをアップロードする前に、まず Oracle の Web サイトで Oracle Cloud アカウントを作成する必要があります。
  • Oracle Cloud には、Oracle 独自の APIAmazon S3 Compatibility API の両方が実装されています。現在、Fastly は S3 Compatibility API 経由でのみプライベートバケットをサポートしています。

Oracle Cloud ストレージをオリジンとして使用する

Oracle Cloud ストレージをオリジンとして使用するには、以下の手順に従ってください。

新規バケットを作成する

Oracle Cloud ストレージのデータはバケットに格納されます。以下の手順で Oracle Cloud のコントロールパネルで新規バケットを作成します。

  1. Oracle account にログインします。Oracle アカウントの設定画面が表示されます。
  2. 左上のナビゲーションメニューを開いて Object Storage を選び、Object Storage を選択します。

    Oracle Cloud Object Storage の新規バケットのウィンドウ

  3. ページ左側の Compartment リストからコンパートメントを選択します。
  4. Create a Bucket をクリックします。Create a Bucket ウィンドウが表示されます。
  5. Bucket Name フィールドに固有のバケット名を入力します。バケット名は名前空間内で固有のものである必要があり、ネストすることはできません。名前には、文字、数字、ダッシュ、ピリオドが使用できます。

    Oracle Cloud Object Storage の新規バケットのウィンドウ

  6. Create a Bucket ボタンをクリックします。新規作成したバケットが Oracle Cloud Storage Buckets ページのバケットリストに表示されます。
  7. デフォルトでは新しいバケットはプライベートになります。バケットの右側にある3つの点をクリックして Edit Visibility を選択します。 Visibility を Public に変更し、Allow users to list objects from this bucket オプションの選択を解除します。
  8. 先ほど作成した新しいバケットにファイルをアップロードします。

バケットの名前空間とホスト名を探す

Oracle Cloud ストレージと連動する Fastly サービスをセットアップするには、ファイルをアップロードした作成済みのバケットに割り当てられている名前空間の識別子とホスト名が必要です。

名前空間を調べるには、バケットをクリックして Bucket Information タブで確認できます。この例では名前空間は decafbaddeadbeef です。

Oracle Cloud ストレージバケットの詳細

バケットのホスト名は以下で特定できます。

  • ネイティブの Oracle API を使用している場合、ホスト名は objectstorage.<region>.oraclecloud.com (例: objectstorage.us-ashburn-1.oraclecloud.com) のような形式になります。
  • S3 Compatibility API を使用している場合、ホスト名は <namespace id>.compat.objectstorage.<region>.oraclecloud.com (例: decafbaddeadbeef.compat.objectstorage.us-ashburn-1.oraclecloud.com) のような形式になります。

新規サービスの作成

Fastly サービスを新規作成するには、まず新規ドメインを作成した後に新規ホストを作成し、Oracle Cloud ストレージのトラフィックを受け入れるように編集する必要があります。その手順については、新規サービスの作成に関するガイドに記載されています。これらの手順を完了する際、以下の点にご注意ください。

  • ホストを新規作成する際、Origins ページの Hosts フィールドに Oracle バケットのホスト名を入力します。バケットの名前空間とホスト名を探すのセクションを参照してください。
  • Edit this host ページホスト情報を編集する際、ホストのトランスポート・レイヤー・セキュリティ (TLS) セクションの情報を確認してください。具体的には以下を確認してください。
    • Fastly とオリジン間の接続が確立されている。
    • Certificate hostname フィールドにバケットのホスト名が入力されている。
    • SNI のホスト名を Certificate のホスト名と一致させるチェックボックスが選択されている (SNI のホスト名フィールドの下に表示されます)。
  • また、ホストを編集する際、オプションで Shielding メニューから適切なシールドの場所を選択し、オリジンシールドを有効にできます。Oracle Cloud ストレージを使用する場合、最も最適な Oracle のリージョンに最も近いシールド場所を選択する必要があります。
  • Advanced options のセクションで、バケットのホスト名と同じオーバーライドホストを指定するかどうかを決定します。

パブリックオブジェクトで Oracle Cloud API を使用する

Oracle Cloud APIをパブリック・オブジェクトで使用するには、新規ヘッダーまたは VCL スニペットを作成する必要があります。ヘッダーまたは VCL スニペットを作成して Oracle Cloud ストレージのインスタンスのリクエスト URL を書き換えます。

ヘッダーオブジェクトを使用する

  1. Fastly サービスの設定ページで Create header ボタンをクリックし、新規ヘッダーを作成します。Create a header ページが表示されます。
  2. 以下の要領で Create a header ページの各フィールドに入力します。
    • Name フィールドに Rewrite Oracle Cloud Storage URL と入力します。
    • Type メニューから Request を選択し、Action メニューから Set を選択します。
    • Destination フィールドに url と入力します。
    • Ignore if set メニューから No を選択します。
    • Priority フィールドに 20 と入力します。
  3. Source フィールドに "/n/<namespace id>/b/<bucket name>/o/" req.url(例: "/n/decafbaddeadbeef/b/fastly-bucket/o/" req.url) と入力します。
  4. Create ボタンをクリックします。Content ページに新しいヘッダーが表示されます。
  5. Activate ボタンをクリックして設定変更をデプロイします。

VCL スニペットを使用する

  1. サービスの設定ページで VCL Snippets をクリックし、Create Snippet をクリックします。
  2. Create a VCL Snippet ページでスニペットの名前を入力します。
  3. within subroutine を選択して配置を指定し、サブルーチンタイプとして miss を指定します。

    VCL Snippet タイプの選択

  4. VCL フィールドに以下のコードを追加します。Oracle の名前空間とバケットに一致するように、oracleNamespaceoracleBucket の変数の値を変更します。

    1
    2
    3
    4
    5
    6
    7
    8
    
    declare local var.oracleNamespace STRING;
    declare local var.oracleBucket STRING;
    set var.oracleNamespace = "YOUR_ORACLE_NAMESPACE_ID";   # Change this value to your own data
    set var.oracleBucket = "YOUR_ORACLE_BUCKET_NAME";   # Change this value to your own data
    
    if (req.method == "GET" && !req.backend.is_shield) {
      set bereq.url = "/n/" var.oracleNamespace "/b/" var.oracleBucket "/o/" bereq.url;
    }
    

パブリックオブジェクトで S3 Compatibility API を使用する

S3 Compatibility API をパブリックオブジェクトで使用するには、以下のように新しいヘッダーを作成する必要があります。

  1. Fastly サービスの設定ページで Create header ボタンをクリックし、新規ヘッダーを作成します。Create a header ページが表示されます。
  2. 以下の要領で Create a header ページの各フィールドに入力します。
    • Name フィールドに Rewrite Oracle Cloud Storage URL と入力します。
    • Type メニューから Request を選択し、Action メニューから Set を選択します。
    • Destination フィールドに url と入力します。
    • Ignore if set メニューから No を選択します。
    • Priority フィールドに 20 と入力します。
  3. Source フィールドに "/<bucket name>/" req.url(例: "/fastly-bucket/o/" req.url) と入力します。
  4. Create ボタンをクリックします。Content ページに新しいヘッダーが表示されます。
  5. Activate ボタンをクリックして設定変更をデプロイします。

プライベートバケット

Oracle Cloud ストレージのプライベートバケットを Fastly で使用するには、Amazon のヘッダーベース認証のバージョン4を実装する必要があります。これは カスタム VCL を使用して行うことができます。以下の点にご留意ください。

  • Access KeySecret Key で構成される Oracle の Customer Secret Key が必要となります。
  • パスベースのアクセスを使用する必要があります。バーチャルホストスタイルのアクセス (例えば、バケットに <bucketname>.<namespace>.compat.objectstorage.<region>.oraclecloud.com としてアクセスするなど) はサポートされていません。

以下の表は、使用開始前に Oracle Cloud ストレージから入手する必要がある情報の一覧です。

項目 説明
名前空間 バケットに割り当てられている名前空間識別子 (バケットの名前空間とホスト名を探すを参照してください)。
バケット名 OCS バケットの名前です。バケットから項目をダウンロードする際に、各オブジェクトの URL パスやホスト名に記載される文字列です。
リージョン バケットが存在する場所の OCS リージョンコード (例: us-east-1)。
アクセスキー バケットに対して少なくとも読み取り権限を持つアカウントの OCS アクセスキー文字列。
シークレットキー 上記のアクセスキーとペアになっている OCS のシークレットアクセスキー。

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

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

  1. サービスの設定ページで VCL Snippets をクリックし、Create Snippet をクリックします。
  2. Create a VCL Snippet ページで、スニペットに AWS protected origin のような意味のある名前をつけます。
  3. within subroutine を選択してスニペットの配置を指定し、サブルーチンのタイプとして miss を選択します。

    VCL スニペットタイプの選択

  4. VCL フィールドに以下のコードを追加します。Oracle の環境に一致するように、変数 (ocsNamespaceocsAccessKey など) の値を必ず変更してください。

    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
    
    declare local var.ocsNamespace STRING;
    declare local var.ocsAccessKey STRING;
    declare local var.ocsSecretKey STRING;
    declare local var.ocsS3Bucket STRING;
    declare local var.ocsRegion 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.ocsNamespace = "YOUR_OCS_NAMESPACE"; # Change this value to your own data
    set var.ocsAccessKey = "YOUR_OCS_ACCESS_KEY";   # Change this value to your own data
    set var.ocsSecretKey = "YOUR_OCS_SECRET_KEY";   # Change this value to your own data
    set var.ocsS3Bucket = "YOUR_OCS_BUCKET_NAME";   # Change this value to your own data
    set var.ocsRegion = "YOUR_OCS_REGION";   # Change this value to your own data
    
    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.ocsNamespace ".compat.objectstorage." var.ocsRegion ".oraclecloud.com";
      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.ocsRegion "/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.ocsSecretKey,
        var.dateStamp,
        var.ocsRegion,
        "s3",
        var.stringToSign
      );
    
      set bereq.http.Authorization = "AWS4-HMAC-SHA256 "
        "Credential=" var.ocsAccessKey "/" 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;
    }
    
This article describes an integration with a service provided by a third party. See our note on integrations for details.
Back to Top