カスタムドメイン付きAPIGatewayをダウンタイム無しでアカウント間移行
Social Databank Tech Blog Advent Calendar 2023の19日目です。
今年のもっとも労力に対するリターンが少なかった作業について
経緯
- Webアプリケーションから使用する機能が
foo.example.com
としてAWSアカウントα上でAPIGateway経由のLambdaで稼働している。- APIGatewayとLambdaはServerlessFrameworkで管理されている。
- 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
を設定できない。
- すなわち既にap-northeast-1に
- エンドポイントタイプが
Route53のレコード
- DNSがRoute53の場合、APIGatewayエンドポイントにはAレコードのエイリアス、またはCNAMEレコードで設定する。参照
- Aレコードエイリアスの場合は、他のレコードと共存できるが、他のAWSアカウントのAPIGatewayエンドポイントを参照できない。
- CNAMEレコードの場合は他のAWSアカウントのAPIGatewayエンドポイントを参照できるが、他のレコードと共存できない。
- そのため、ゾーンのrootではCNAMEは設定できない。
以下のようにドメイン移管する場合、既存のカスタムドメインへのレコードを維持できない。
作業手順
foo.example.com
の証明書を取得する
【AWSアカウントβ】カスタムドメインを設定するために、ACMで使えるようにする。
foo.example.com
をregional
にする
【AWSアカウントα】APIGatewayのカスタムドメイン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)に接続できる。
foo.example.com
をap-northeast-1に向き変え
【AWSアカウントβ】これでようやくアカウントβのap-northeast-1のAPIGatewayにfoo.example.com
が設定できる
【AWSアカウントβ】us-east-1の削除・設定の変更
us-east-1のトラフィックが無くなったことを確認できたら、us-east-1にデプロイしたLambdaなど一式を削除。
必要ならばAPIGWカスタムドメインのエンドポイント設定をedge
変更できる。
これで目指した形が得られた。
謝辞
この作業は弊社が加入しているAWSエンタープライズサポートの元、サポートと相談しながら計画を進めました。
いつもお世話になっております。
Discussion