aws-cdk(typescript)のテストで RangeError: Maximum call stack size exceededが出た
現象
cdkコマンドでコードを自動生成した後に以下のようなサンプルのテストコードがついてきます
import { expect as expectCDK, matchTemplate, MatchStyle, } from "@aws-cdk/assert"; import * as cdk from "@aws-cdk/core"; import * as multiAz from "../lib/multiAz-stack"; test("Empty Stack", () => { const app = new cdk.App(); // WHEN const stack = new multiAz.MultiAZStack(app, "MyTestStack"); // THEN expectCDK(stack).to( matchTemplate( { Resources: {}, }, MatchStyle.EXACT ) ); });
npm test
を入力すると RangeError: Maximum call stack size exceeded
でテストができませんでした
at deepCopy (node_modules/@aws-cdk/cloudformation-diff/lib/diff-template.ts:170:14) at deepCopy (node_modules/@aws-cdk/cloudformation-diff/lib/diff-template.ts:176:18) at deepCopy (node_modules/@aws-cdk/cloudformation-diff/lib/diff-template.ts:176:18) at Array.map (<anonymous>) at deepCopy (node_modules/@aws-cdk/cloudformation-diff/lib/diff-template.ts:170:14) at deepCopy (node_modules/@aws-cdk/cloudformation-diff/lib/diff-template.ts:176:18) at deepCopy (node_modules/@aws-cdk/cloudformation-diff/lib/diff-template.ts:176:18) at Array.map (<anonymous>) at deepCopy (node_modules/@aws-cdk/cloudformation-diff/lib/diff-template.ts:170:14) at deepCopy (node_modules/@aws-cdk/cloudformation-diff/lib/diff-template.ts:176:18) at deepCopy (node_modules/@aws-cdk/cloudformation-diff/lib/diff-template.ts:176:18) at Array.map (<anonymous>) at deepCopy (node_modules/@aws-cdk/cloudformation-diff/lib/diff-template.ts:170:14) at deepCopy (node_modules/@aws-cdk/cloudformation-diff/lib/diff-template.ts:176:18) at deepCopy (node_modules/@aws-cdk/cloudformation-diff/lib/diff-template.ts:176:18)
解決 ?
以下のリンクに書いてあるように
1: package-lock.jsonを削除
2: node_modulesを削除
をしました。その後
3: package.jsonにあるaws-cdk関連のmoduleバージョンを最新に揃える
4: npm install
で解決しました stackoverflow.com
まとめ
残念ながら私はjavascriptに詳しいわけではないので原因が全く分かりませんが、すぐに解決したい人の役に立てればと思います。
aws-cdk(typescript)でVPCを作成してみよう
はじめに
今回は aws-cdkを使用してVPCを作成していきたいと思います
nodejsが入っていることが前提の記事となります
環境
バージョン | |
---|---|
Node.js | v12.18.3 |
Typescript | 3.9.7 |
aws-cdk | 1.72.0 |
環境構築
まずはじめにグローバルにaws-cdk
をインストールします
npm install -g aws-cdk
ローカルにインストールでは動かない??
普段はyarn
を使ってコーディングしているので、yarn add aws-cdk
を入力してcdkコマンドを実行しようとすると
`cdk init` cannot be run in a non-empty directory! error Command failed with exit code 1. info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
といったように怒られました。
もちろんそのコマンドを入力する前に mkdir src && cd src
をしています
なので大人しく -g
オプションでグローバルに入れた方が良さそうです
credentialを設定しよう
もし ~/.aws/credentials
に accesskeyを設定していないのであれば設定しましょう
[default] aws_access_key_id=xxxxxxxx aws_secret_access_key=xxxxxxxx
設定していない場合 deployする時にエラーが出ます
$ cdk deploy Unable to resolve AWS account to use. It must be either configured when you define your CDK or through the environment
appを作成しよう
メモ: gitを使用してコードを管理したい場合は README.mdを含めない空のリポジトリを作成しておくと良い
appを指定すると空のディレクトリ以下にnode_modulesを含めたファイルが作成されます
$ cdk init app --language=typescript $ tree -L 1 -l src/ src/ ├── README.md ├── bin ├── cdk.json ├── jest.config.js ├── lib ├── node_modules ├── package-lock.json ├── package.json ├── test └── tsconfig.json
VPCを作成しよう
npm i -D @aws-cdk/aws-ec2
libディレクトリ配下にあるtsファイルが一つあると思います
以下のようにVPCを付け足します
import * as cdk from '@aws-cdk/core'; import { Vpc } from "@aws-cdk/aws-ec2"; // 追加 export class HogeStack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // ↓を追加 const vpc = new Vpc(this, 'TheVPC', { cidr: "10.0.0.0/16" }) } }
ターミナルで code deploy
を入力すると以下の図のような構成が作成されます
NATゲートウェイのデフォルト値
default: One NAT gateway/instance per Availability Zone)
サブネットのデフォルト値
default: The VPC CIDR will be evenly divided between 1 public and 1 private subnet per AZ.
デフォルトで
を作成するようです
今回東京リージョンを使用しているのですが、その場合AZはap-northeast-1a
とap-northeast-1c
が選択されていました
VPCのみ作成したい
下を追加しましょう
const vpc = new Vpc(this, 'TheVPC', { cidr: "10.2.0.0/16", natGateways: 0, # 追加 subnetConfiguration: [], # 追加 })
subnetを追加しよう
以下のようにコードを追加してみましょう
const vpc = new Vpc(this, 'TheVPC', { cidr: "10.2.0.0/16", natGateways: 0, subnetConfiguration: [ { cidrMask: 24, subnetType: ec2.SubnetType.PUBLIC, name: "Public" }, ], # 追加 })
そうすると以下のようにパブリックサブネットが2つ作成されます
もしAZを一つにしたいのであれば、maxAzs
を追加します
const vpc = new Vpc(this, 'TheVPC', { cidr: "10.2.0.0/16", natGateways: 0, maxAzs: 1, # 追加 subnetConfiguration: [ { cidrMask: 24, subnetType: ec2.SubnetType.PUBLIC, name: "Public" }, ], })
https://docs.aws.amazon.com/cdk/api/latest/docs/aws-construct-library.html
まとめ
この記事ではaws-cdk(typescript)の導入としてVPC,サブネットのみに注目して書きました
コードで管理することによってインフラの属人化を軽減できればと思います
NoSQL Workbenchとdynamodb-localでローカル開発環境を構築する
はじめに
環境構築で躓くのは時間がもったいないなと思ったので簡単に構築できるように備忘録を残します!
本記事について
amazon/dynamo-localとNoSQL Workbench for DynamoDB GUI Clientを利用したローカル環境構築の手順を示した記事です
dockerコンテナを使用するので、dockerの使用経験があることを前提に話を進めていきます
最終的にローカル環境だけれどもデータの操作はGUIでできるようになるところまでを目指します
環境
ツール | version |
---|---|
docker engine | 19.03.12 |
docke compose | 1.27.2 |
mac Catalina | 10.15.6 |
NoSQL Workbench for Amazon DynamoDB | 1.1.0 |
対象
環境構築
aws cliのインストール
brew install awscli
homebrew
以外のインストール方法はこちら
インストール終了後、cliのバージョンを確認してみましょう
~ $ aws --version aws-cli/2.0.50 Python/3.8.5 Darwin/19.6.0 source/x86_64
dynamodbコンテナを立ち上げる
公式で掲載されているymlを拝借して、command
を追加します
NoSQL Workbench
が正しくテーブルを認識してくれるように-sharedDb
を入れておきます
DynamoDB をコンピュータにローカルでデプロイする - Amazon DynamoDB
version: '3.7' services: dynamodb-local: image: amazon/dynamodb-local:latest container_name: dynamodb-local command: ["-jar", "DynamoDBLocal.jar", "-sharedDb", "-inMemory"] ports: - "8000:8000"
ターミナルでdocker-compose up
を入力してdynamodb localを立ち上げます
SharedDb: true
になっていることを確認してください
筆者は別serviceをdocker-compose.ymlに書いているので、docker-compose up dynamodb-local
と入力しています
dynamodb-local | Initializing DynamoDB Local with the following configuration: dynamodb-local | Port: 8000 dynamodb-local | InMemory: true dynamodb-local | DbPath: null dynamodb-local | SharedDb: true dynamodb-local | shouldDelayTransientStatuses: false dynamodb-local | CorsParams: * dynamodb-local |
NoSQL Workbench のダウンロード - Amazon DynamoDB
aws cliからdynamoテーブルを作成する
ドキュメントのコマンドを拝借しましょう
しかし、このまま入力すると失敗すると思います
なぜならクラウド側のawsに繋ぎにいくからです
なので、コマンドラインオプションの--endpoint-url
を使用します
aws dynamodb create-table \ --table-name MusicCollection \ --attribute-definitions AttributeName=Artist,AttributeType=S AttributeName=SongTitle,AttributeType=S \ --key-schema AttributeName=Artist,KeyType=HASH AttributeName=SongTitle,KeyType=RANGE \ --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 \ --endpoint-url http://localhost:8000
AWS CLI で Amazon DynamoDB の使用 - AWS コマンドラインインターフェイス
DynamoDB Local の使用に関する注意事項 - Amazon DynamoDB
NoSQL Workbenchをダウンロード
NoSQL Workbench のダウンロード - Amazon DynamoDB
NoSQL Workbenchを起動する
インストールが完了しているなら最初に開いた画面からOperation builder > + Add connection
を選択してください
次にDynamoDB local > Connect
をクリックしてください
いかがでしょうか?
先ほどaws-cliで入力したaws dynamodb create-table --table-name MusicCollection xxxx
の MusicCollection
が見れたと思います
テーブルを削除する
aws dynamodb delete-table --table-name MusicCollection \ --endpoint-url http://localhost:8000
amazon/aws-cliとamazon/dynamo-localのdockerコンテナを使用して構築できないのか?
一応可能ですが、お勧めはしません
こちらの記事でも紹介されていて、自分でも実際に手を動かした結果、結構大変でした
他にもaws-cliのコマンドを叩きたいだけなのに、コンテナをずっと立ち上げておかないといけないのが結構気になりました
最後に
ここまで読んでいただきありがとうございます!!
この記事はいかがだったでしょうか? 再現性のある記事を書こうと事細かく記述したつもりです
一人でも多くの人が開発に集中できるようになればいいなと思っています