Typescript Lambda函数在使用捆绑程序时不会自动设置aws sdk凭据
我有一个函数(构建后)如下所示: 在Typescript Lambda函数在使用捆绑程序时不会自动设置aws sdk凭据,typescript,amazon-web-services,aws-lambda,bundling-and-minification,parceljs,Typescript,Amazon Web Services,Aws Lambda,Bundling And Minification,Parceljs,我有一个函数(构建后)如下所示: 在myUtils/index.ts中,我有: 从“aws sdk”导入{SecretsManager} ... const secretsManager=新secretsManager() 如果我压缩myFunction/的内容并将其部署到AWS Lambda,它们将按预期工作。但是,归档文件不必要地膨胀(使用绑定器时约为60MB,而使用绑定器时为3MB) 因此,我安装了Parcel并运行了npx Parcel build index.ts——无源地图,它使用
myUtils/index.ts
中,我有:
从“aws sdk”导入{SecretsManager}
...
const secretsManager=新secretsManager()
如果我压缩myFunction/
的内容并将其部署到AWS Lambda,它们将按预期工作。但是,归档文件不必要地膨胀(使用绑定器时约为60MB,而使用绑定器时为3MB)
因此,我安装了Parcel并运行了npx Parcel build index.ts——无源地图
,它使用单个文件(index.js
)创建了一个名为dist/
的文件夹。如果我压缩并将dist/
部署到AWS Lambda,函数调用现在会失败,错误表明没有向SecretsManager
构造函数提供区域或凭据
使用捆绑程序时,是否需要执行角色的凭据来配置
aws sdk
?要自动配置aws sdk
的凭据,必须从默认Lambda运行时环境加载aws sdk
包裹捆绑器有两种模式:包裹--目标节点
和地块--目标节点--捆绑节点模块
- 第一个选项不起作用,因为它忽略了所有依赖项,甚至是那些不在默认Lambda运行时环境中的依赖项
- 第二个选项不起作用,因为它在捆绑包中包含了
,覆盖了默认的Lambda运行时环境aws sdk
aws sdk
那么这个
从“aws sdk”导入{SecretsManager}
...
const secretsManager=新secretsManager()
变成
const awsSdk=import('aws-sdk')
...
const{SecretsManager}=await awsSdk
const secretsManager=新secretsManager()
CLI参数包括:
parcel build index.ts--无源映射--目标节点--捆绑节点模块
2019年10月编辑:
上面的解决方案是可行的,但我一直是下面描述的基于Lambda层的解决方案,我认为它更优越。为了处理monorepos(我使用的是Rush),构建脚本有点粗糙,可能需要修改才能在项目中使用它。如果您没有使用monorepo,那么可以忽略分割内部依赖项和外部依赖项的部分
也许有更好的方法可以做到这一点,所以欢迎批评
// @my-scope/my-layer/package.json
{
"name": "@my-scope/my-layer",
"scripts": {
"build": "build-layer"
},
"dependencies": {
"uuid": "^3.3.3",
"axios": "~0.19.0",
"date-fns": "~2.4.1"
},
"devDependencies": {
"@my-scope/build-scripts": "0.0.0"
}
}
/@my scope/build scripts/bin/build-layer.ts
#!/usr/bin/env节点
将*作为jsonc从“jsonc解析器”导入
将*作为fs从“fs”导入
从“fs extra”导入*作为fse
从“路径”导入*作为路径
从“util”导入*作为util
从“del”导入*作为del
从“../lib”导入{spawnSyncCore}
const access=util.promisify(fs.access)
const readFile=util.promisify(fs.readFile)
const writeFile=util.promisify(fs.writeFile)
const mkdir=util.promisify(fs.mkdir)
const BUILD_DIR=`dist`
const TARGET\u PATH=PATH.join(BUILD\u DIR,`nodejs`)
const MANIFEST_NAME=`package.json`
const MANIFEST_LOCK_NAME=`package-LOCK.json`
const INTERNAL_SCOPE=`@my SCOPE/`
接口IMinimalPackageManifest{
描述:字符串
存储库:未知
许可证:字符串
依赖项:{
[packageName:string]:字符串|未定义
}
}
异步函数构建层(_argv:readonly string[]=process.argv):承诺{
常数{
描述
存储库,
许可证
依赖关系
}=等待读取清单(清单名称)
const{internal,external}=splitDependencies(依赖项)
const targetManifestPath=path.join(目标路径、清单名称)
const targetManifestLockPath=path.join(目标路径、清单锁定名称)
等待书面通知(
目标路径,
{
描述
存储库,
许可证
依赖项:外部
}
)
installExternalDependencies(目标路径)
等待安装内部依赖项(内部、目标路径)
del.sync(targetManifestPath)
删除同步(targetManifestLockPath)
}
异步函数readManifest(sourcePath:string):承诺{
const raw=(wait readFile(sourcePath)).toString()
返回jsonc.parse(原始)
}
异步函数writeManifest(targetPath:string,manifest:IMinimalPackageManifest):承诺{
const targetDir=path.dirname(targetPath)
试一试{
等待访问(targetDir)
}抓住{
等待mkdir(targetDir{
递归:对
})
}
const raw=JSON.stringify(清单)
等待写入文件(targetPath,原始)
}
接口IDependencyMap{
[键:字符串]:字符串|未定义
}
接口IDEPEdencyGroup{
内部:IDependencyMap
外部:IDependencyMap
}
函数拆分依赖项(依赖项:IDependencyMap):idepedencyGroup{
返回对象。键(依赖项)。减少(
(组,名称)=>{
if(名称.启动(内部范围)){
组。内部[名称]=依赖项[名称]
}否则{
groups.external[name]=依赖项[name]
}
返回组
},
{
内部:{},
外部:{}
}
)
}
函数installExternalDependencies(targetDir:string):无效{
产卵同步核({
命令:`npm`,
cwd:targetDir,
环境:{
…process.env,
NODE_ENV:`生产`
},
args:[
`安装`
],
})
}
异步函数installInternalDependencies(dependencies:IDependencyMap,targetDir:string):承诺{
const sourcepath=Object.keys(依赖项)
.map(依赖项=>path.join(`node\u modules`,依赖项))
for(源路径的常量源路径){
const targetPath=path.join(targetDir,sourcePath)
const sourceManifestPath=path
// @my-scope/my-layer/package.json
{
"name": "@my-scope/my-layer",
"scripts": {
"build": "build-layer"
},
"dependencies": {
"uuid": "^3.3.3",
"axios": "~0.19.0",
"date-fns": "~2.4.1"
},
"devDependencies": {
"@my-scope/build-scripts": "0.0.0"
}
}
// @my-scope/build-scripts/package.json
{
"name": "@meal-planner/tool-build-scripts",
"files": [
"out/**/*"
],
"main": "out/lib/index.js",
"bin": {
"build-layer": "out/bin/build-layer.js",
},
"scripts": {
"build": "tsc"
},
"dependencies": {
"jsonc-parser": "~2.1.1",
"fs-extra": "~8.1.0",
"del": "~5.1.0"
},
"devDependencies": {
"@types/node": "~12.11.1",
"@types/fs-extra": "~8.0.1",
"typescript": "~3.6.4",
}
}