AWS-CDK 本体がどうやってユーザが書いたスタックを読み込んでいるか調べた
最近、仕事で AWS-CDK を触っています。 AWS-CDK ではユーザは以下のようにスタックを書いて、AWS リソースを作成します。
import * as cdk from '@aws-cdk/core'; import * as s3 from '@aws-cdk/aws-s3'; export class CdkTestStack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); new s3.Bucket(this, 'Bucket', {}); } }
npm run cdk diff
や npm run cdk deploy
すると、AWS-CDK 本体(cdk コマンド)
が実行されますが、その際どうやってユーザが書いたスタックを読み込んでいるのか
気になったので調べてみました。
AWS-CDK は v1.146.0 を使いました。 調査には Visual Studio Code の JavaScript Debug Terminal を使いました。
npm run cdk diff 実行時
npm run cdk diff
でnode_modules/.bin/cdk
が実行されますnode_modules/.bin/cdk
はnode_modules/aws-cdk/bin/cdk
へのシンボリックリンクです- 参考: npm パッケージを CLI ツールとして機能させる仕組みについて - 30歳からのプログラミング
- node_modules/aws-cdk/bin/cdk から cdk.ts が実行されます
- cdk.ts からコードを追っていくと diff() にたどり着きます
diff() の動作
この関数で cdk diff
の結果を表示しています。重要そうなコードだけ抜き出します。実装は diff() を参照してください。
public async diff(options: DiffOptions): Promise<number> { const stacks = await this.selectStacksForDiff(options.stackNames, options.exclusively); //... // Compare N stacks against deployed templates for (const stack of stacks.stackArtifacts) { stream.write(format('Stack %s\n', chalk.bold(stack.displayName))); const currentTemplate = await this.props.cloudFormation.readCurrentTemplateWithNestedStacks(stack); diffs += options.securityOnly ? numberFromBool(printSecurityDiff(currentTemplate, stack, RequireApproval.Broadening)) : printStackDiff(currentTemplate, stack, strict, contextLines, stream); } // ... }
ユーザが書いたスタックの読み込み
selectStacksForDiff()
を追っていくと execProgram() にたどり着きます- L54 の
const app = config.settings.get(['app']);
により cdk.json の app が読み込まれます。コマンド引数--app
で指定することも可能です- この動作は https://docs.aws.amazon.com/cdk/v1/guide/cli.html#cli-app-command で説明されています
- ここでは例として
--app='npx ts-node bin/hello-cdk.ts'
とします
- L82 の
await exec(commandLine.join(' '));
でnpx ts-node bin/hello-cdk.ts
が実行され、結果が cdk.out に出力されます- この動作は https://docs.aws.amazon.com/cdk/v1/guide/cli.html#cli-synth で説明されています
- L54 の
readCurrentTemplateWithNestedStacks()
で deploy 済みのスタックを取得しますprintStackDiff()
で deploy 済みのスタックと cdk.out の差分を表示します
npm run cdk deploy 実行時
deploy() を簡単に見てみましたが、処理の流れは diff() と似たような感じだったです