2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS CDK】AWS CDK Toolkit LibraryがGAされました(その2)

Posted at

今回のお話

前回の記事で、AWS CDK Toolkit Libraryに関する基本的な使い方を紹介しました。

そこで今回はその続きとして、AWS CDK Toolkit Libraryに関する設定、特に「CDK CLIで行っていたあの機能、AWS CDK Toolkit Libraryではどうやるの?」ということを紹介しようと思います。

なお、AWS CDK Toolkit LibraryのAWS公式サイトはこちら。

※今回紹介予定だったエラーハンドリングについては、諸事情で次回以降に紹介します。

アジェンダ

  • deploy/destoryするスタックを指定するには?
  • cdk.out(クラウドアセンブリ≒CloudFormationテンプレート)ファイルを出力するには?
  • コンテキスト情報を読み込むには?
  • プロファイルを指定するには?  

deploy/destoryするスタックを指定するには?

CDK Toolkit Libraryでdeploydestroy するスタックを指定するには、各メソッドの第2引数の「stacks」に StackSelector を指定してあげればOKです。

具体的にはこんな感じです。

// toolkitやcloudAssemblyはすでに定義済みの前提。以下同じ
import { Toolkit, StackSelectionStrategy } from '@aws-cdk/toolkit-lib';  
  
await toolkit.deploy(cloudAssembly, {
  stacks: {
    strategy: StackSelectionStrategy.PATTERN_MUST_MATCH,
    patterns: [stackName],
    failOnEmpty: true  // デフォルトtrueだから本来は不要
   },
});

StackSelector各プロパティの説明は以下の通りです。

プロパティ 説明 初期値 備考
strategy スタックを検索するパターン なし 入力必須
patterns strategyがMATCH系の値だった場合に、検索するパターンを指定 なし パターン配列形式で複数指定可能。またワイルドカードによる指定も可能
failOnEmpty 検索条件に一致するスタックがなかった場合、エラーをthrowするかどうか true falseの場合エラーなしで終了する。個人的にはtrueでいいと思う

なお、strategy に指定する値は以下の通りです。(StackSelectionStrategy というenumが用意されています。下記では「StackSelectionStrategy」は省略)

説明 備考
ALL_STACKS 全スタックを対象とする
MAIN_ASSEMBLY 現在扱っているクラウドアセンブリのメインのスタック(最上位のスタック)を対象とする
ONLY_SINGLE 現在扱っているクラウドアセンブリにスタックが一つしかない場合、そのスタックを対象とする スタックがない、または複数ある場合はエラーとなる
PATTERN_MATCH patternsに記載したパターンに一致するすべてのスタックを対象とする MATCH系。patternの指定が必須
PATTERN_MUST_MATCH patternsに記載したパターンに最も一致するスタックを対象とする MATCH系。patternの指定が必須。
一致するスタックがない場合はエラーとなる。もっとも一致するスタックが複数ある場合はそれらがすべて対象となる
PATTERN_MUST_MATCH_SINGLE patternsに記載したパターンに最も一致する1つのスタックのみを対象とする MATCH系。patternの指定が必須。
スタックがない、または複数ある場合はエラーとなる

cdk.out(クラウドアセンブリ ≒ CloudFormationテンプレート)ファイルを出力するには?

CDK CLIでは、cdk synthcdk deploy を行った際「cdk.out」というクラウドアセンブリファイル(≒CloudFormationテンプレートファイル)が出力されました。

しかしCDK Toolkit Libraryの場合、クラウドアセンブリを fromAssemblyBuilderfromAssemblyDirectory で作成した場合、これが出力されません。(fromCdkApp で作成した場合は出力されます)

この「cdk.out」ファイルを必ず出力させる方法ですが、fromAssemblyBuilder の第2引数の「outdir」プロパティにcdk.outファイルのパスを指定することで出力可能です。1

const assembly = await toolkit.fromAssemblyBuilder(async () => {
  const app = new App();
  new HogeStack(app, 'HogeStack');
  return app.synth();
}, {
  // こんな感じ
  outdir: path.resolve(__dirname, './cdk.out'),
});

コンテキスト情報を読み込むには?

CDK CLIでは「cdk.json」ファイルにcontext(CDK内部でユーザー定義定数として扱えるキー&値)を設定することで、CDKのデプロイ時などにその値を反映させることができました。

