概要
aws cdkでデプロイする前に、lambdaのローカル実行を試したい。
cdk synthでsamテンプレートを出して実行する方法もある(前の記事)が、もっと楽にできないかと探したところ、sam-cdkのベータ版で行えるようであった。
Better together: AWS SAM and AWS CDK
AWS Cloud Development Kit (CDK) (Preview)
基本的にはこれをなぞる。
環境
- Windows 10 Home 21H1 19043.1151
- Vagrant 2.2.18
- Virtualbox 6.1.26 r145957
- ubuntu/focal64 (virtualbox, 20210720.0.1)
- docker 20.10.7
- sam-beta-cdk 1.22.0
- Node.js v14.17.4
- aws-cdk 1.116.0
Vagrantの準備
- dockerおよびsam-beta-cdkのインストールはansibleを使って行っている。
- ソースコード - vagrantfile
- ソースコード - ansible
-
sam-beta-cdk - getting startedとInstalling the AWS SAM CLI on Linuxを主に参照
- dockerがstartしていない旨のエラーが出たが、原因は不明。
vagrant destroy -f
->vagrant up
で直った
- dockerがstartしていない旨のエラーが出たが、原因は不明。
VsCodeでVagrant内へと接続
ファイル共有でエラーが出たため、ここからの作業は仮想環境内で行う。
【設定爆速】VS CodeのRemote Developmentを使ってSSH接続したEC2上のファイルを編集するを参考に、VsCodeのリモート機能を利用した。
プロジェクトの準備
※ Windowsと共有していないフォルダ内で作業すること。
まずは、テンプレートのプロジェクトをダウンロードする。(*)
cd /home/vagrant/src/
export SAM_CLI_TELEMETRY=0
sam-beta-cdk init --project-type CDK --package-type Zip --runtime nodejs14.x --app-template hello-world --cdk-language typescript --name test
cd sam-cdk-app-demo
code .
initが成功すると以下のように表示される。
Cloning app templates from https://github.com/aws/aws-sam-cli-app-templates
-----------------------
Generating application:
-----------------------
Name: test
Runtime: nodejs14.x
Dependency Manager: npm
Application Template: hello-world
Output Directory: .
Project Type: CDK
CDK application language: typescript
1度のinitではうまくいかず、2度目に同じinitコマンドをうったらうまくいった例もあった。まだ不安定?
aws-cdkのインストール
aws-cdkはバージョンアップが早いため、ncuで更新しておく。
npm i -D npm-check-updates
npx ncu -u
npm i
invokeで動作確認
まずはlambda単体で動作確認。
sam-beta-cdk local invoke sam-cdk-app-demo/hello-world-lambda-function
Dockerが動いてhello worldが表示されたら成功。
Synthesizing CDK App[$(__git_ps1):~/src/sam-cdk-app-demo$ sam-beta-cdk local invoke sam-cdk-app-demo/hello-world-lambda-function
Invoking app.lambdaHandler (nodejs14.x)
Image was not found.
Building image.......................................................................................................................................................................................................................................................................................
Skip pulling image and use local one: amazon/aws-sam-cli-emulation-image-nodejs14.x:rapid-1.22.0.dev202107140310.
Mounting /home/vagrant/src/sam-cdk-app-demo/hello-world as /var/task:ro,delegated inside runtime container
END RequestId: dea11ccb-dbf4-4e3b-a664-d8da3ef3a907
REPORT RequestId: dea11ccb-dbf4-4e3b-a664-d8da3ef3a907 Init Duration: 0.75 ms Duration: 202.74 ms Billed Duration: 300 ms Memory Size: 128 MB Max Memory Used: 128 MB
{"statusCode":200,"body":"{\"message\":\"hello world\"}"}
api で確認
sam-beta-cdk local start-api --host 0.0.0.0
Vagrantfileで今回は192.168.50.10で仮想環境を立ち上げているので、
http://192.168.50.10:3000/hello にアクセスする。
{"message":"hello world"}
と帰ってきたら成功。
ファイル共有でnpm installのエラー
VagrantとWindowsのファイル共有でnpm installを行うと、以下のようなエラーが発生。
Maximum call stack size exceeded
ERR! EPROTO: protocol error, symlink '../jsesc/bin/jsesc' -> '/vagrant/project/sam-cdk-app-demo/node_modules/.bin/jsesc'
npm rebuild
やnpm i no-bin-links
も試したがダメだったのであきらめた。