kdnakt blog

hello there.

aws-cdkをバージョンアップした話とか

f:id:kidani_a:20190204072421j:plain

CloudFormationを素のyamljsonで書くのは辛い……と思っていたところ、2018年夏にaws-cdkに出会った。

 

github.com

aws-cdkはTypeScriptとJavaでCloudFormationを実装することができる素敵ツールである。最近はC#や素のJavaScriptでも実装できるようになったらしい。

 

 

[突然のaws-cdkバージョンアップ]

aws-cdkに出会った当時はv0.8.xだったはずが、いつの間にかv0.22.xになっていた……。と思ったら、v0.22.xだったのは先週までで、今週にはもうv0.23.0がリリースされていた。

 

aws-cdk本体のバージョンが古い状態で、新しいプロジェクトを作る。

$ cdk --version
0.22.0 (build 644ebf5)
$ mkdir cdk
$ cd cdk
$ cdk init --language=typescript
Applying project template app for typescript
Initializing a new git repository...
Executing npm install...
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN cdk@0.1.0 No repository field.
npm WARN cdk@0.1.0 No license field.

# Useful commands

 * `npm run build`   compile typescript to js
 * `npm run watch`   watch for changes and compile
 * `cdk deploy`      deploy this stack to your default AWS account/region
 * `cdk diff`        compare deployed stack with current state
 * `cdk synth`       emits the synthesized CloudFormation template

 

そこに、追加のライブラリ(今回はCloudWatch)をインストールしようとするとワーニングが表示された。

$ npm i @aws-cdk/aws-cloudwatch
npm WARN @aws-cdk/aws-cloudwatch@0.23.0 requires a peer of @aws-cdk/cdk@^0.23.0 but none is installed. You must install peer dependencies yourself.
npm WARN @aws-cdk/aws-iam@0.23.0 requires a peer of @aws-cdk/cdk@^0.23.0 but none is installed. You must install peer dependencies yourself.
npm WARN cdk@0.1.0 No repository field.
npm WARN cdk@0.1.0 No license field.

+ @aws-cdk/aws-cloudwatch@0.23.0
added 22 packages from 7 contributors and audited 563 packages in 5.661s
found 0 vulnerabilities

 

何か嫌な予感がするのと、パッケージのアップグレード手順に不安があったので、今後のためにも手順を確認しておくことに。

 

[npm-check-updatesでアップグレードを試みる]

調べてみるとこちらの記事が参考になった。

dackdive.hateblo.jp

 

まずは以下のコマンドでnpm-check-updatesをインストールする。

$ npm i -g npm-check-updates

 

対象のパッケージを指定してコマンドを実行してみると……。

$ ncu -g aws-cdk
⸨░░░░░░░░░░░░░░░░░░⸩ ⠋ :
 aws-cdk  0.22.0  →  0.23.0 

ncu itself cannot upgrade global packages. Run the following to upgrade all global packages: 

npm -g install aws-cdk@0.23.0

 

ncuではグローバルなパッケージのアップグレードをできないから自分でコマンドを打てとある。

 

[グローバルなパッケージをnpmでアップグレードする]

というわけで、指定されたコマンドをコピペで実行する。

$ npm -g install aws-cdk@0.23.0
/usr/local/bin/cdk -> /usr/local/lib/node_modules/aws-cdk/bin/cdk
+ aws-cdk@0.23.0
added 1 package from 2 contributors, removed 3 packages and updated 8 packages in 14.843s

 

無事に最新バージョン(v0.23.0)にアップグレードできた。これで今後新しくプロジェクトをinitする際には最新バージョンのcdkを利用することがでいる。

 

ついでに、@aws-cdk/aws-logsも使いたいので、プロジェクトにインストールを試みる。