しかし先ほどの「cdk.out」ファイル同様、CDK Toolkit Libraryの場合、クラウドアセンブリを fromAssemblyBuilderfromAssemblyDirectory で作成した場合、これが読み込みされません。(これも fromCdkApp で作成した場合は読み込みされます)

この「cdk.json」を必ず読み込みさせる方法ですが、fromAssemblyBuilder の第2引数の「contextStore」プロパティに CdkAppMultiContext クラスのクラスインスタンスを設定することで可能です。

const assembly = await toolkit.fromAssemblyBuilder(async () => {
  const app = new App();
  new HogeStack(app, 'HogeStack');
  return app.synth();
}, {
  // こんな感じ。
  // cdk.jsonファイルのディレクトリパスを指定する点に注意
  contextStore: new CdkAppMultiContext(path.resolve(__dirname, '.')),
});

また既存のcontext値を上書きしたり、cdk,jsonにない新規のcontext値を設定したい場合、以下の方法で可能です。

  • CdkAppMultiContext クラスコンストラクタの第2引数 commandlineContext にキー&値を設定する。
  • CdkAppMultiContext クラスの update メソッドにキー&値を設定する。
// コンストラクタで上書き
const assembly = await toolkit.fromAssemblyBuilder(async () => {
  const app = new App();
  new HogeStack(app, 'HogeStack');
  return app.synth();
}, {
  contextStore: new CdkAppMultiContext(path.resolve(__dirname, '.'), {
    environment: 'stg';
  }),
});
  
// updateメソッドで上書き
const ctxStore = new CdkAppMultiContext(path.resolve(__dirname, '.'));
ctsStore.update({
  environment: 'prod';
});
  
const assembly = await toolkit.fromAssemblyBuilder(async () => {
  const app = new App();
  new HogeStack(app, 'HogeStack');
  return app.synth();
}, {
  contextStore: ctxStore,
});

なおCDK Toolkit Libraryでのcdk.outやcdk.jsonなどの挙動についての詳細は、AWS Heroの後藤さんがブログにまとめていますので、詳しく知りたい方はそちらもご参照ください。

プロファイルを指定するには?

CDK CLIでは、各種コマンド実行時に --profile オプションでAWS CLIのプロファイル情報を指定することが可能でした。

CDK Toolkit Libraryで実行時にプロファイルを指定するには、前回紹介したように Toolkit コンストラクタ引数の sdkConfig.baseCredentials に下記のように値を設定することで可能です。

なお、AWS公式サイトでは sdkConfig に直接 {profile: 'xxx'} を指定してますが、実際にはこの方法では設定できません(エラーになる)

import { Toolkit, BaseCredentials } from '@aws-cdk/toolkit-lib';
  
// AWS公式サイトでは下記コードが書いてあるが、これだと動かない
const toolkit = new Toolkit({
  sdkConfig: { profile: "xxxxx" },
});
  
// 正しいコードはこちら。
const toolkit = new Toolkit({
  sdkConfig: { 
    baseCredentials: BaseCredentials.awsCliCompatible({ profile: 'xxxxx' }), 
  },
});  

まとめ

以上、AWS CDK Toolkit Libraryの設定についてでした。

とりあえずここまで抑えれば、CDK CLIでできていたことはAWS CDK Toolkit Library一通りできるのではないかと思います。

とはいえまだまだ私もわからないことが多いので、今後も何かわかり次第、ブログなどで展開したいと思います。

なお、次回は今回紹介できなかったエラーハンドリング、そしてややこしい部分である「IIoHost」によるメッセージ&インタラクションについて紹介しようと思います。

最後に

7/12(土)に開催された「AWS CDK Conference Japan 2025」、今年も大盛況でした。

そして、私のセッション「AWS CDK Toolkit Libraryにおけるテストの考え方」を聴いてくださった方、ありがとうございました。

上記セッションの発表資料は、下記URLで公開していますので、よろしければぜひご参照ください。

それでは、今回はこの辺で。

  1. なおfromAssemblyDirectoryはそもそもデプロイに使うクラウドアセンブリファイルを指定するので、わざわざ出力する必要がないと思われます。(次のコンテキスト情報も同じ)

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?