Amazon S3 と CloudFront: ステップバイステップ
限定された IAM 権限、ブラウザ CORS、CloudFront HTTPS 配信、およびアップロード検証チェックリストを使用して、プライベート S3 バケットを DRM-X 6.0 に接続します。
1. つながりを理解する#
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 バケットを作成する#

- 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→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 を設定します#
- S3バケットを開く → Permissions
- Cross-origin resource sharing (CORS) → Edit までスクロールします。
- 以下の JSON を貼り付けます。公開する暗号化メディアの読み取りには * を使用し、アップロードは DRM-X Console に限定します。既存のバケットで必要な他のルールは保持してください。
- 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": [
"*"
],
"AllowedMethods": [
"GET",
"HEAD"
],
"AllowedHeaders": [
"Range"
],
"ExposeHeaders": [
"ETag",
"Content-Length",
"Content-Range",
"Accept-Ranges"
],
"MaxAgeSeconds": 3600
}
]S3 で署名付きアップロードを設定し、S3 と CloudFront の両方で再生用 CORS を設定します。手順 5 の CloudFront レスポンスヘッダーポリシーでも、同じ再生オリジンを使用します。
5. CloudFront HTTPS 配信 URL を作成する#
- 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 | *(公開する暗号化メディアに推奨)。ジェネレーターで特定のオリジンを選択した場合は、ここでも同じリストを使用します。 |
| 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 に接続します#
Cloud Storage→Connect 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 ではありません。
* ポリシーはすべてのウェブサイトからのブラウザーによる読み取りを許可します。復号は引き続き DRM ライセンス認可で制御されます。暗号化メディアと公開予定のアセット専用のバケットを使用してください。メディアリクエストにはクロスオリジン Cookie を含めないでください。Cookie 認証による配信には別の CORS 設定が必要です。
CORS および一致する URL フィールドを生成します
このツールはブラウザで実行されます。公開元のみを入力してください。アクセスキーは要求されません。
- Protected-content base path
- Public URL prefix
- オブジェクトキーの例
- 完全な URL の例
7. ファイルをアップロードし、動作することを確認します。#
- Cloud Storage を開き、この宛先を選択して、Verify location を選択します。成功とは、DRM-X サーバーがバケットをリストできることを意味します。書き込み権限、ブラウザ CORS または公開配信は確立されません。
- Upload encrypted files を選択し、既存の DRM-X パッケージから小さな暗号化セグメントを 1 つ選択します。パッケージをお持ちでない場合は、以下の使い捨ての暗号化診断を使用してください。オリジナルのビデオや個人的な文書をアップロードしないでください。
- 成功メッセージを待ちます。 Cloud Storageにファイル名とサイズが表示されていることを確認します。プロバイダー コンソールの
protected/で同じオブジェクトを見つけます。 - プライベートブラウザウィンドウで Preview URL を開きます。ログインせずにアップロード済みオブジェクトが HTTP 200 を返すことを確認してください。
- ブラウザーの Network パネルで manifest とメディアのレスポンスを確認します。デフォルトのポリシーでは
Access-Control-Allow-Originが *、制限付きポリシーではプレーヤーの正確なオリジンになっている必要があります。URL を直接開くだけでは CORS を検証できません。 - 完了したら、使い捨ての診断オブジェクトのみを削除してください。次に、デスクトップパッケージャーガイドに従い、Package contentでこの保存先を選択し、完全な暗号化パッケージをアップロードします。ファイルを手動でアップロードしても、Published Content ID は登録されません。
- 結果の Published ファイルを Universal Playback Lab と独自のプレーヤー 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, Lengthdrmx-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 と Access-Control-Allow-Origin: * が返ることを確認します。Range: bytes=0-15 を指定した GET は HTTP 206 と Content-Range を返す必要があります。DASH は application/dash+xml、HLS は application/vnd.apple.mpegurl、メディアファイルは適切な MIME タイプを保持してください。
8. 結果のトラブルシューティングを行う#
| 結果 | アクション |
|---|---|
| Verify location は成功するが、ブラウザからのアップロードは失敗する | ブラウザ Console とネットワーク パネルを検査します。正確な Console Originからの PUT CORS と Content-Type を許可します。また、接続を確認し、新しい署名付き URL を再試行してください。 |
| アップロードすると 403 が返されます | オブジェクトの書き込み権限、バケット/フォルダーのスコープ、エンドポイント、リージョン、リクエストの有効期限、クロックを確認してください。署名されたアップロード URL を共有しないでください。 |
| アップロードは成功しました。パブリック URL は 403 を返します | パブリック配信が有効になっていて、ドメイン/ディストリビューションのデプロイが完了しているかどうかを確認してください。 |
| パブリック URL は 404 を返します | 完全な URL を正確なオブジェクト キーと比較します。フォルダーの欠落または重複、およびファイル名の大文字と小文字を確認します。 |
| URL は直接開きます。プレーヤーのフェッチが失敗する | 配信ホストの GET/HEAD CORS を確認します。公開する暗号化メディアには * を使用するか、プレーヤーの正確なオリジンを許可します。古い CDN レスポンスのキャッシュを削除して再試行してください。S3 の場合は CloudFront レスポンスヘッダーポリシーも確認します。 |
| DRM-X Playback Lab では再生できるが、Moodle または WordPress で Failed to fetch が表示される | 配信ホストの GET/HEAD CORS を確認します。公開する暗号化メディアには * を使用するか、プレーヤーの正確なオリジンを許可します。古い CDN レスポンスのキャッシュを削除して再試行してください。S3 の場合は CloudFront レスポンスヘッダーポリシーも確認します。 |
| ダウンロードは成功しました。再生に失敗する | パッケージの公開、マニフェスト パス、MIME タイプ、および DRM ライセンス認証を確認してください。 再生のトラブルシューティングを参照してください。 |
CloudFront 403: は、OAC がリクエストに署名し、バケットポリシーが正しいディストリビューション ARN とプレフィックスを使用し、オリジンが S3 REST エンドポイントであることを確認します。 S3 Block Public Access をオンのままにします。 SSE-KMS を選択した場合は、KMS 権限を確認してください。
公式リファレンス#
- S3バケットを作成します
- アクセスキーIAMの管理
- S3 CORS 構成
- CloudFront OAC および S3 バケットポリシー
- CloudFront 応答ヘッダー
- 管理されたオリジンリクエストポリシー
- カスタム ドメインと証明書
他のプロバイダーについてはクラウドストレージ設定ガイドをご覧ください。
DRM-X 6.0