尝试使用aws-nodejs-typescript模板(serverless v3)
这篇文章是Ateam Finergy Inc.× Ateam CommerceTech Inc.× Ateam Wellness Inc.的《2022年圣诞日历》第15天的文章。
今天,由@tommy1038负责。
首先
今年初的时候我写了以下这篇文章,但随后不久,serverless v3就发布了。
以下是Serverless V3的升级指南链接(https://www.serverless.com/framework/docs/guides/upgrading-v3)。
我們的業務所使用的服務也已經升級到支援 serverless v3,但我很想知道官方範本有什麼改變,所以我打算更新之前的文章。
准备事项
如果您想尝试serverless,您可以立即从这里开始。(https://github.com/serverless/serverless#quick-start) 我们在以下版本上执行了实验。
❯ node -v
v18.12.1
❯ npm --version
8.19.3
❯ serverless --version
Framework Core: 3.25.1
Plugin: 6.2.2
SDK: 4.3.2
❯ aws --version
aws-cli/2.9.6 Python/3.11.0 Darwin/21.6.0 source/x86_64 prompt/off
您可以通过执行“aws configure”命令来设置AWS的身份验证信息,按照提示进行操作即可。
❯ aws configure
AWS Access Key ID [None]: your_access_key_id
AWS Secret Access Key [None]: your_secret_access_key
Default region name [None]:
Default output format [None]:
如果没有Access Key ID和Secret Access Key,请在设置 – AWS命令行界面的Access Key ID和Secret Access Key部分中参考创建步骤,并在那里创建后再进行注册。
创建服务
我們將參考以上內容,並創建相應的服務。
使用–template选项进行创建
目前可用的模板列表如下所示。
-
- aws-clojurescript-gradle
-
- aws-clojure-gradle
-
- aws-nodejs
-
- aws-nodejs-typescript
-
- aws-alexa-typescript
-
- aws-nodejs-ecma-script
-
- aws-python
-
- aws-python3
-
- aws-ruby
-
- aws-provided
-
- aws-kotlin-jvm-maven
-
- aws-kotlin-jvm-gradle
-
- aws-kotlin-nodejs-gradle
-
- aws-groovy-gradle
-
- aws-java-maven
-
- aws-java-gradle
-
- aws-scala-sbt
-
- aws-csharp
-
- aws-fsharp
-
- aws-go
-
- aws-go-dep
-
- aws-go-mod
- plugin
那么,让我们尝试使用上述的aws-nodejs-typescript。
❯ serverless create --template aws-nodejs-typescript --path aws-nodejs-typescript-1
✔ Project successfully created in "aws-nodejs-typescript-1" from "aws-nodejs-typescript" template (7s)
❯ tree .
.
├── README.md
├── package.json
├── serverless.ts
├── src
│ ├── functions
│ │ ├── hello
│ │ │ ├── handler.ts
│ │ │ ├── index.ts
│ │ │ ├── mock.json
│ │ │ └── schema.ts
│ │ └── index.ts
│ └── libs
│ ├── api-gateway.ts
│ ├── handler-resolver.ts
│ └── lambda.ts
├── tsconfig.json
└── tsconfig.paths.json
4 directories, 13 files
因为使用了 serverless v3 进行执行,所以我认为 examples/aws-node-typescript at v3 · serverless/examples 会被应用,但实际上应用的是 examples/legacy/aws-nodejs-typescript at v3 · serverless/examples。
用这个模板,尝试使用年初编写的aws-nodejs-typescript模板来确认项目创建的事情,似乎足够了。
我想应用v3的模板,所以我想在URL中指定官方的模板。
用–template-url选项创建
❯ serverless create --template-url https://github.com/serverless/examples/tree/v3/aws-node-typescript --path aws-nodejs-typescript-2
✔ Project successfully created in "aws-nodejs-typescript-2" (5s)
❯ tree .
.
├── README.md
├── handler.ts
├── package.json
└── serverless.yml
0 directories, 4 files
看起来,已经成功应用了 v3 更新的模板,一切顺利。
以下是实际的模板代码。
虽然不详细审查代码,但相较之前的模板而言,功能部分已经变得简明扼要,无需费力去理解。例如,以前会自动创建端点,但现在已经消失了。另外,虽然细节方面有所不同,但从serverless.ts变成了serverless.yml。
使用aws-node-http-api-typescript作为模板可以很好地按照规范创建端点及其周边的创建工作。
本地执行
好吧,那么让我们在本地实际运行一下吧。
❯ yarn install
yarn install v1.22.19
warning package.json: No license field
info No lockfile found.
warning aws-nodejs-typescript-2: No license field
[1/4] ? Resolving packages...
[2/4] ? Fetching packages...
[3/4] ? Linking dependencies...
[4/4] ? Building fresh packages...
success Saved lockfile.
✨ Done in 7.65s.
❯ serverless invoke local --function hello
{
"message": "Go Serverless v3! Your function executed successfully!",
"input": ""
}
可以看出 handler.ts 中的 hello 函数被正确调用了。
部署
现在,我想要实际部署到AWS上,所以将区域设置为ap-northeast-1,并添加相关配置以实现部署。
service: aws-nodejs-typescript-2
frameworkVersion: '3'
provider:
name: aws
runtime: nodejs14.x
region: ap-northeast-1 # 追記
functions:
hello:
handler: handler.hello
plugins:
- serverless-esbuild
现在,我们开始部署。(为了打印日志,我加上了–verbose参数。)
❯ serverless deploy --verbose
Deploying aws-nodejs-typescript-2 to stage dev (ap-northeast-1)
Packaging
Compiling to node14 bundle with esbuild...
Compiling with concurrency: Infinity
Compiling completed.
Zip service aws-nodejs-typescript-2 - 688.00 B [50 ms]
Retrieving CloudFormation stack
Creating CloudFormation stack
Creating new change set
Waiting for new change set to be created
Change Set did not reach desired state, retrying
Executing created change set
CREATE_IN_PROGRESS - AWS::CloudFormation::Stack - aws-nodejs-typescript-2-dev
CREATE_IN_PROGRESS - AWS::S3::Bucket - ServerlessDeploymentBucket
CREATE_IN_PROGRESS - AWS::S3::Bucket - ServerlessDeploymentBucket
CREATE_COMPLETE - AWS::S3::Bucket - ServerlessDeploymentBucket
CREATE_IN_PROGRESS - AWS::S3::BucketPolicy - ServerlessDeploymentBucketPolicy
CREATE_IN_PROGRESS - AWS::S3::BucketPolicy - ServerlessDeploymentBucketPolicy
CREATE_COMPLETE - AWS::S3::BucketPolicy - ServerlessDeploymentBucketPolicy
CREATE_COMPLETE - AWS::CloudFormation::Stack - aws-nodejs-typescript-2-dev
Uploading
Uploading CloudFormation file to S3
Uploading State file to S3
Uploading service aws-nodejs-typescript-2.zip file to S3 (688 B)
Updating CloudFormation stack
Creating new change set
Waiting for new change set to be created
Change Set did not reach desired state, retrying
Executing created change set
UPDATE_IN_PROGRESS - AWS::CloudFormation::Stack - aws-nodejs-typescript-2-dev
CREATE_IN_PROGRESS - AWS::IAM::Role - IamRoleLambdaExecution
CREATE_IN_PROGRESS - AWS::Logs::LogGroup - HelloLogGroup
CREATE_IN_PROGRESS - AWS::IAM::Role - IamRoleLambdaExecution
CREATE_IN_PROGRESS - AWS::Logs::LogGroup - HelloLogGroup
CREATE_COMPLETE - AWS::Logs::LogGroup - HelloLogGroup
CREATE_COMPLETE - AWS::IAM::Role - IamRoleLambdaExecution
CREATE_IN_PROGRESS - AWS::Lambda::Function - HelloLambdaFunction
CREATE_IN_PROGRESS - AWS::Lambda::Function - HelloLambdaFunction
CREATE_COMPLETE - AWS::Lambda::Function - HelloLambdaFunction
CREATE_IN_PROGRESS - AWS::Lambda::Version - HelloLambdaVersion****************************************
CREATE_IN_PROGRESS - AWS::Lambda::Version - HelloLambdaVersion****************************************
CREATE_COMPLETE - AWS::Lambda::Version - HelloLambdaVersion****************************************
UPDATE_COMPLETE_CLEANUP_IN_PROGRESS - AWS::CloudFormation::Stack - aws-nodejs-typescript-2-dev
UPDATE_COMPLETE - AWS::CloudFormation::Stack - aws-nodejs-typescript-2-dev
Retrieving CloudFormation stack
Removing old service artifacts from S3
✔ Service deployed to stack aws-nodejs-typescript-2-dev (110s)
functions:
hello: aws-nodejs-typescript-2-dev-hello (688 B)
Stack Outputs:
HelloLambdaFunctionQualifiedArn: arn:aws:lambda:ap-northeast-1:************:function:aws-nodejs-typescript-2-dev-hello:3
ServerlessDeploymentBucketName: aws-nodejs-typescript-2-serverlessdeploymentbuck-************
让我们来执行功能并查看部署的信息吧。
❯ serverless invoke --function hello
{
"message": "Go Serverless v3! Your function executed successfully!",
"input": {}
}
❯ serverless info
service: aws-nodejs-typescript-2
stage: dev
region: ap-northeast-1
stack: aws-nodejs-typescript-2-dev
functions:
hello: aws-nodejs-typescript-2-dev-hello
请确保在这里进行确认,可以通过serverless info进行查验,或者参考先前的日志。
将 aws-nodejs-typescript-2 部署到 dev 阶段 (ap-northeast-1)
因为写着’と書いてあるので’,所以已将stage名注册为dev。(我认为在serverless.yml中明确说明可以防止困惑。)
通过使用此功能以及Serverless v3引入的stage parameters,可以更轻松地定义和区分不同环境(例如dev、staging、production)的变量。(参考:Serverless Framework v3新功能的Stage Parameters介绍 | 豆蔵开发者网站)
将节点v18升级
在阅读本文的读者中,可能会有人感到疑惑。我的本地环境是使用了Node v18,但serverless.yml仍保持在nodejs14.x的状态,所以导致了不协调的情况。
由于AWS Lambda已经支持v18,所以我们应该升级到nodejs v18。
service: aws-nodejs-typescript-2
frameworkVersion: '3'
provider:
name: aws
runtime: nodejs18.x # v14->v18にアップデート
stage: ${opt:stage, 'dev'} # デプロイ時に設定できるように設定。デフォルトでは'dev'とする
region: ap-northeast-1
functions:
hello:
handler: handler.hello
plugins:
- serverless-esbuild
❯ serverless deploy --stage dev --verbose
Deploying aws-nodejs-typescript-2 to stage dev (ap-northeast-1)
Packaging
Compiling to node18 bundle with esbuild...
Compiling with concurrency: Infinity
Compiling completed.
Zip service aws-nodejs-typescript-2 - 688.00 B [35 ms]
Retrieving CloudFormation stack
Uploading
Uploading CloudFormation file to S3
Uploading State file to S3
Uploading service aws-nodejs-typescript-2.zip file to S3 (688 B)
Updating CloudFormation stack
Creating new change set
Waiting for new change set to be created
Change Set did not reach desired state, retrying
Executing created change set
(中略)
Retrieving CloudFormation stack
Removing old service artifacts from S3
✔ Service deployed to stack aws-nodejs-typescript-2-dev (64s)
functions:
hello: aws-nodejs-typescript-2-dev-hello (688 B)
Stack Outputs:
HelloLambdaFunctionQualifiedArn: arn:aws:lambda:ap-northeast-1:************:function:aws-nodejs-typescript-2-dev-hello:4
ServerlessDeploymentBucketName: aws-nodejs-typescript-2-serverlessdeploymentbuck-************
❯ serverless invoke --function hello
{
"message": "Go Serverless v3! Your function executed successfully!",
"input": {}
}
让我们在管理界面中也来看看(从Node.js v14 升级到 V18)。

似乎一切正常,已經能夠進行v18的更新了。
升级至 Yarn v3
最後還有一個額外的禮物,我們來試試將yarn升級到v3版本。在我的環境中,原本
❯ yarn -v
1.22.19
所以,我选择了更新1系列的版本试试看。
❯ rm -rf yarn.lock node_modules
❯ yarn set version berry
在.yarnrc.yml中添加内容。
yarnPath: .yarn/releases/yarn-3.3.0.cjs
nodeLinker: node-modules #追加
编写.gitignore文件
# package directories
node_modules
.esbuild
# Serverless directories
.serverless
# yarn v3
.yarn/
!.yarn/releases/*
我会尝试确认一下,看看这个是否能正常运作。
❯ yarn install
❯ serverless invoke local --function hello
{
"message": "Go Serverless v3! Your function executed successfully!",
"input": ""
}
看起来没有问题。如果有细节方面的疑问,可以参考其他人的文章。总的来说,这次的更新似乎很顺利。
删除服务
以下是可以删除服务的方式。阶段名称默认为dev,但不一定必须。
❯ serverless remove --stage dev
总结
這次我嘗試在serverless v3的環境中執行模板的更新。以前的模板功能非常豐富,但這次我們將只簡短並繼續進行必要的部分。
请提供相关链接集。
-
- Serverless: Develop & Monitor Apps On AWS Lambda
-
- serverless/serverless: ⚡ Serverless Framework – Build web, mobile and IoT applications with serverless architectures using AWS Lambda, Azure Functions, Google CloudFunctions & more! –
-
- 導入まわり
Serverless Frameworkの使い方まとめ | Serverless Operations
↑前回も参考にさせていただきましたが、serverless v3の内容も加筆されている、すごい
serverless v2 -> v3
Serverless Framework v2 から v3 の変更点まとめ – サーバーワークスエンジニアブログ
ServerlessFramework V3 のメリット&アップグレード方法、新機能のメリットをサーバーレスエキスパートが紹介します? | Ragate ブログ
Serverless Framework v3新機能のStage Parameters紹介 | 豆蔵デベロッパーサイト
node v18
AWS Lambda が Node.js 18 のサポートを追加
yarn v3
yarn v3 の独自機能を避けつつ yarn v1 から v3 へのアップグレードをする
yarn3 が出たことだし pnp 使ってみる