Last updated on

Amplify Gen2 のコードを少し追っかける


こちらは AWS AmplifyとAWS×フロントエンド #AWSAmplifyJP Advent Calendar 2024 の 25日目の記事です。

みなさまこんにちは。tacckです。

2024年11月15日に TSKaigi Kansai 2024 にて登壇する機会をいただきました。

Amplify Gen2 Deep Dive / バックエンドの型をいかにしてフロントエンドへ伝えるか という内容で発表させてもらったので、そこで得た知見を少しまとめたいと思います。

概要

Amplify Gen2 で得られる開発者体験(Developer Experience)の向上のうち、 Sandbox が CDK を実際に呼び出すまでの流れを追ってみました。

結果、 yargs パッケージを使ってCLIとしての実装が行なわれており、 execa パッケージを使って CDK のコマンドを実行する、という流れを読み解くことができました。

内容

起点から CDK コマンド実行箇所までのフロー

コードを追ったファイルのフローは、下記のような形になりました。

image

文字も見えづらいので、さらに概要を記載していきます。

packages/cli/src/

ここが起点です。 実行は npx ampx sandbox と行なうので、 ampx コマンドの実装から読み始めます。

ampx.ts / main_parser_factory.ts

ampx.ts には yargs を使うことを前提として、パーサーの呼び出しと実行が実装されています。

main_parser_factory.ts の方で、オプションの sandbox の場合の実行内容を呼び出すようになっています。

packages/cli/src/commands/sandbox/

sandbox_command_factory.ts / sandbox_command.ts

sandbox オプションの定義と実行内容の登録(の具体的内容としてCDKの呼び出し)を行なう箇所になります。

この辺りは、 yargs の実行処理の登録方法、という感じなので、ぱっと見のコードの繋がりがわかりにくくなっています。 ここは、慣れが必要そう。

packages/sandbox/src/

sandbox_singleton_factory.ts / file_watching_sandbox.ts / sandbox_executor.ts

ここは、 Amplify Gen2 の sandbox らしい動きが具体的に実装されていくところになります。

./amplify ディレクトリ以下のファイル更新を監視し、更新があれば処理を実行、、というのはここで実装されています。

「更新時の実行処理」としてバックエンドのデプロイ処理に繋がっています。

packages/backend-deployer/src/

cdk_deployer_singleton_factory.ts / cdk_deployer.ts

バックエンドのデプロイ処理として、具体的に CDK コマンドやオプションが実装されています。

CDKのバージョンアップなどによってオプションが変更された場合は、ここの実装が変更されることになりそうです。

packages/cli-core/src/package-manager-controller/

ここで、実際の CDK コマンドを呼び出すための処理が実装されています。

途中でパッケージマネージャー(NPMなど)に応じたクラスを挟んで、 execa パッケージの呼び出し処理に繋がっています。

そして、 execa に先に実装された CDK コマンドやオプションが渡されて、無事に CDK が実行されていきます。

感想

sandbox が実装されて便利になった、ということの裏側が、具体的にどのように実装されているのかを知ることができました。

表面的には CDK を呼んでいる、というのはわかっていても、意外と複雑な実装になっていて驚きました。 ただ、それぞれの階層の意味を見ていくと、考えられた階層に分けられているというのもわかります。

例えば、CDKを使わないでデプロイする手段があった場合は、 packages/backend-deployer/src/ このレイヤーにその実装を行なって切り替えられるようにする、というのもイメージがつきます。

今回を契機に Amplify Gen2 の内部のコードを読むための知識を少し手に入れたので、コミットにも挑戦していきたいと思います。