Skip to content

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 rm2分
事前連絡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).log

1-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/production

2-2. 現在の状態を確認

bash
# S3バケット関連のリソースを確認
terraform state list | grep s3-cdn-logs

確認事項:

  • [ ] 以下のリソースが表示される:
    • module.cloudfront.module.s3-cdn-logs.aws_s3_bucket.main
    • module.cloudfront.module.s3-cdn-logs.aws_s3_bucket_acl.main
    • module.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チケットのクローズ
  • [ ] ドキュメント更新(必要に応じて)

参考情報

関連ドキュメント

関連チケット

作業履歴

  • 2026-01-22: infra-dev環境で作業完了(検証)
  • YYYY-MM-DD: production環境で作業予定

作成日: 2026-01-22 チーム: [SRE] 作成者: [大賀] 最終更新日: 2026-01-22