要记录学习进程:如何在Lambda中使用TypeScript
背景
一位老爷爷在工作中需要使用AWS和JavaScript等技术的学习记录。
在Lambda中无法使用TypeScript,因此我寻找了一种使用它的方法,然后找到了Serverless Framework。
所以,当我尝试的时候,被告知了各种各样的事情发生了…
-
- serverless
-
- SAM
-
- AWS-ToolKit for VSCode
結局は、SAM ?
对于无服务器的期望
-
- TransCompile しながら Lambda への Deploy が出来そう
-
- Serverless Offline もあるので、うまくいったあとは、開発は Offline で
- Google Cloud Functions/Azure Function などへも deploy 出来るので、覚えておくと役立つかも?
山姆和工具包
由于可以获得AWS的支持,所以可能还是选择这边吧……嗯,毕竟我们俩都是业余的。
选择不想要这边的理由可能是因为,如果不安装Docker,则无法进行离线操作。
尝试使用无服务器
- まずはインストール
npm install -g serverless
在这个公式中,谈到了如何在无服务器环境下选择模板,但由于我想使用Typescript,所以需要查阅帮助文档。
serverless create --help
所以,查看列表时,只有一个适用于AWS的选项。其他的是适用于Alexa/Azure function/Cloud functions的吗?
“aws-clojure-gradle”, “aws-clojurescript-gradle”, “aws-nodejs”, “aws-nodejs-docker”, “aws-nodejs-typescript”, “aws-alexa-typescript”, “aws-nodejs-ecma-script”, “aws-python”, “aws-python3”, “aws-python-docker”, “aws-groovy-gradle”, “aws-java-maven”, “aws-java-gradle”, “aws-kotlin-jvm-maven”, “aws-kotlin-jvm-gradle”, “aws-kotlin-jvm-gradle-kts”, “aws-kotlin-nodejs-gradle”, “aws-scala-sbt”, “aws-csharp”, “aws-fsharp”, “aws-go”, “aws-go-dep”, “aws-go-mod”, “aws-ruby”, “aws-provided”, “tencent-go”, “tencent-nodejs”, “tencent-python”, “tencent-php”, “azure-csharp”, “azure-nodejs”, “azure-nodejs-typescript”, “azure-python”, “cloudflare-workers”, “cloudflare-workers-enterprise”, “cloudflare-workers-rust”, “fn-nodejs”, “fn-go”, “google-nodejs”, “google-nodejs-typescript”, “google-python”, “google-go”, “kubeless-python”, “kubeless-nodejs””knative-docker”, “openwhisk-java-maven”, “openwhisk-nodejs”, “openwhisk-php”, “openwhisk-python”, “openwhisk-ruby”, “openwhisk-swift”, “spotinst-nodejs”, “spotinst-python”, “spotinst-ruby”, “spotinst-java8”, “twilio-nodejs”, “aliyun-nodejs”, “plugin”, “hello-world”
“aws-clojure-gradle” -> “AWS Clojure Gradle”
“aws-clojurescript-gradle” -> “AWS ClojureScript Gradle”
“aws-nodejs” -> “AWS Node.js”
“aws-nodejs-docker” -> “AWS Node.js Docker”
“aws-nodejs-typescript” -> “AWS Node.js TypeScript”
“aws-alexa-typescript” -> “AWS Alexa TypeScript”
“aws-nodejs-ecma-script” -> “AWS Node.js ECMA Script”
“aws-python” -> “AWS Python”
“aws-python3” -> “AWS Python 3”
“aws-python-docker” -> “AWS Python Docker”
“aws-groovy-gradle” -> “AWS Groovy Gradle”
“aws-java-maven” -> “AWS Java Maven”
“aws-java-gradle” -> “AWS Java Gradle”
“aws-kotlin-jvm-maven” -> “AWS Kotlin JVM Maven”
“aws-kotlin-jvm-gradle” -> “AWS Kotlin JVM Gradle”
“aws-kotlin-jvm-gradle-kts” -> “AWS Kotlin JVM Gradle KTS”
“aws-kotlin-nodejs-gradle” -> “AWS Kotlin Node.js Gradle”
“aws-scala-sbt” -> “AWS Scala SBT”
“aws-csharp” -> “AWS C#”
“aws-fsharp” -> “AWS F#”
“aws-go” -> “AWS Go”
“aws-go-dep” -> “AWS Go Dep”
“aws-go-mod” -> “AWS Go Mod”
“aws-ruby” -> “AWS Ruby”
“aws-provided” -> “AWS Provided”
“tencent-go” -> “Tencent Go”
“tencent-nodejs” -> “Tencent Node.js”
“tencent-python” -> “Tencent Python”
“tencent-php” -> “Tencent PHP”
“azure-csharp” -> “Azure C#”
“azure-nodejs” -> “Azure Node.js”
“azure-nodejs-typescript” -> “Azure Node.js TypeScript”
“azure-python” -> “Azure Python”
“cloudflare-workers” -> “Cloudflare Workers”
“cloudflare-workers-enterprise” -> “Cloudflare Workers Enterprise”
“cloudflare-workers-rust” -> “Cloudflare Workers Rust”
“fn-nodejs” -> “Fn Node.js”
“fn-go” -> “Fn Go”
“google-nodejs” -> “Google Node.js”
“google-nodejs-typescript” -> “Google Node.js TypeScript”
“google-python” -> “Google Python”
“google-go” -> “Google Go”
“kubeless-python” -> “Kubeless Python”
“kubeless-nodejs” -> “Kubeless Node.js”
“knative-docker” -> “Knative Docker”
“openwhisk-java-maven” -> “OpenWhisk Java Maven”
“openwhisk-nodejs” -> “OpenWhisk Node.js”
“openwhisk-php” -> “OpenWhisk PHP”
“openwhisk-python” -> “OpenWhisk Python”
“openwhisk-ruby” -> “OpenWhisk Ruby”
“openwhisk-swift” -> “OpenWhisk Swift”
“spotinst-nodejs” -> “Spotinst Node.js”
“spotinst-python” -> “Spotinst Python”
“spotinst-ruby” -> “Spotinst Ruby”
“spotinst-java8” -> “Spotinst Java 8”
“twilio-nodejs” -> “Twilio Node.js”
“aliyun-nodejs” -> “Aliyun Node.js”
“plugin” -> “Plugin”
“hello-world” -> “Hello World”
serverless create -t aws-nodejs-typescript
说明是yaml文件,但实际上是typescript。

