Skip to content

Datastream用のVPN切り替え手順

Issue

https://fastdoctor.atlassian.net/browse/SRE-1665

  • AWSで1つのVPCに対して1つのVGWしか作成できないことが判明
  • 元々online-karte用にdatastream環境が作成されており、datastreamを追加したい場合に拡張性に欠けるのと名前のずれが発生するため、GCPプロジェクトを共通化させ、Datastreamを移行させる
  • すでにonline-karte用のVGWを利用してonline-opsのDatastreamを稼働させているため、online-opsもVPNを切り替える。

要件

  • online-karteの7am-0amで業務利用があるため、左記の時間を避ける
  • 上記の時間までにはバックフィルが完了し最新データを同期できている状態とする

切り替えイメージ

フェーズ1(事前準備完了時点)

  • datastreamとVPNをfd-datastream-prdにも作成し、既存のプロジェクトと並行でBigqueryに転送する
image

フェーズ2(切り替えメンテ完了時点)

  • 既存のVPNとフェーズ1で作成したVPNを削除し、fd-datastream-prdで新たにVPNを再作成する
image

フェーズ3(片付け完了時点)

  • online-karte-datastream-prdのリソースとプロジェクトを削除する
image

注意事項

  • Datastreamのプロジェクト変更の際はFeatureチームで管理している以下についても変更が必要であるため、事前に依頼をしておくこと
    • DBTの参照先プロジェクトの変更準備とメンテナンス時のデプロイ
    • authorized viewの権限追加

手順

事前準備(Datastream並行稼働)

  1. AWSでonline-karteのDBのSG追加
    1. 以下のPRをapply
  2. online-karteのSecret manager, プロキシ作成
    1. 以下のPRをapply
  3. online-karteのSecret managerにDatastreamユーザーパスワードを登録
    1. GCPのonline-karte-datastreamプロジェクトにログイン
    2. Secrets Managerのdb-user-passwordの値を表示し取得
    3. GCPのfd-datastreamプロジェクトにログインしSecrets Managerにパスワードを格納する
    4. GCPのコンソール上でSecrets Managerに以下を格納する
      1. 設定ルール
        1. 新しいバージョン で追加する
        2. 過去のバージョンは破棄せず無効にすること
      2. 設定対象と値
        1. 設定対象
        • db-user-password
        1. 設定値
        • online-karte-datastreamプロジェクトで取得したDatastreamユーザーパスワード
  4. Datastream用レプリケーションスロット追加(手動設定)
  • (ストリーム開始直前に実施すること)
    1. ssmで踏み台(fd-platform)にログイン

      bash
      aws ssm start-session --target ${ec2のインスタンスID指定} --profile ${AWS_PROFILE} --region ap-northeast-1
    2. DBに接続

      bash
      psql -h ${ライターエンドポイント} -p 5432 -U ${ユーザー名} -d online_karte
    3. レプリケーションスロット追加

      bash
      SELECT PG_CREATE_LOGICAL_REPLICATION_SLOT('datastream_replication_slots', 'pgoutput');
      
      SELECT slot_name, plugin, slot_type, active, confirmed_flush_lsn
       FROM pg_replication_slots;
  1. Datasteam, Bigqueryのデータセットの追加

  2. GCPコンソールでDatastream手動実行(事前にFeatureチームと実行タイミング調整しておく)

    1. Datastreamのタスクを実行
    2. バックフィルが完了することを確認

監視設定

  1. GCPでモニタリングポリシー追加

事前準備(切り替えPR作成)(全てメンテ当日にapplyする)

  1. 以下のPRのレビューを終えておく
    • online-karte専用VPN削除
      • ログ保全のためstate rmする
        bash
        terraform state rm 'module.gcp-vpn.aws_cloudwatch_log_group.tunnel1_logs[0]'
        terraform state rm 'module.gcp-vpn.aws_cloudwatch_log_group.tunnel2_logs[0]'
      • stg
      • prd
    • AWS VPN切り替え
    • [GCP]fd-datastreamのVPN再作成のため一時的にコメントアウト
    • 切り戻し用のonline-karte-datastream VPN削除

