はじめに
必要となるもの:
- app.yml アクセス権を持つ Discourse インスタンス
- AWS アカウント
命名戦略
ミスが発生する場所は多数あります。自分自身、あるいは他の人にとっても意味のある命名規則の戦略を採用することで、特に複数の Discourse インスタンスを設定している場合のトラブルシューティングが容易になります。
- IAM ユーザー: your-iam-user
- ポリシー: s3-discourse-policy-your-iam-user
- バックアップバケット: yourdomain-subdomain-backups
- アップロードバケット: yourdomain-subdomain-uploads
- 配信 CDN: cdn-yourdomain-subdomain および s3-yourdomain-subdomain-uploads
オプション: 設定プロセス用バケット: a-origin-config-bucket
AWS 設定
指示がない限り、AWS 設定ページではデフォルトの設定を使用してください。
S3 の名前、名前、名前
- Discourse インスタンスのドメイン: subdomain.yourdomain.tld (subdomain.yourdomain.tld および www.yourdomain.tld を含む)
- IAM ユーザー: yourdomain-subdomain (yourdomain-discourse、yourdomain-forum、または Apex/ルートでの Discourse: yourdomain-tld-www)
- IAM ユーザー用ポリシー: s3-discourse-policy-yourdomain-subdomain
- アップロードバケット: yourdomain-subdomain-uploads 注: バケット>Permissions: Access control list-(ACL) Access control list (ACL)-Grantee で「Everyone (public access)」を「Read」に設定することを忘れないでください。
- バックアップバケット: yourdomain-subdomain-backups
- 配信 CDN: cdn-yourdomain-subdomain および s3-yourdomain-subdomain-uploads
- 設定プロセス用バケット: a-origin-config-bucket
IAM ユーザー
- IAM > Users > 「ユーザーの作成」を選択
- IAM > Users > ユーザーの作成 > ユーザー詳細の指定 > ユーザー詳細 > ユーザー名 > 名前を入力(例: your-iam-user)> 「次へ」を選択
- IAM > Users > ユーザーの作成 > 権限の設定 > 権限オプション > 「ポリシーを直接アタッチ」を選択 > 「ポリシーの作成」を選択 > ポリシー作成ページが開く(または、事前にポリシーでポリシーを作成し、ユーザー作成時の「権限ポリシー」で選択することも可能)
- IAM > Users > ユーザーの作成 > 権限の設定 > 権限ポリシー > 種類でフィルターするドロップダウンセレクト > 「顧客管理」を選択 > 新しく作成したポリシーを選択 > 「次へ」を選択 > 「ユーザーの作成」を選択
- IAM > Users > your-iam-user > セキュリティ資格情報 > アクセスキー > 「アクセスキーの作成」を選択
- IAM > Users > your-iam-user > アクセスキーの作成 > アクセスキーのベストプラクティスと代替案 > 「その他」を選択 > 「次へ」を選択
- IAM > Users > your-iam-user > アクセスキーの作成 > 説明タグの設定 > 「アクセスキーの作成」を選択
- IAM > Users > your-iam-user > アクセスキーの作成 > アクセスキーの取得 > Discourse の app.yml で使用するために、アクセスキーとシークレットアクセスキーを安全に保存 > 「完了」を選択
ポリシー
- s3-discourse-policy-your-iam-user.txt を、IAM ユーザー名とバケット名に合わせて修正してください。
- IAM > ポリシー > ポリシーの作成
- IAM > ポリシー > ポリシーの作成 > 権限の指定 > ポリシーエディター > ポリシーエディターで「JSON」を選択 > s3-discourse-policy-your-iam-user.txt からポリシーをコピーし、既存の JSON を上書きして JSON エディターに貼り付け > 「次へ」を選択
- IAM > ポリシー > ポリシーの作成 > 確認と作成 > ポリシー詳細 > ポリシー名 > ポリシー名を入力(例: s3-discourse-policy-your-iam-user)> 「次へ」を選択
- IAM ユーザーへ移動: 4. IAM > Users > ユーザーの作成に進み、ユーザー作成プロセスを継続してください
Amazon S3 バケット
バックアップバケット、アップロードバケット、およびオプションですが有用な設定プロセス用バケットを作成して設定します。
バックアップバケットの作成 yourdomain-subdomain-backups
- Amazon S3 バケット に移動 > 「バケットの作成」を選択
- Amazon S3 > バケット > バケットの作成 > 一般設定 > 「汎用」選択を確認
- Amazon S3 > バケット > バケットの作成 > 一般設定 > バケット名 > バックアップバケット名を入力(例: yourdomain-subdomain-backups)
- Amazon S3 > バケット > バケットの作成 > 一般設定 > 「ACL を無効化(推奨)」選択を確認
- Amazon S3 > バケット > バケットの作成 > このバケットの公開アクセスブロック設定 > 「すべての公開アクセスをブロック」の選択を解除し、「新しい公開バケットまたはアクセスポイントポリシーを通じて付与されたバケットおよびオブジェクトへの公開アクセスをブロック」と「任意の公開バケットまたはアクセスポイントポリシーを通じてバケットおよびオブジェクトへの公開およびクロスアカウントアクセスをブロック」を選択
- Amazon S3 > バケット > バケットの作成 > このバケットの公開アクセスブロック設定 > 「すべての公開アクセスのブロックをオフにすると、このバケットとその内部のオブジェクトが公開される可能性があります」> 「現在の設定により、このバケットとその内部のオブジェクトが公開される可能性があることを認識しています」を選択
- Amazon S3 > バケット > バケットの作成 > バケットバージョン管理 > バケットバージョン管理 > 「有効化」を選択 情報: バケットバージョン管理は「ライフサイクルルール」に必要です
- Amazon S3 > バケット > バケットの作成 > 「バケットの作成」を選択
ライフサイクルルールの設定
バックアップ保持ルール
- Amazon S3 > バケット > 新しく作成したバケット(例: yourdomain-subdomain-backups)を選択
- Amazon S3 > バケット > yourdomain-subdomain-backups > 管理 > ライフサイクル設定 > 「ライフサイクルルールの作成」を選択
- Amazon S3 > バケット > yourdomain-subdomain-backups > 管理 > ライフサイクル設定 > ライフサイクルルール名 > ルール名を入力(例: backup retention)
- Amazon S3 > バケット > yourdomain-subdomain-backups > 管理 > ライフサイクル設定 > ルールスコープの選択 > 「バケット内のすべてのオブジェクトに適用」を選択
- Amazon S3 > バケット > yourdomain-subdomain-backups > 管理 > ライフサイクル設定 > ルールスコープの選択 > バケット内のすべてのオブジェクトに適用 > 「このルールがバケット内のすべてのオブジェクトに適用されることを認識しています」を選択
- Amazon S3 > バケット > yourdomain-subdomain-backups > 管理 > ライフサイクル設定 > ライフサイクルルールアクション > 「オブジェクトの非現行バージョンをストレージクラス間で移行する」、「オブジェクトの現行バージョンを有効期限切れにする」、および「オブジェクトの非現行バージョンを完全に削除する」を選択
- Amazon S3 > バケット > yourdomain-subdomain-backups > 管理 > ライフサイクル設定 > ライフサイクルルールアクション > 移行はリクエストごとに課金されます > 「このライフサイクルルールにより、リクエストごとに移行コストが発生することを認識しています」を選択
- Amazon S3 > バケット > yourdomain-subdomain-backups > 管理 > ライフサイクル設定 > オブジェクトの非現行バージョンをストレージクラス間で移行する > ストレージクラス移行の選択 > 「Glacier Instant Retrieval」を選択
- Amazon S3 > バケット > yourdomain-subdomain-backups > 管理 > ライフサイクル設定 > オブジェクトの非現行バージョンをストレージクラス間で移行する > オブジェクトが非現行になってからの日数 > 「1」を入力
- Amazon S3 > バケット > yourdomain-subdomain-backups > 管理 > ライフサイクル設定 > オブジェクトの現行バージョンを有効期限切れにする > オブジェクト作成からの日数 > 「7」または「15」または「30」または「???」を入力
- Amazon S3 > バケット > yourdomain-subdomain-backups > 管理 > ライフサイクル設定 > オブジェクトの非現行バージョンを完全に削除する > オブジェクトが非現行になってからの日数 > 「91」を入力
- Amazon S3 > バケット > yourdomain-subdomain-backups > 管理 > ライフサイクル設定 > 「移行と有効期限切れアクションの確認」が正しいことを確認 > 「ルールを作成」を選択
クリーンアップルール
- Amazon S3 > バケット > yourdomain-subdomain-backups > 管理 > ライフサイクル設定 > 「ライフサイクルルールの作成」を選択
- Amazon S3 > バケット > yourdomain-subdomain-backups > 管理 > ライフサイクル設定 > ライフサイクルルール名 > ルール名 cleanup を入力
- Amazon S3 > バケット > yourdomain-subdomain-backups > 管理 > ライフサイクル設定 > ルールスコープの選択 > 「バケット内のすべてのオブジェクトに適用」を選択
- Amazon S3 > バケット > yourdomain-subdomain-backups > 管理 > ライフサイクル設定 > ルールスコープの選択 > バケット内のすべてのオブジェクトに適用 > 「このルールがバケット内のすべてのオブジェクトに適用されることを認識しています」を選択
- Amazon S3 > バケット > yourdomain-subdomain-backups > 管理 > ライフサイクル設定 > ライフサイクルルールアクション > 「オブジェクトの非現行バージョンを完全に削除する」と「期限切れのオブジェクト削除マーカーまたは不完全なマルチパートアップロードを削除する」を選択
- Amazon S3 > バケット > yourdomain-subdomain-backups > 管理 > ライフサイクル設定 > オブジェクトの非現行バージョンを完全に削除する > オブジェクトが非現行になってからの日数 > 「92」を入力
- Amazon S3 > バケット > yourdomain-subdomain-backups > 管理 > ライフサイクル設定 > オブジェクトの非現行バージョンを完全に削除する > 期限切れのオブジェクト削除マーカーまたは不完全なマルチパートアップロードを削除する > 期限切れのオブジェクト削除マーカー > 「期限切れのオブジェクト削除マーカーを削除する」を選択
- Amazon S3 > バケット > yourdomain-subdomain-backups > 管理 > ライフサイクル設定 > オブジェクトの非現行バージョンを完全に削除する > 期限切れのオブジェクト削除マーカーまたは不完全なマルチパートアップロードを削除する > 不完全なマルチパートアップロード > 「不完全なマルチパートアップロードを削除する」を選択
- Amazon S3 > バケット > yourdomain-subdomain-backups > 管理 > ライフサイクル設定 > オブジェクトの非現行バージョンを完全に削除する > 期限切れのオブジェクト削除マーカーまたは不完全なマルチパートアップロードを削除する > 不完全なマルチパートアップロード > 不完全なマルチパートアップロードを削除する > 日数 > 「3」または「???」を入力
- Amazon S3 > バケット > yourdomain-subdomain-backups > 管理 > ライフサイクル設定 > 「移行と有効期限切れアクションの確認」が正しいことを確認 > 「ルールを作成」を選択
アップロードバケットの作成 yourdomain-subdomain-uploads
- Amazon S3 > バケット に移動 > 「バケットの作成」を選択
- Amazon S3 > バケット > バケットの作成 > 一般設定 > 「汎用」選択を確認
- Amazon S3 > バケット > バケットの作成 > 一般設定 > バケット名 > アップロードバケット名を入力(例: yourdomain-subdomain-uploads)
- Amazon S3 > バケット > バケットの作成 > 一般設定 > 「ACL を有効化」を選択
- Amazon S3 > バケット > バケットの作成 > このバケットの公開アクセスブロック設定 > 「すべての公開アクセスをブロック」の選択を解除し、「新しい公開バケットまたはアクセスポイントポリシーを通じて付与されたバケットおよびオブジェクトへの公開アクセスをブロック」と「任意の公開バケットまたはアクセスポイントポリシーを通じてバケットおよびオブジェクトへの公開およびクロスアカウントアクセスをブロック」を選択
- Amazon S3 > バケット > バケットの作成 > このバケットの公開アクセスブロック設定 > 「すべての公開アクセスのブロックをオフにすると、このバケットとその内部のオブジェクトが公開される可能性があります」> 「現在の設定により、このバケットとその内部のオブジェクトが公開される可能性があることを認識しています」を選択
- Amazon S3 > バケット > バケットの作成 > 「バケットの作成」を選択
- Amazon S3 > バケット > バケット画面 > 新しく作成したバケット(例: yourdomain-subdomain-uploads)を選択
配信 #2 の作成後にステップ 9 を実行してください - Amazon S3 > バケット > yourdomain-subdomain-uploads > 権限 > バケットポリシー > 編集を選択 > 配信 #2 の作成 11. CloudFront > 配信 > 配信 ID > オリジンの編集 > オリジンアクセス制御 > 「変更を保存」を選択した JSON を貼り付け
- Amazon S3 > バケット > yourdomain-subdomain-uploads > 権限 > アクセス制御リスト (ACL) > 編集を選択 > Everyone (public access) > 「Read」を選択 > Everyone グループまたは認証済みユーザーグループのグラントにアクセス権を付与すると、世界中の誰でもこのバケット内のオブジェクトにアクセスできます。「これらの変更がオブジェクトおよびバケットに与える影響を理解しています」を選択 > 「変更を保存」を選択
設定プロセス用バケットの作成 a-origin-config-bucket
配信 #1 の設定プロセス中に使用されるバケットを作成します。名前と設定は重要ではありません。このバケットは、設定プロセス中に削除される一時的な初期オリジンとしてのみ使用されるためです。
1. Amazon S3 > バケット に移動 > 「バケットの作成」を選択
2. Amazon S3 > バケット > バケットの作成 > 一般設定 > 「汎用」選択を確認
3. Amazon S3 > バケット > バケットの作成 > 一般設定 > バケット名 > アップロードバケット名を入力(例: a-origin-config-bucket)
4. 設定ページを移動し、「バケットの作成」を選択
CloudFront 配信
2 つの AWS S3 CloudFront 配信を作成します。1 つはウェブサイトのアセットを提供し、もう 1 つはアップロードバケットのアセットを提供します。
配信 #1 の作成
配信 #1
DISCOURSE_CDN_URL
配信名: cdn-yourdomain-subdomain
オリジン: subdomain.yourdomain.tld
配信ドメイン名 (Cloudfront URL): AWS-assigned.cloudfront.net
代替ドメイン名: discourse-cdn.yourdomain.tld
- CloudFront > 配信 に移動 > 「作成」を選択
- CloudFront > 配信 > 配信の作成 > プランの選択 > 「従量課金」を選択 > 「次へ」を選択
- CloudFront > 配信 > 配信の作成 > 開始 > 配信オプション > 配信名 > 配信名を入力(例: cdn-yourdomain-subdomain)
- CloudFront > 配信 > 配信の作成 > 開始 > 配信オプション > 説明 - オプション > 「cdn-yourdomain-subdomain」を入力(オプションですが、可視性の向上に役立ちます)
- CloudFront > 配信 > 配信の作成 > 開始 > 配信オプション > 配信タイプ > 「単一のウェブサイトまたはアプリ」選択を確認 > 「次へ」を選択
- CloudFront > 配信 > 配信の作成 > オリジンの指定 > オリジンタイプ > 「その他」を選択 パブリックに解決可能な URL を通じて、AWS 内または外の任意のオリジンを参照してください。
- CloudFront > 配信 > 配信の作成 > オリジンの指定 > オリジン > カスタムオリジン > ドメインを入力(例: subdomain.yourdomain.tld)
- CloudFront > 配信 > 配信の作成 > オリジンの指定 > 設定 > キャッシュ設定 > 「キャッシュ設定をカスタマイズ」を選択
- CloudFront > 配信 > 配信の作成 > オリジンの指定 > 設定 > キャッシュ設定 > キャッシュポリシー > ドロップダウンから「CachingOptimized」を選択 > 「次へ」を選択
- CloudFront > 配信 > 配信の作成 > セキュリティの有効化 > 選択してください - このガイドでは > 「セキュリティ保護を有効化しない」を選択 > 「次へ」を選択
- CloudFront > 配信 > 配信の作成 > 確認と作成 > 「配信の作成」を選択
ブランド付き CDN URL を使用する場合 → ステップ 12 - CloudFront > 配信 > 配信 ID > 代替ドメイン名 > 「ドメインの追加」を選択
- CloudFront > 配信 > 配信 ID > 代替ドメイン名 > ドメインの追加 > ドメインの設定 > ドメイン > 配信対象のドメイン > DISCOURSE_CDN_URL を入力(例: discourse-cdn.yourdomain.tld)> 「次へ」を選択
未完了: 代替ドメイン名: discourse-cdn.yourdomain.tld
配信 #2 の作成
配信 #2
DISCOURSE_S3_CDN_URL
配信名: s3-yourdomain-subdomain-uploads
オリジン: yourdomain-subdomain-uploads
配信ドメイン名 (Cloudfront URL): AWS-assigned.cloudfront.net
代替ドメイン名: s3-cdn.yourdomain.tld
- CloudFront > 配信 > 配信の作成
- CloudFront > 配信 > 配信の作成 > プランの選択 > 「従量課金」を選択 > 「次へ」を選択
- CloudFront > 配信 > 配信の作成 > 開始 > 配信オプション > 配信名 > 配信名を入力(例: s3-yourdomain-subdomain-uploads)
- CloudFront > 配信 > 配信の作成 > 開始 > 配信オプション > 説明 - オプション > 「s3-yourdomain-subdomain-uploads」を入力(オプションですが、可視性の向上に役立ちます)
- CloudFront > 配信 > 配信の作成 > 開始 > 配信オプション > 配信タイプ > 「単一のウェブサイトまたはアプリ」選択を確認 > 「次へ」を選択
- CloudFront > 配信 > 配信の作成 > オリジンの指定 > オリジンタイプ > 「Amazon S3」選択を確認
- CloudFront > 配信 > 配信の作成 > オリジンの指定 > オリジン > S3 オリジン > 「S3 を参照」を選択 > アップロードバケット「yourdomain-subdomain-uploads」を選択 > 「選択」を選択 > 「次へ」を選択
- CloudFront > 配信 > 配信の作成 > セキュリティの有効化 > 選択してください - このガイドでは > 「セキュリティ保護を有効化しない」を選択 > 「次へ」を選択
- CloudFront > 配信 > 配信の作成 > 確認と作成 > 「確認と作成: が正しいことを確認」> 「配信の作成」を選択 → 新しく作成された配信情報ページが CloudFront > 配信 > 配信 ID で開くはずです
- CloudFront > 配信 > 配信 ID > オリジン > オリジンを選択 > 「編集」を選択
- CloudFront > 配信 > 配信 ID > オリジンの編集 > オリジンアクセス制御 > ! このポリシーを使用して CloudFront へのアクセスを許可する必要があります… > 「ポリシーをコピー」を選択 > アップロードバケットの作成 9. Amazon S3 > バケット > yourdomain-subdomain-uploads > 権限 > バケットポリシーへ移動
未完了: 代替ドメイン名: s3-cdn.yourdomain.tld
Discourse 管理者
最新の Discourse バージョン: 2025.12.0-latest
Discourse 管理 UI で以下の変更を行ってください。
バックアップ設定 /admin/backups/settings
- 最大バックアップ数 > ローカルに保持するバックアップ数を入力
- アップロード付きバックアップ > 「スケジュールされたバックアップにアップロードを含める。これを無効化すると、データベースのみがバックアップされます」を選択
S3 設定 /admin/site_settings/category/all_results?filter=S3
- すべてのアップロードに CDN URL を使用 > 「画像のみではなく、S3 にアップロードされたすべてのファイルに CDN URL を使用する」を選択(Discourse はデフォルトで未選択です)
設定の編集 (app.yml) ブランドなし URL
ブランド付き URL またはブランドなし Cloudfront URL に対して、以下の変更を app.yml で行ってください。
Discourse ブランドなし URL
ブランドなし CloudFront 配信に使用します。DISCOURSE_S3_REGION は異なる場合があります。
DISCOURSE_CDN_URL: https://amazonassigned.cloudfront.net
S3 ストレージ設定 (ブランドなし)
## S3 ストレージ設定
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: us-east-1
DISCOURSE_S3_ACCESS_KEY_ID: キーは伏せられています
DISCOURSE_S3_SECRET_ACCESS_KEY: キーは伏せられています
DISCOURSE_S3_CDN_URL: https://amazonassigned.cloudfront.net
DISCOURSE_S3_BUCKET: your-bucket-name-uploads
DISCOURSE_S3_BACKUP_BUCKET: your-bucket-name-backups
DISCOURSE_BACKUP_LOCATION: s3
Discourse ブランド付き URL
DNS 設定
CDN に yourdomain.com ベースの URL を使用したい場合は、いくつかの DNS 変更を行い、CDN URL を調整する必要があります。
ヒント: 各 CloudFront 配信の「代替ドメイン名」に discourse-cdn.yourdomain.com および s3-cdn.yourdomain.com をドメイン名として追加することを忘れないでください。
ブランド付き CloudFront 配信を使用したい場合の DNS 設定。
DISCOURSE_CDN_URL
既存のレコード: A discourseinstance.yourdomain.com インスタンス IP 注: これは既存の Discourse インストールの IP です。
新しいレコード: A discourse-cdn-cloudfront.yourdomain.com インスタンス IP
新しいレコード: CNAME discourse-cdn.yourdomain.com -> amazonassigned.cloudfront.net
DISCOURSE_S3_CDN_URL
新しいレコード: CNAME s3-cdn-cloudfront.yourdomain.com -> amazonassigned.cloudfront.net
新しいレコード: CNAME s3-cdn.yourdomain.com -> s3-cdn-cloudfront.yourdomain.com
設定の編集 (app.yml) ブランド付き URL
DNS 変更が完了したら、以下の変更を app.yml で行ってください。
CloudFront 配信(amazonassigned.cloudfront.net)にドメイン CNAME を使用している場合は、DISCOURSE_CDN_URL および/または DISCOURSE_S3_CDN_URL を変更してください。
DISCOURSE_CDN_URL: https://discourse-cdn.yourdomain.com
S3 ストレージ設定 (ブランド付き)
## S3 ストレージ設定
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: us-east-1
DISCOURSE_S3_ACCESS_KEY_ID: キーは伏せられています
DISCOURSE_S3_SECRET_ACCESS_KEY: キーは伏せられています
DISCOURSE_S3_CDN_URL: https://s3-cdn.yourdomain.com
DISCOURSE_S3_BUCKET: your-bucket-name-uploads
DISCOURSE_S3_BACKUP_BUCKET: your-bucket-name-backups
DISCOURSE_BACKUP_LOCATION: s3
追加の設定編集 (app.yml)
ブランド付きまたは CloudFront URL のどちらのアプローチを使用する場合でも、後続のリビルド中に状態を最新に保つために、以下の after_assets_precompile セクションが必要です。
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
-you may have more plugins
after_assets_precompile:
- exec:
cd: $home
cmd:
- sudo -E -u discourse bundle exec rake s3:upload_assets
- sudo -E -u discourse bundle exec rake s3:expire_missing_assets
./launcher rebuild app でインスタンスをリビルドしてください。
./launcher rebuild app が正常に完了したら、以下の rake コマンドを実行してください。
./launcher enter app
rake posts:rebake
rake uploads:migrate_to_s3
rake posts:rebake_uncooked_posts
rake s3:upload_assets
rake s3:expire_missing_assets
rake コマンドがエラーなく完了すれば、準備完了です。
一部のサイトでは、初期リビルドが s3:upload_assets に関連するエラーで失敗することがあります。この場合、
アップロードバケットの「read」設定を確認してください。正しく設定されている場合は、
after_assets_precompile セクションをコメントアウトまたは削除してください:
after_assets_precompile:
- exec:
cd: $home
cmd:
- sudo -E -u discourse bundle exec rake s3:upload_assets
- sudo -E -u discourse bundle exec rake s3:expire_missing_assets
その後、./launcher rebuild app を再度実行してください。次に「rake s3:upload_assets」と「rake s3:expire_missing_assets」を実行してください。
両方の rake コマンドがエラーなく完了したら、after_assets_precompile セクションを再度追加またはコメントアウトを解除し、再度リビルドして、上記のすべての rake コマンドを実行してください。
どちらかの rake コマンドでエラーが発生するか、リビルドが再度失敗する場合は、app.yml および/または AWS S3 設定および/または DNS レコードに問題があります。頑張ってください!![]()