所以,部署
serverless deploy
如果以正常方式操作,它会默认选择位于美国东部的us-east-1作为设置,所以要先在提供者中添加区域(region)然后进行操作。
region: "ap-northeast-1",

非常容易啊,让人感到非常感动。
只是……以下对于业余者来说是一个挑战

所以,既然我只是个业余爱好者,我决定也试试调查和分析模型SAM。
错误和处理


npm install ts-node
权限不足

首先,隨意添加訪問權限並處理問題。
有指定像這樣適切地限制,請正確選擇。
最後,請使用IAM Access Analyzer根據訪問情況制定策略。

无法验证第一个证书。
由于使用了代理,需要更改设置并进行确认。
$env:http_proxy="http://*.*.*.*:****"
$env:https_proxy="http://*.*.*.*:****"
Get-ChildItem env:h*
SLS(无服务器 alias)不起作用。

如果觉得部署速度慢的话
看到这里,试试使用”-f”选项…非常快!
serverless deploy function -f {functionName}
函数名称:module.exports.hello = 的 “hello” 部分?
由于只更新Zip部分,所以非常快。
离线化
不安装Docker也可以运行是很方便的,但目前来看,优先级不是很高吧。。可能
错误处理
-
- npm ERR! code ERR_INVALID_URL
-
- プロキシの設定でプロトコルを消してた・・
- 以下な感じになってたので、”http://” を追加
10.10.10.10的端口为8080。
如果您已经安装了NVM,那么代理设置应在以下目录以版本为单位进行配置:%appdata%\nvm{version}\etc\npmrc。
我試試看使用 SAM。
从SAM软件的安装开始
下载后,安装。
如果提前启动终端,为了反映环境变量,需要重新启动终端。
sam --version

AWS 认证信息的设置
既然已经做过了,所以跳过。
教程:部署Hello World应用程序
首先试试看。
sam init

- Template の利用を選択

- 一番簡単な Hello World で

- Node.js を選択

- Zip で
可以部署的选项有容器或者代码压缩文件。

- TypeScript が選択出来た!

- X-Ray は、本番の時にしか使わなくてよさげ
AWS X-Ray通过使用请求跟踪、异常收集和分析器的功能,方便开发人员对分布式应用程序进行性能分析。

由于初始化已经完成,现在可以进行构建了。
cd sam-app
sam build
无论是使用 npm 还是 serverless,在当前目录进行初始化,但是 sam 在初始化时会创建一个文件夹呢。我提前创建了文件夹。

所以,终于开始部署。
sam deploy --guided





错误及处理


AWS工具包
只用VS Code也行,虽然用原版VS也可以,但是因为VS 2022在工作上还不能使用,而且还要找2019的许可证码,太麻烦了。
工具包
前提条件
-
- node.js は nvm で対応済み。npm download
AWS SAM CLI もSAM で対処済み
Docker は とりあえず放置
安装 AWS Toolkit

AWS Explorer 的设置


正好借此机会,我已将以下功能作为反馈发送了出去。
-
- 「No Custers found] の非表示☑
-
- custers 数をサービス名の横に表示
- フィルター機能 in Explorer
实际应用了吗?
既经在SAM中创建了sam-app,因此将继续利用那里的内容。
调试设置

如果要这样做的话,需要安装Docker,所以稍后再说吧。
部署的方式

如果这样的话,应该有一些更容易的设置选项。
-
- 按下CTRL键和@键
- sam部署
现在我们了解了 ToolKit 的好处。

我觉得除了输入多个 sam 命令,还有更简便的方法,但现在情况还不清楚。
嗯,我打算继续与 sam 命令结合,逐渐寻找方便的功能……吧。
总结/尾声
暂时来说,我已经了解到在 TypeScript 代码中可以提供 Lambda 函数。
虽然有很多任务非常困扰,只能一点一点地努力。
这个是现在的问题吗?
-
- SAM でのトリガー変更方法(デフォルトは API Gateway なので)
-
- ToolKit の便利な使い方
-
- AWS config の理解
- TypeScript の基礎(そもそも JavaScript すら知らん人なんですけどね