事前準備(Featureチームで実施)

  • FeatureチームでDBTの参照先変更を準備してもらう 参考PR
    • デプロイはメンテナンス時に実施
  • authorized viewの権限追加してもらう 参考PR
    • applyまでしておく

メンテ作業(1時間を想定)

  • 作業開始
    • 加藤さんに連絡
  • datastreamタスクの一時停止
    • online-karte-datastreamのタスクを一時停止
    • fd-datastreamのonline-karteタスクを一時停止
    • fd-datastreamのonline-opsタスクを一時停止
    • 上記3つのステータスが一時停止 になっていることを確認
  • GCP fd-datastreamの VPN削除
    • マージせずにブランチでapply
  • AWS fd-datastream用の VPN削除
    • マージせずにブランチでapply
  • AWS online-karte-service用のVPN削除
  • GCP fd-datastreamのVPN GW作成
    • マージせずにブランチでapply
  • AWS commonディレクトリでVPN作成
  • AWSの事前共有キーの登録
    1. AWSコンソールにログインする
    2. VPN接続 に遷移しfd-datastream-vpn-connectionのVPNを選択
    3. 設定をダウンロード をクリックし、ベンダー・プラットフォームをGenericに設定
    4. ikev2を指定
    5. ダウンロードをクリック
    6. ダウンロードしたファイルを開く
    7. 以下2つの事前共有キーを確認する
      1. IPsec Tunnel #1
        1. #1: Internet Key Exchange Configuration
          1. Pre-shared Key
      2. IPsec Tunnel #2
        1. #2: Internet Key Exchange Configuration
          1. Pre-shared Key
    8. GCPのコンソール上でSecrets Managerに以下を格納する
      1. 設定ルール
        1. 新しいバージョン で追加する
        2. 過去のバージョンは破棄せず無効にすること(terraformで新規作成の差分が出るため)
      2. 設定対象と値
        1. AWSのトンネル1の事前共有キー(aws-vpn0-tunnel1)
          1. 前の手順で確認したIPsec Tunnel #1Pre-shared Keyを格納
        2. AWSのトンネル2の事前共有キー(aws-vpn0-tunnel2)
          1. 前の手順で確認したIPsec Tunnel #2Pre-shared Keyを格納
  • GCP fd-datastreamディレクトリでVPNトンネル作成
    • developブランチでapply
  • AWS,GCPのVPNトンネルのステータスが正常であること確認
  • GCP fd-datastreamのdetastreamを開始
    • ステータスが実行中 になることを確認
    • ストリームの詳細画面からオブジェクトタブに遷移
    • バックフィルのステータスを確認し全てが完了していることを確認
  • DBTの切り替え
    • 加藤さんに連絡しDBTの参照先プロジェクトを切り替えてもらう
  • 作業完了

