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 diffnpm run cdk deploy すると、AWS-CDK 本体(cdk コマンド) が実行されますが、その際どうやってユーザが書いたスタックを読み込んでいるのか 気になったので調べてみました。

AWS-CDK は v1.146.0 を使いました。 調査には Visual Studio CodeJavaScript Debug Terminal を使いました。

npm run cdk 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() にたどり着きます
  • readCurrentTemplateWithNestedStacks() で deploy 済みのスタックを取得します
  • printStackDiff() で deploy 済みのスタックと cdk.out の差分を表示します

npm run cdk deploy 実行時

deploy() を簡単に見てみましたが、処理の流れは diff() と似たような感じだったです