🚢

カスタムドメイン付きAPIGatewayをダウンタイム無しでアカウント間移行

2023/12/19に公開

Social Databank Tech Blog Advent Calendar 2023の19日目です。

今年のもっとも労力に対するリターンが少なかった作業について

経緯

  • Webアプリケーションから使用する機能がfoo.example.comとしてAWSアカウントα上でAPIGateway経由のLambdaで稼働している。
  • Lambdaのコードも老朽化していたため、機能を作り直すことになった。
    • またこの機能を別のAWSアカウントβへ切り出すことになった。
  • AWSアカウントβに新版のLambda等一式をデプロイした。
  • foo.example.comをAWSアカウントβに向き変えようとしたが、次項に述べる障壁によってうまくいかなかった。
  • 仕方が無いので、新たにbar.example.comを発行し、Webアプリケーションからの参照を切り替えた。
  • 1年経つも、foo.example.comのトラフィックは無くならず、また旧Lambdaで使用しているのランタイムのサポート終了が通知された。

ゴール

  • 旧Lambdaを廃止し、AWSアカウントβのみで運用されている状態にする。
  • foo.example.comは廃止せず、新Lambdaに流す。

障壁

APIGatewayのカスタムドメイン

  • AWSアカウントβのAPIGatewayのカスタムドメインにfoo.example.comを追加すれば済むように見えるが...
    • エンドポイントタイプがedge(エッジ最適化)の場合は、全アカウント全リージョンで1つしか存在できない。
      • すなわち既にfoo.example.comが存在しているとき他アカウントでfoo.example.comを設定できない。
    • エンドポイントタイプがregional(リージョナル)の場合は、APIGatewayの存在するリージョンで、全アカウントで1つしか存在できない。
      • すなわち既にap-northeast-1にfoo.example.comが存在しているとき他アカウントのap-northeast-1にfoo.example.comを設定できない。

Route53のレコード

  • DNSがRoute53の場合、APIGatewayエンドポイントにはAレコードのエイリアス、またはCNAMEレコードで設定する。参照
    • Aレコードエイリアスの場合は、他のレコードと共存できるが、他のAWSアカウントのAPIGatewayエンドポイントを参照できない。
    • CNAMEレコードの場合は他のAWSアカウントのAPIGatewayエンドポイントを参照できるが、他のレコードと共存できない。
      • そのため、ゾーンのrootではCNAMEは設定できない。

以下のようにドメイン移管する場合、既存のカスタムドメインへのレコードを維持できない。

作業手順

【AWSアカウントβ】foo.example.comの証明書を取得する

カスタムドメインを設定するために、ACMで使えるようにする。

【AWSアカウントα】APIGatewayのカスタムドメインfoo.example.comregionalにする

ap-northeast-1以外のリージョンでfoo.example.comをカスタムドメインへ設定できるようにする。
ほとんどのユースケースでは、エッジ最適化とリージョンの違いは問題にならないだろう。参照

【AWSアカウントβ】新Lambdaをus-east-1にデプロイする

ap-northeast-1以外のリージョン、今回はus-east-1へデプロイする。
これは一時的にトラフィックを退避させるためのものになる。
カスタムドメインの設定こちらもregionalにする。

疎通確認を行う

  • us-east-1のAPIGWカスタムドメインで発行されたエンドポイントをdigしてIPを得る。
  • 得られたIPをfoo.example.comのホストとしてhostsファイルに書き込めば、foo.example.comとして新Lambda(us-east-1)に接続できる。

foo.example.comのドメイン移管を行う

AWSアカウントβで、foo.example.comをAPIGatewayのカスタムドメインを参照するゾーンを設定し、
AWSアカウントαからfoo.example.comを移管する。
このタイミングで動作するLambdaが旧から新に変わる。

AWSアカウントα側の旧Lambdaへのトラフィックが無くなったことを確認できたら次へ

【AWSアカウントα】APIGWカスタムドメインの削除

AWSアカウントαに残ったAPIGWカスタムドメインfoo.example.comを消去する。
ロールバックを考えないならばこの段階でLambdaやAPIGatewayも不要なので消去してもよい

【AWSアカウントβ】APIGWカスタムドメインの設定

これでAWSアカウントβのap-northeast-1のAPIGatewayにfoo.example.comが設定できる

疎通確認を行う2

  • ap-northeast-1のAPIGWカスタムドメインで発行されたエンドポイントをdigしてIPを得る。
  • 得られたIPをfoo.example.comのホストとしてhostsファイルに書き込めば、foo.example.comとして新Lambda(ap-northeast-1)に接続できる。

【AWSアカウントβ】foo.example.comをap-northeast-1に向き変え

これでようやくアカウントβのap-northeast-1のAPIGatewayにfoo.example.comが設定できる

【AWSアカウントβ】us-east-1の削除・設定の変更

us-east-1のトラフィックが無くなったことを確認できたら、us-east-1にデプロイしたLambdaなど一式を削除。
必要ならばAPIGWカスタムドメインのエンドポイント設定をedge変更できる。

これで目指した形が得られた。

謝辞

この作業は弊社が加入しているAWSエンタープライズサポートの元、サポートと相談しながら計画を進めました。
いつもお世話になっております。

ソーシャルデータバンク テックブログ

Discussion