CloudFront削除作業手順書(online-patient-mypage-cdn 本番環境)
概要
対象: online-patient-mypage-cdn(本番環境) 作業内容: CloudFront Distributionの削除(Cloudflareへの移行に伴う) JIRA: SRE-1540
作業目的
- CloudflareをCDNとして採用するため、CloudFrontを削除
- S3ログバケットは監査のため保持
- 段階的に削除し、問題発生時は即座にロールバック可能な状態を維持
前提条件
事前作業(完了していること)
- [ ] Cloudflare側の設定が完了し、ALBへの直接ルーティングが動作確認済み
- [ ] DNS切り替え完了(
p.fstdr.jp→ ALB直接) - [ ] 数日間の動作確認完了(エラー率、レスポンスタイム等に問題なし)
- [ ] Online側の承認取得済み
必要な権限
- AWSアカウント: 本番環境(
967691968827) - Terraform実行権限
- CloudFront管理権限
対象リソース
- CloudFront Distribution ID:
E2XSBRGTB7355C - CloudFront Domain:
d30irruj3anejw.cloudfront.net - Alias:
p.fstdr.jp - S3 Bucket:
online-patient-mypage-prd-cdn-logs
作業時間見積もり
Phase 1(初日): CloudFront無効化
| 作業項目 | 所要時間 |
|---|---|
| 事前連絡 | 5分 |
| CloudFront無効化 | 5-6分 |
| Phase 1 合計 | 約10-15分 |
Phase 2-5(3日後以降): CloudFront削除と後処理
| 作業項目 | 所要時間 |
|---|---|
| terraform state rm | 2分 |
| 事前連絡 | 5分 |
| terraform apply(削除) | 5-6分 |
| tfvars削除 | 2分 |
| 事後確認 | 5分 |
| Phase 2-5 合計 | 約20-25分 |
⚠️ 重要: Phase 1実施後、3日間の監視期間を設けてからPhase 2以降を実施してください。
作業手順
Phase 1: CloudFront無効化
1-1. オンライン事業部への事前連絡(CloudFront無効化)
連絡先: オンライン事業部(Slack: #squad-platform-sre)
連絡内容(テンプレート):
【作業連絡】CloudFront無効化作業開始のお知らせ
お疲れ様です。SREチームです。
これからCloudFrontの無効化作業を開始いたします。
■ 作業概要
- 対象: online-patient-mypage-cdn(本番環境)
- 内容: CloudFront Distributionの無効化
- 影響: なし(既にCloudflare経由でアクセス可能)
■ 作業時間
- 開始予定: [HH:MM]
- 所要時間: 約5-6分
■ ロールバック
- 問題発生時は5-6分で元に戻せます
作業完了後、改めてご報告いたします。確認事項:
- [ ] Slackで作業開始を通知
- [ ] 担当者から了承を得る
1-2. 作業ディレクトリ準備
bash
# 作業ディレクトリ作成
mkdir -p ~/Documents/work/tmp/sre-1540
cd ~/Documents/work/tmp/sre-1540
# 作業ログ開始
script -a work-log-$(date +%Y%m%d-%H%M%S).log1-2. 現在のDistribution設定を取得
bash
# Distribution ID を環境変数に設定
export DISTRIBUTION_ID="E2XSBRGTB7355C"
export AWS_PROFILE="fd-prod"
# 設定を取得
aws cloudfront get-distribution-config \
--id $DISTRIBUTION_ID \
--profile $AWS_PROFILE \
--output json > cloudfront-config.json
# ETagを保存
aws cloudfront get-distribution-config \
--id $DISTRIBUTION_ID \
--profile $AWS_PROFILE \
--query 'ETag' \
--output text > etag.txt
echo "ETag: $(cat etag.txt)"確認事項:
- [ ]
cloudfront-config.jsonファイルが作成された - [ ]
etag.txtファイルが作成された - [ ] ETagが表示された
1-3. 設定ファイルを編集(無効化)
bash
# DistributionConfigを抽出
jq '.DistributionConfig' cloudfront-config.json > cloudfront-config-clean.json
# enabled を false に変更
jq '.Enabled = false' cloudfront-config-clean.json > cloudfront-config-disabled.json
# 変更内容を確認
echo "=== Enabled status ==="
jq '.Enabled' cloudfront-config-disabled.json確認事項:
- [ ]
falseと表示される
1-4. CloudFront無効化を実行
bash
# 無効化開始時刻を記録
echo "無効化開始: $(date '+%Y-%m-%d %H:%M:%S')" | tee -a timeline.txt
# 無効化実行
aws cloudfront update-distribution \
--id $DISTRIBUTION_ID \
--distribution-config file://cloudfront-config-disabled.json \
--if-match "$(cat etag.txt)" \
--profile $AWS_PROFILE \
> update-result.json
echo "無効化コマンド実行完了: $(date '+%Y-%m-%d %H:%M:%S')" | tee -a timeline.txt確認事項:
- [ ] エラーが発生していない
- [ ]
update-result.jsonが作成された
1-5. 無効化完了を待機(5-6分)
bash
echo "無効化処理を待機中(約5-6分)..."
START_TIME=$(date +%s)
while true; do
STATUS=$(aws cloudfront get-distribution \
--id $DISTRIBUTION_ID \
--profile $AWS_PROFILE \
--query 'Distribution.Status' \
--output text)
ENABLED=$(aws cloudfront get-distribution \
--id $DISTRIBUTION_ID \
--profile $AWS_PROFILE \
--query 'Distribution.DistributionConfig.Enabled' \
--output text)
CURRENT_TIME=$(date +%s)
ELAPSED=$((CURRENT_TIME - START_TIME))
ELAPSED_MIN=$((ELAPSED / 60))
ELAPSED_SEC=$((ELAPSED % 60))
echo "[$(date '+%H:%M:%S')] Status: $STATUS | Enabled: $ENABLED | 経過: ${ELAPSED_MIN}分${ELAPSED_SEC}秒"
if [ "$STATUS" = "Deployed" ]; then
echo ""
echo "✓ CloudFront無効化が完了しました!(所要時間: ${ELAPSED_MIN}分${ELAPSED_SEC}秒)"
echo "無効化完了: $(date '+%Y-%m-%d %H:%M:%S')" | tee -a timeline.txt
break
fi
sleep 30
done確認事項:
- [ ] Status が
Deployedになった - [ ] Enabled が
Falseになった - [ ] 所要時間を記録
1-6. 無効化完了の確認
bash
# 最終状態を確認
aws cloudfront get-distribution \
--id $DISTRIBUTION_ID \
--profile $AWS_PROFILE \
--query 'Distribution.{Status:Status,Enabled:DistributionConfig.Enabled,DomainName:DomainName,Aliases:DistributionConfig.Aliases.Items}' \
--output table | tee cloudfront-disabled-status.txt確認事項:
- [ ] Status:
Deployed - [ ] Enabled:
False - [ ] DomainName:
d30irruj3anejw.cloudfront.net - [ ] Aliases:
["p.fstdr.jp"]
Phase 2: S3バケットをTerraform管理から除外
⚠️ 重要: Phase 1(CloudFront無効化)から3日後以降に実施してください
実施タイミング:
- Phase 1でCloudFrontを無効化した日時: [YYYY-MM-DD HH:MM]
- Phase 2の実施可能日時: [無効化から3日後以降]
- 理由: 無効化後の動作安定性を確認するため
確認事項:
- [ ] CloudFront無効化から3日以上経過している
- [ ] その間、サービスに問題が発生していない
- [ ] Datadogメトリクスに異常がない
- [ ] オンライン事業部からの問い合わせがない
2-1. Terraformディレクトリに移動
bash
cd /Users/takahiro.oga/Documents/work/terraform_for_aws/fastdoctor-template/online-patient-mypage-cdn/production2-2. 現在の状態を確認
bash
# S3バケット関連のリソースを確認
terraform state list | grep s3-cdn-logs確認事項:
- [ ] 以下のリソースが表示される:
module.cloudfront.module.s3-cdn-logs.aws_s3_bucket.mainmodule.cloudfront.module.s3-cdn-logs.aws_s3_bucket_acl.mainmodule.cloudfront.module.s3-cdn-logs.aws_s3_bucket_ownership_controls.main
2-3. S3バケットを terraform state から削除
bash
# S3バケット本体
terraform state rm 'module.cloudfront.module.s3-cdn-logs.aws_s3_bucket.main'
# S3バケットACL
terraform state rm 'module.cloudfront.module.s3-cdn-logs.aws_s3_bucket_acl.main'
# S3バケット所有権コントロール
terraform state rm 'module.cloudfront.module.s3-cdn-logs.aws_s3_bucket_ownership_controls.main'確認事項:
- [ ] 各コマンドが
Successfully removedと表示された - [ ] 3つのリソースすべてが削除された
2-4. 削除されたことを確認
bash
# S3関連のリソースが残っていないことを確認
terraform state list | grep s3-cdn-logs
# 何も表示されなければOK確認事項:
- [ ] S3関連のリソースが表示されない
2-5. S3バケットがAWSに存在することを確認
bash
# バケットがAWSに存在することを確認(監査ログとして保持)
aws s3 ls s3://online-patient-mypage-prd-cdn-logs/ \
--profile fd-prod \
--recursive \
--human-readable \
--summarize確認事項:
- [ ] バケットが存在する
- [ ] ログファイルが保存されている
Phase 3: CloudFront削除
3-1. オンライン事業部への事前連絡(CloudFront削除)
連絡先: オンライン事業部(Slack: #squad-platform-sre)
連絡内容(テンプレート):
【作業連絡】CloudFront削除作業開始のお知らせ
お疲れ様です。SREチームです。
CloudFront無効化が完了しましたので、これからCloudFrontの削除作業を開始いたします。
■ 作業概要
- 対象: online-patient-mypage-cdn(本番環境)
- 内容: CloudFront Distributionの完全削除
- 影響: なし(既に無効化済み)
■ 作業時間
- 開始予定: [HH:MM]
- 所要時間: 約5-6分
■ 注意事項
- この操作後は元に戻せません
- 問題があった場合は再作成が必要(ドメイン名が変わります)
作業完了後、改めてご報告いたします。確認事項:
- [ ] Slackで作業開始を通知
- [ ] 担当者から了承を得る
- [ ] 削除の最終確認を得る
3-2. Terraform planで削除対象を確認
bash
# 削除対象を確認
terraform plan -var-file=terraform.tfvars
# 以下が削除されることを確認:
# - module.cloudfront.module.cloudfront.aws_cloudfront_distribution.main
# - module.policy-allow-github-actions.aws_iam_policy.policy
# - module.policy-attach.aws_iam_role_policy_attachment.main確認事項:
- [ ] CloudFront Distribution が削除対象に含まれる
- [ ] IAMポリシー関連が削除対象に含まれる
- [ ] S3バケットが削除対象に含まれない(重要)
- [ ]
Plan: 0 to add, 0 to change, 3 to destroyと表示される
3-3. CloudFront削除を実行
bash
# 削除開始時刻を記録
echo "CloudFront削除開始: $(date '+%Y-%m-%d %H:%M:%S')" | tee -a ~/Documents/work/tmp/sre-1540/timeline.txt
# 削除実行
terraform apply -var-file=terraform.tfvars -auto-approve
echo "CloudFront削除完了: $(date '+%Y-%m-%d %H:%M:%S')" | tee -a ~/Documents/work/tmp/sre-1540/timeline.txt所要時間: 約5-6分(Terraformが自動で無効化→削除を実行)
確認事項:
- [ ] エラーが発生していない
- [ ]
Apply complete! Resources: 0 added, 0 changed, 3 destroyed.と表示される
3-4. CloudFront削除の確認
bash
# CloudFrontが削除されたことを確認
aws cloudfront get-distribution \
--id $DISTRIBUTION_ID \
--profile fd-prod
# 期待される結果: NoSuchDistribution エラー確認事項:
- [ ]
NoSuchDistributionエラーが表示される - [ ] CloudFrontが削除された
Phase 4: tfvarsファイルの削除
4-1. tfvarsファイルをS3から削除
bash
# S3バケット内のtfvarsファイルを確認
aws s3 ls s3://fd-production-tfvars-files/online-patient-mypage-cdn/ \
--profile fd-prod \
--recursive
# tfvarsファイルを削除
aws s3 rm s3://fd-production-tfvars-files/online-patient-mypage-cdn/terraform.tfvars \
--profile fd-prod確認事項:
- [ ]
delete: s3://fd-production-tfvars-files/online-patient-mypage-cdn/terraform.tfvarsと表示される
4-2. 削除されたことを確認
bash
# ファイルが削除されたことを確認
aws s3 ls s3://fd-production-tfvars-files/online-patient-mypage-cdn/ \
--profile fd-prod \
--recursive
# 何も表示されなければOK(または他のファイルのみ表示される)確認事項:
- [ ] terraform.tfvars が表示されない
Phase 5: 事後確認
5-1. サービス動作確認
bash
# ALB経由でアクセスできることを確認
curl -I https://p.fstdr.jp
# 期待される結果: 200 OK確認事項:
- [ ] HTTPステータス 200 が返ってくる
- [ ] CloudFrontヘッダーが含まれない(
X-Cache,X-Amz-Cf-*など)
5-2. Datadogでメトリクス確認
- [ ] エラー率に変化がない
- [ ] レスポンスタイムに大きな変化がない
- [ ] アラートが発火していない
5-3. 作業完了報告
Slack通知(テンプレート):
【作業完了】CloudFront削除作業完了のお知らせ
お疲れ様です。SREチームです。
CloudFront削除作業が完了しましたのでご報告いたします。
■ 作業結果
- CloudFront Distribution: 削除完了
- S3ログバケット: 保持(監査用)
- サービス動作: 正常
- ユーザー影響: なし
■ 作業時間
- 開始: [HH:MM]
- 終了: [HH:MM]
- 所要時間: XX分
■ 確認事項
- サービスは正常にアクセス可能です
- Cloudflare経由で正常に動作しています
- エラー率、レスポンスタイムに問題ありません
引き続き監視を継続いたします。
作業は以上となります。確認事項:
- [ ] Slackで作業完了を通知
- [ ] 担当者から了承を得る
ロールバック手順(緊急時)
想定されるロールバックシナリオ
シナリオ1: CloudFront無効化後、サービスに問題が発生した場合 対応: CloudFrontを再有効化
シナリオ2: CloudFront削除後、問題が発覚した場合 対応: Terraformで再作成(ドメイン名が変わる)
ロールバック手順1: CloudFront再有効化(5-6分)
CloudFront無効化後、削除前であればこの手順で元に戻せます。
bash
cd ~/Documents/work/tmp/sre-1540
# 最新のETagを取得
aws cloudfront get-distribution-config \
--id E2XSBRGTB7355C \
--profile fd-prod \
--query 'ETag' \
--output text > etag-new.txt
# enabled を true に戻す
jq '.Enabled = true' cloudfront-config-clean.json > cloudfront-config-enabled.json
# 再有効化実行
echo "再有効化開始: $(date '+%Y-%m-%d %H:%M:%S')"
aws cloudfront update-distribution \
--id E2XSBRGTB7355C \
--distribution-config file://cloudfront-config-enabled.json \
--if-match "$(cat etag-new.txt)" \
--profile fd-prod
# 完了待機(5-6分)
echo "再有効化処理を待機中(約5-6分)..."
START_TIME=$(date +%s)
while true; do
STATUS=$(aws cloudfront get-distribution \
--id E2XSBRGTB7355C \
--profile fd-prod \
--query 'Distribution.Status' \
--output text)
ENABLED=$(aws cloudfront get-distribution \
--id E2XSBRGTB7355C \
--profile fd-prod \
--query 'Distribution.DistributionConfig.Enabled' \
--output text)
CURRENT_TIME=$(date +%s)
ELAPSED=$((CURRENT_TIME - START_TIME))
ELAPSED_MIN=$((ELAPSED / 60))
ELAPSED_SEC=$((ELAPSED % 60))
echo "[$(date '+%H:%M:%S')] Status: $STATUS | Enabled: $ENABLED | 経過: ${ELAPSED_MIN}分${ELAPSED_SEC}秒"
if [ "$STATUS" = "Deployed" ]; then
echo ""
echo "✓ CloudFront再有効化が完了しました!(所要時間: ${ELAPSED_MIN}分${ELAPSED_SEC}秒)"
echo "再有効化完了: $(date '+%Y-%m-%d %H:%M:%S')"
break
fi
sleep 30
done所要時間: 5-6分
チェックリスト
作業前チェックリスト
- [ ] 事前作業(Cloudflare設定、DNS切り替え)完了
- [ ] online側承認取得
- [ ] 作業時間の調整(メンテナンスウィンドウ確認)
作業中チェックリスト
- [ ] Phase 1: オンライン事業部への事前連絡(CloudFront無効化)
- [ ] Phase 1: CloudFront無効化完了(5-6分)
- [ ] Phase 2: S3バケット terraform state rm 完了
- [ ] Phase 3: オンライン事業部への事前連絡(CloudFront削除)
- [ ] Phase 3: CloudFront削除完了(5-6分)
- [ ] Phase 4: tfvars削除完了
- [ ] Phase 5: サービス動作確認完了
作業後チェックリスト
- [ ] サービスが正常にアクセス可能
- [ ] オンライン事業部への作業完了報告
- [ ] 作業ログのアーカイブ
- [ ] JIRAチケットのクローズ
- [ ] ドキュメント更新(必要に応じて)
参考情報
関連ドキュメント
- CloudFront公式ドキュメント: https://docs.aws.amazon.com/cloudfront/
- Terraform AWS Provider: https://registry.terraform.io/providers/hashicorp/aws/latest/docs
関連チケット
- JIRA: SRE-1540
作業履歴
- 2026-01-22: infra-dev環境で作業完了(検証)
- YYYY-MM-DD: production環境で作業予定
作成日: 2026-01-22 チーム: [SRE] 作成者: [大賀] 最終更新日: 2026-01-22