# Amazon S3 と CloudFront: ステップバイステップ 限定された IAM 権限、ブラウザ CORS、CloudFront HTTPS 配信、およびアップロード検証チェックリストを使用して、プライベート S3 バケットを DRM-X 6.0 に接続します。 暗号化された動画と DRM ライセンスは別の経路で配信されます CDN は暗号化された動画を配信します。バックエンドが視聴権限を確認し、DRM ライセンスサービスが対応デバイスでの復号を許可します。 - 01**ストレージ / CDN** 暗号化されたメディアをプレーヤーに配信します。 - 02**お客様のバックエンド** 視聴権限を確認し、DRM-X に再生の認可をリクエストします。 - 03**DRM-X** 再生の認可情報を検証し、DRM ライセンスリクエストを処理します。 - 04**プレーヤー + デバイス** デバイスの DRM システムを使ってライセンスを取得し、暗号化されたメディアを再生します。 バックエンドはアクセスを決定します。DRM-Xは署名されたポリシーを強制します。暗号化されたメディアとDRMのライセンスは、別の配送パスに従います。 **プライベートバケットからパブリック暗号化メディア配信へ** S3 バケットを作成し、DRM-X 範囲指定されたアップロード認証情報を与え、ブラウザCORS を設定し、CloudFront に接続し、テストオブジェクトをアップロードして取得します。オリジナルのビデオとプライベート ファイルはこの配信バケットの外に保管してください。 ## 1. つながりを理解する[#](#architecture) DRM-X は署名付きリクエストで S3 に直接アップロードします。視聴者は CloudFront から HTTPS で暗号化メディアを取得します。S3 の **Block all public access** は有効のままにしてください。CloudFront には **Origin Access Control (OAC)** で読み取り権限を限定して付与します。 CloudFront は本番で使える `https://….cloudfront.net` ホスト名を提供します。独自ドメインは任意です。公開配信ではオブジェクトのバイト列が取得可能になりますが、正しくパッケージ化されたメディアの復号は引き続き DRM が制御します。CORS は認可の仕組みではありません。このガイドは通常の公開 CDN 配信を使用します。視聴者向けの署名付き URL や Cookie には別の統合が必要です。 ## 2. S3 バケットを作成する[#](#create-bucket) ![AWS S3 作成フォーム: General purpose、Global namespace およびバケット名の例。](https://docs.drm-x.com/assets/storage/s3-create.png)12**1:**はGeneral purposeを選択してください。 **2:** 独自の一意の名前を入力します。これは、未送信の例を含む実際のコンソール フォームです。アカウントヘッダーは除外されます。 - **Amazon S3→General purpose buckets→Create bucket** オープンします。 - 地域を選択し、`us-east-1` などのコードを記録します。 **General purpose**を選択してください。名前空間を要求された場合は、このチュートリアルでは **Global namespace** を使用します。 - グローバルに一意な独自のバケット名を入力します。 **Object Ownership→ACLs disabled (Bucket owner enforced)**を維持します。 - **Block all public access** にチェックを入れたままにしてください。スコープ付きポリシーを通じて CloudFront にアクセス権を付与します。 - このウォークスルーでは、**Default encryption → Server-side encryption with Amazon S3 managed keys (SSE-S3)** を維持します。これは追加のストレージ暗号化であり、DRM パッケージの代替ではありません。 SSE-KMS には追加のアップローダーと CloudFront KMS 権限が必要です。 - バケットを確認して作成します。 S3 静的 Web サイトホスティングを有効にしないでください。 ## 3. 権限を限定した IAM ユーザーとアクセスキーを作成する[#](#iam-credentials) - **IAM→Policies→Create policy→JSON** を開きます。以下のポリシーを貼り付けて、サンプルのバケット名をすべて置き換えます。 - この例では、`protected/` のみが許可されています。別のベース パスを使用する場合は、プレフィックス条件とオブジェクト ARN の両方を更新します。バケットルートを使用する場合は、ListBucket プレフィックス条件を削除し、オブジェクトに `arn:aws:s3:::YOUR_BUCKET/*` を使用します。 - ポリシーを保存します。 **IAM → Users → Create user** を開き、AWS Console アクセス権なしの専用統合ユーザーを作成し、このポリシーのみをアタッチします。 - ユーザーの**Security credentials→Access keys→Create access key**を開きます。 AWS の外部で実行されているアプリケーションのユースケースを選択し、プロンプトに従います。 Access key IDとSecret access keyはDRM-Xのためにしっかりと保持してください。 ``` { "Version": "2012-10-17", "Statement": [ { "Sid": "ListProtectedFolder", "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::customer-drm-media-example", "Condition": { "StringLike": { "s3:prefix": [ "protected", "protected/", "protected/*" ] } } }, { "Sid": "BucketRegion", "Effect": "Allow", "Action": "s3:GetBucketLocation", "Resource": "arn:aws:s3:::customer-drm-media-example" }, { "Sid": "ManageProtectedObjects", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": "arn:aws:s3:::customer-drm-media-example/protected/*" } ] } ``` ルートキーやAdministratorAccessは使用しないでください。コピーには GetObject と PutObject を使用します。個別の `s3:CopyObject` IAM アクションはありません。名前の変更には DeleteObject も必要です。このガイドは、DRM-X の現在のアクセスキー形式に従っています。役割 ARN だけではキー ペアを置き換えません。 ## 4. ブラウザーアップロード用に S3 CORS を設定します[#](#bucket-cors) - S3バケットを開く → **Permissions** - **Cross-origin resource sharing (CORS) → Edit** までスクロールします。 - この JSON を貼り付け、`https://www.example.com` をプレーヤーが埋め込まれている Web サイトに置き換えます。 DRM-X Console のOriginを維持します。他の必要なルールは既存のバケットに保存します。 - **Save changes**を選択します。 Block Public Access を有効のままにします: CORS はバケットを公開しません。 ``` [ { "AllowedOrigins": [ "https://6.drm-x.com" ], "AllowedMethods": [ "PUT" ], "AllowedHeaders": [ "Content-Type", "x-amz-meta-drmx-sha256" ], "ExposeHeaders": [ "ETag" ], "MaxAgeSeconds": 3600 }, { "AllowedOrigins": [ "https://6.drm-x.com", "https://multi-drm.drm-x.com", "https://www.example.com" ], "AllowedMethods": [ "GET", "HEAD" ], "AllowedHeaders": [ "Range" ], "ExposeHeaders": [ "ETag", "Content-Length", "Content-Range", "Accept-Ranges" ], "MaxAgeSeconds": 3600 } ] ``` アップロードは S3 に直接送信されるため、PUT CORS は S3 に属します。 CloudFront までの再生には、手順 5 の CDN の設定も必要です。 ## 5. CloudFront HTTPS 配信 URL を作成する[#](#cloudfront) - **CloudFront→Distributions→Create distribution** を開きます。標準ディストリビューションを使用します。 AWS にオンボーディングまたは料金プランの選択が表示されている場合は、リソースを作成する前に、アカウントに適したプランを確認して選択してください。 - Web サイトのエンドポイントではなく、バケットの通常の **S3 REST origin** を選択します。このガイドで使用するフォルダー マッピングの**Origin path は空** のままにしておきます。 - **Origin access control settings (recommended)**を選択してください。 **Sign requests (recommended)** を使用して OAC を作成または選択します。 - ビューアのプロトコル ポリシーを **Redirect HTTP to HTTPS** または **HTTPS only** に設定します。 **GET、HEAD、OPTIONS** を許可します。アップロードには S3 エンドポイントが使用されるため、CloudFront には PUT は必要ありません。 - ディストリビューションを作成します。 CloudFront で生成されたバケット ポリシーを、**S3 → Bucket → Permissions → Bucket policy → Edit** に適用します。必要な既存のステートメントとマージします。このディストリビューションの ARN へのアクセスを制限します。以下の例では、読み取りを `protected/` に制限します。 - **CloudFront → Policies → Response headers → Create response headers policy** を開きます。以下の表の CORS フィールドを設定します。このポリシーをディストリビューションのメディア/デフォルト動作にアタッチします。 - デプロイが完了するまで待ちます。 **Distribution domain name**をコピーします。あなたの配信元は`https://YOUR_DISTRIBUTION.cloudfront.net`です。 | Response headers ポリシーフィールド | 値 | | --- | --- | | Access-Control-Allow-Origin | プレーヤーを設置する Web サイトの正確な Origin と、DRM-X テスト用の `https://6.drm-x.com`、`https://multi-drm.drm-x.com`。 | | Access-Control-Allow-Methods | GET, HEAD, OPTIONS | | Access-Control-Allow-Headers | Range | | Access-Control-Expose-Headers | ETag, Content-Length, Content-Range, Accept-Ranges | | Access-Control-Allow-Credentials | このパブリック暗号化メディア ワークフローでは無効になっています。 | | Access-Control-Max-Age | 3600 | | Origin override | CloudFront が視聴者側の CORS を一貫して制御できるように有効にします。 | OPTIONS プリフライトの場合、管理対象の **CORS-S3Origin** オリジンリクエストポリシーをアタッチします。 Origin、Access-Control-Request-Method、Access-Control-Request-Headers を S3 に転送します。最初は GET/HEAD のみをキャッシュし、OPTIONS キャッシュは無効のままにします。後で OPTIONS をキャッシュする場合は、これらのヘッダーをそのキャッシュ キーに含めて、さまざまなプレーヤーのオリジンをテストします。ヘッダーのみを転送しても、ヘッダーはキャッシュ キーに追加されません。 ``` { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowThisCloudFrontDistribution", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::customer-drm-media-example/protected/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/EEXAMPLE123" } } } ] } ``` サンプルアカウントID、ディストリビューションID、バケット名を置き換えます。 SourceArn は、作成したばかりのディストリビューションを識別する必要があります。ヘッダー変更後、以前の応答がキャッシュに残っている場合は、影響を受けるテスト/メディア パスを無効にします。 ### オプション: media.example.com を使用します - **US East (N. Virginia)、us-east-1** のホスト名をカバーするACM 公開証明書をリクエストし、DNS 検証を完了します。 - ディストリビューションの **Alternate domain names** の下にホスト名を追加し、その証明書を添付します。 - DNS プロバイダーで、CloudFront ホスト名を指す CNAME またはサポートされているエイリアスを作成します。 DNS、証明書と配布の展開を待ちます。 - 配信元として`https://media.example.com`を使用してください。 CloudFront ドメインと証明書のセットアップがなければ、DNS CNAME だけでは不十分です。 ## 6. Amazon S3 を DRM-X 6.0 に接続します[#](#connect-drmx) [Cloud Storage→Connect storage](https://6.drm-x.com/console/cloud-storage) を開きます。 **Amazon S3**を選択してください。 | フィールド | 入力内容 | | --- | --- | | Display name | Production S3 など、識別しやすい名前。 | | Bucket name | `s3://` を除いた正確な名前。 | | Region | バケットの正確な AWS 地域コード。 | | Protected-content base path | `protected`、IAM およびバケットポリシーと一致します。 | | Public URL prefix | `https://YOUR_DISTRIBUTION.cloudfront.net/protected` または `https://media.example.com/protected`。 | | Access key ID / Secret access key | 専用の IAM ユーザーの鍵ペア。 | 例では、`protected` というフォルダーを使用しています。バケット名は自動的にはフォルダーになりません。ここで使用されているドメインからバケットへの直接マッピングでは、パブリック URL プレフィックスに同じストレージ フォルダーを 1 回だけ含めます。 ``` Bucket: customer-drm-media-example Protected-content base path: protected Public URL prefix: https://media.example.com/protected File selected for upload: sample.encrypted.bin Object key in the bucket: protected/sample.encrypted.bin Preview URL: https://media.example.com/protected/sample.encrypted.bin ``` バケット ルートを使用するには、ベース パスを空白のままにし、パブリック プレフィックスとして配信元のみを入力します。意図的にフォルダーとして使用する場合を除き、バケット名を追加しないでください。このマッピングでは、CloudFront Origin path を空のままにしておきます。 必要に応じてデフォルトのアップロード先を選択し、**Save and verify** を選択します。 S3 API のホスト名は、CloudFront の配信 URL ではありません。 ### CORS および一致する URL フィールドを生成します このツールはブラウザで実行されます。公開元のみを入力してください。アクセスキーは要求されません。 プレーヤーを設置する Web サイトの Origin例を置き換えます。複数の HTTPS Originはスペースまたはカンマで区切ります。ページ パスを使用せずに、プレーヤーを埋め込んだ Web サイトを使用します。 DRM-X Console と Playback Lab は自動的に含まれます。公開配信の Origin接続されたカスタム ドメイン、有効な r2.dev URL または CloudFront のオリジンを入力してください。ここではフォルダーを省略します。保管フォルダ(オプション)構成の生成 CORS JSON をコピー ``` ``` Protected-content base path``Public URL prefix``オブジェクトキーの例``完全な URL の例`` ## 7. ファイルをアップロードし、動作することを確認します。[#](#test-upload) - [Cloud Storage](https://6.drm-x.com/console/cloud-storage) を開き、この宛先を選択して、**Verify location** を選択します。成功とは、DRM-X サーバーがバケットをリストできることを意味します。書き込み権限、ブラウザ CORS または公開配信は確立されません。 - **Upload encrypted files** を選択し、既存の DRM-X パッケージから小さな暗号化セグメントを 1 つ選択します。パッケージをお持ちでない場合は、以下の使い捨ての暗号化診断を使用してください。オリジナルのビデオや個人的な文書をアップロードしないでください。 - 成功メッセージを待ちます。 Cloud Storageにファイル名とサイズが表示されていることを確認します。プロバイダー コンソールの `protected/` で同じオブジェクトを見つけます。 - **Preview URL** をクリックし、同じオブジェクトをプライベート ブラウザ ウィンドウでテストします。 AWS または Cloudflare ログインせずにダウンロードするか、HTTP 200 を返す必要があります。実際のオブジェクトをテストします。オブジェクトの配信が機能している場合でも、ドメインのルートは 403/404 を返すことがあります。 - プレーヤーの Web サイトからクロスオリジン配信を確認します。ブラウザの [ネットワーク] パネルには、プレーヤー ページのオリジンと一致する `Access-Control-Allow-Origin` が表示されるはずです。アドレスバーからの直接ダウンロードでは、CORS はテストされません。以下の端末の例ではヘッダーもチェックします。 - 完了したら、使い捨ての診断オブジェクトのみを削除してください。次に、[デスクトップパッケージャーガイド](https://docs.drm-x.com/ja/packaging/desktop)に従い、Package contentでこの保存先を選択し、完全な暗号化パッケージをアップロードします。ファイルを手動でアップロードしても、Published Content ID は登録されません。 - 結果の Published ファイルを [Universal Playback Lab](https://multi-drm.drm-x.com/ja/player) と独自のプレーヤー Web サイトでテストします。ビデオ、オーディオ、シーク、および必要なデバイスを確認します。バイナリのダウンロードが成功しても、DRM の再生が証明されるわけではありません。 暗号化されたサンプルはありませんか? Windows に使い捨てテスト ファイルを作成します これを、管理する一時フォルダー内のWindows PowerShell で実行します。メモリ内にのみ保持される 1 回限りの AES キーを使用して、個人的なものではない短いメッセージを暗号化します。出力はストレージ診断であり、再生可能なメディアではありません。 DRM コンテンツ キーや顧客データは含まれません。 ``` $samplePath = Join-Path (Get-Location) 'drmx-storage-check.encrypted.bin' if (Test-Path -LiteralPath $samplePath) { throw 'Choose a new folder; this test file already exists.' } $aes = [System.Security.Cryptography.Aes]::Create() try { $aes.GenerateKey() $aes.GenerateIV() $encryptor = $aes.CreateEncryptor() try { $bytes = [Text.Encoding]::UTF8.GetBytes('DRM-X disposable storage check') $encrypted = $encryptor.TransformFinalBlock($bytes, 0, $bytes.Length) [IO.File]::WriteAllBytes($samplePath, $encrypted) } finally { $encryptor.Dispose() } } finally { $aes.Dispose() } Get-Item -LiteralPath $samplePath | Select-Object Name, Length ``` `drmx-storage-check.encrypted.bin` をアップロードし、そのサイズと Preview URL を確認してから、バケットから削除します。 ``` curl.exe -I -H "Origin: https://www.example.com" "https://media.example.com/protected/sample.encrypted.bin" ``` 両方の URL を置き換えます。 HTTP 200 と、プレイヤーの Web サイトに一致する許可されたオリジンが期待されます。範囲配信の場合、`Range: bytes=0-15` を含む GET リクエストは HTTP 206 と有効な Content-Range ヘッダーを返す必要があります。メディアの保存 MIME タイプ: DASH マニフェストは application/dash+xml を使用し、HLS プレイリストは application/vnd.apple.mpegurl を使用し、メディア ファイルは適切なメディア タイプを使用する必要があります。 ## 8. 結果のトラブルシューティングを行う[#](#troubleshooting) | 結果 | アクション | | --- | --- | | Verify location は成功するが、ブラウザからのアップロードは失敗する | ブラウザ Console とネットワーク パネルを検査します。正確な Console Originからの PUT CORS と Content-Type を許可します。また、接続を確認し、新しい署名付き URL を再試行してください。 | | アップロードすると 403 が返されます | オブジェクトの書き込み権限、バケット/フォルダーのスコープ、エンドポイント、リージョン、リクエストの有効期限、クロックを確認してください。署名されたアップロード URL を共有しないでください。 | | アップロードは成功しました。パブリック URL は 403 を返します | パブリック配信が有効になっていて、ドメイン/ディストリビューションのデプロイが完了しているかどうかを確認してください。 | | パブリック URL は 404 を返します | 完全な URL を正確なオブジェクト キーと比較します。フォルダーの欠落または重複、およびファイル名の大文字と小文字を確認します。 | | URL は直接開きます。プレーヤーのフェッチが失敗する | プレーヤーページの Origin を GET/HEAD の CORS 設定に追加します。CDN の応答ヘッダーを確認し、該当パスに残る古いキャッシュ応答を無効化してください。 | | ダウンロードは成功しました。再生に失敗する | パッケージの公開、マニフェスト パス、MIME タイプ、および DRM ライセンス認証を確認してください。 [再生のトラブルシューティング](https://docs.drm-x.com/ja/troubleshooting/playback)を参照してください。 | **CloudFront 403:** は、OAC がリクエストに署名し、バケットポリシーが正しいディストリビューション ARN とプレフィックスを使用し、オリジンが S3 REST エンドポイントであることを確認します。 S3 Block Public Access をオンのままにします。 SSE-KMS を選択した場合は、KMS 権限を確認してください。 ## 公式リファレンス[#](#references) - [S3バケット](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-bucket.html)を作成します - [アクセスキーIAMの管理](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-key-self-managed.html) - [S3 CORS 構成](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ManageCorsUsing.html) - [CloudFront OAC および S3 バケットポリシー](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html) - [CloudFront 応答ヘッダー](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/adding-response-headers.html) - [管理されたオリジンリクエストポリシー](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-origin-request-policies.html) - [カスタム ドメインと証明書](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/add-domain-existing-distribution.html) Cloudflare を使用していますか? [Cloudflare R2 セットアップ](https://docs.drm-x.com/ja/storage/cloudflare-r2) に従ってください。