$ npm i @aws-cdk/aws-logs
npm WARN @aws-cdk/aws-cloudwatch@0.23.0 requires a peer of @aws-cdk/cdk@^0.23.0 but none is installed. You must install peer dependencies yourself.
npm WARN @aws-cdk/aws-iam@0.23.0 requires a peer of @aws-cdk/cdk@^0.23.0 but none is installed. You must install peer dependencies yourself.
npm WARN @aws-cdk/aws-logs@0.23.0 requires a peer of @aws-cdk/cdk@^0.23.0 but none is installed. You must install peer dependencies yourself.
npm WARN cdk@0.1.0 No repository field.
npm WARN cdk@0.1.0 No license field.

+ @aws-cdk/aws-logs@0.23.0
added 11 packages from 7 contributors and audited 607 packages in 3.726s
found 0 vulnerabilities

 

まだワーニングが表示される。おや、と思ってpackage.jsonを確認すると、こちらのaws-cdkと@aws-cdk/cdkのバージョンが古いままだった。

$ cat package.json 
{
  "name": "cdk",
  "version": "0.1.0",
  "bin": {
    "cdk": "bin/cdk.js"
  },
  "scripts": {
    "build": "tsc",
    "watch": "tsc -w",
    "cdk": "cdk"
  },
  "devDependencies": {
    "@types/node": "^8.9.4",
    "typescript": "^3.1.2",
    "aws-cdk": "^0.22.0"
  },
  "dependencies": {
    "@aws-cdk/aws-cloudwatch": "^0.23.0",
    "@aws-cdk/aws-logs": "^0.23.0",
    "@aws-cdk/cdk": "^0.22.0"
  }
}

 

[プロジェクトのパッケージをncuでアップグレードする]

今度はncuが使えそうなので試してみることに。

aws-cdkと@aws-cdk/cdkの2つを最新版にする。

$ ncu -u aws-cdk
Using /Users/akito/Develop/sandbox/cdk/package.json
⸨░░░░░░░░░░░░░░░░░░⸩ ⠇ :
 aws-cdk  ^0.22.0  →  ^0.23.0 
Upgraded /Users/akito/Develop/sandbox/cdk/package.json

$ ncu -u @aws-cdk/cdk
Using /Users/akito/Develop/sandbox/cdk/package.json
⸨░░░░░░░░░░░░░░░░░░⸩ ⠹ :
 @aws-cdk/cdk  ^0.22.0  →  ^0.23.0 
Upgraded /Users/akito/Develop/sandbox/cdk/package.json

 

無事完了したらしい。package.jsonも確かに更新されていた。

$ cat package.json 
{
  "name": "cdk",
  "version": "0.1.0",
  "bin": {
    "cdk": "bin/cdk.js"
  },
  "scripts": {
    "build": "tsc",
    "watch": "tsc -w",
    "cdk": "cdk"
  },
  "devDependencies": {
    "@types/node": "^8.9.4",
    "typescript": "^3.1.2",
    "aws-cdk": "^0.23.0"
  },
  "dependencies": {
    "@aws-cdk/aws-cloudwatch": "^0.23.0",
    "@aws-cdk/aws-logs": "^0.23.0",
    "@aws-cdk/cdk": "^0.23.0"
  }
}

 

最後に先ほどのブログにも注意点として書かれていたように、npm updateを実行して完了。

$ npm update
npm WARN cdk@0.1.0 No repository field.
npm WARN cdk@0.1.0 No license field.

+ @aws-cdk/cdk@0.23.0
removed 261 packages, updated 3 packages and audited 78 packages in 4.144s
found 0 vulnerabilities

 

[まとめ]

  • aws-cdk楽しい(手でCloudFormation書くよりは)
  • npmのグローバルパッケージはnpmでアップグレードできる
  • package.jsonの更新はnpm-check-updates (ncu)でやると楽
  • package.json更新後npm updateを忘れずに
  • SAMとかTerraform使ったことがないので今度試して比較したい

 

aws-cdk楽しい、という話を社内のSAPに話したら、「素のCloudformationを使うことによってAWS認定試験対策になるとポジティブに考えろ」と言われた。ショウジンシマス……。