メンテ時の切り戻し作業

  1. AWS commonディレクトリの VPN削除
    • 以下のモジュールをコメントアウトしapply
  2. GCP online-karte-datastreamディレクトリでVPNを削除
    • マージせずにブランチでをapply
  3. GCP fd-datastreamディレクトリの VPN削除
    • マージせずにブランチでPR をapply
  4. GCP online-karte-datastreamディレクトリでVPN GW作成
    • マージせずにブランチでPR をapply
  5. AWS online-karteのVPN作成
    1. online-karte専用VPN削除PR をリバートして適用
  6. AWSの事前共有キーの登録
    1. AWSコンソールにログインする
    2. VPN接続 に遷移しonline-karte-vpn-connectionのVPNを選択
    3. 設定をダウンロード をクリックし、ベンダー・プラットフォームをGenericに設定
    4. ikev2を指定
    5. ダウンロードをクリック
    6. ダウンロードしたファイルを開く
    7. 以下2つの事前共有キーを確認する
      1. IPsec Tunnel #1
        1. #1: Internet Key Exchange Configuration
          1. Pre-shared Key
      2. IPsec Tunnel #2
        1. #2: Internet Key Exchange Configuration
          1. Pre-shared Key
    8. GCP online-karte-datastreamのコンソール上でSecrets Managerに以下を格納する
      1. 設定ルール
        1. 新しいバージョン で追加する
        2. 過去のバージョンは破棄せず無効にすること(terraformで新規作成の差分が出るため)
      2. 設定対象と値
        1. AWSのトンネル1の事前共有キー(aws-vpn0-tunnel1)
          1. 前の手順で確認したIPsec Tunnel #1Pre-shared Keyを格納
        2. AWSのトンネル2の事前共有キー(aws-vpn0-tunnel2)
          1. 前の手順で確認したIPsec Tunnel #2Pre-shared Keyを格納
  • GCP online-karte-datastreamでVPNトンネル作成
    • developブランチでapply
  • AWS,GCPのVPNトンネルのステータスが正常であること確認
  • GCP online-karte-datastreamのdetastreamを開始
    • ステータスが実行中 になることを確認
    • ストリームの詳細画面からオブジェクトタブに遷移
    • バックフィルのステータスを確認し全てが完了していることを確認
  • GCP fd-datastreamディレクトリの VPN GW作成
    • マージせずにブランチでPR をapply
  • AWS commonディレクトリで VGWなしのVPN作成
    • 以下のモジュールの参照先をsite-to-site-vpn-cgwに変更(以下の定義参照)

      定義
      hcl
      module "gcp-datastream-vpn" {
        source = "../../template_modules/options/site-to-site-vpn-cgw"
      
        project_name                = var.project_datastream
        vpc_id                      = module.platform-tokyo.vpc_id
        vpc_cidr                    = var.vpc_cidr_tokyo
        destination_ip_address      = var.gcp_private_subnet_ip_range
        customer_gateway_ip_address = [data.terraform_remote_state.gcp_fd_datastream.outputs.gcp_vpn_gw_ip[0]]
        bgp_asn                     = var.gcp_side_asn
        vpn_gateway_id              = data.terraform_remote_state.online_karte.outputs.aws_vgw_id
      
        providers = {
          aws = aws.tokyo
        }
      }
    • applyする

  • AWSの事前共有キーの登録
    1. AWSコンソールにログインする
    2. VPN接続fd-datastream-vpn-connectionのVPNを選択
    3. 設定をダウンロード をクリックし、ベンダー・プラットフォームをGenericに設定
    4. ikev2を指定
    5. ダウンロードをクリック
    6. ダウンロードしたファイルを開く
    7. 以下2つの事前共有キーを確認する
      1. IPsec Tunnel #1
        1. #1: Internet Key Exchange Configuration
          1. Pre-shared Key
      2. IPsec Tunnel #2
        1. #2: Internet Key Exchange Configuration
          1. Pre-shared Key
    8. GCP fd-datastreamのコンソール上でSecrets Managerに以下を格納する
      1. 設定ルール
        1. 新しいバージョン で追加する
        2. 過去のバージョンは破棄せず無効にすること(terraformで新規作成の差分が出るため)
      2. 設定対象と値
        1. AWSのトンネル1の事前共有キー(aws-vpn0-tunnel1)
          1. 前の手順で確認したIPsec Tunnel #1Pre-shared Keyを格納
        2. AWSのトンネル2の事前共有キー(aws-vpn0-tunnel2)
          1. 前の手順で確認したIPsec Tunnel #2Pre-shared Keyを格納
  • GCP fd-datastreamでVPNトンネル作成
    • developブランチでapply
  • AWS,GCPのVPNトンネルのステータスが正常であること確認
  • GCP fd-datastreamのdetastreamを開始
    • ステータスが実行中 になることを確認
    • ストリームの詳細画面からオブジェクトタブに遷移
    • バックフィルのステータスを確認し全てが完了していることを確認

片付け

チケット: https://fastdoctor.atlassian.net/browse/SRE-1691

  • GCP online-karte-datastreamディレクトリで作業
    • リソースを全てdestroy
    • プロジェクトを削除
  • AWS fastdoctor-template/commonディレクトリで作業
    • backend.tfのgcp_online_karteのremote_state削除
  • AWS fastdoctor-template/online-karte-service/sg-associationsディレクトリで作業
    • db-sg-from-datastreamモジュールを削除