Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript Lambda函数在使用捆绑程序时不会自动设置aws sdk凭据_Typescript_Amazon Web Services_Aws Lambda_Bundling And Minification_Parceljs - Fatal编程技术网

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运行时环境中的依赖项
  • 第二个选项不起作用,因为它在捆绑包中包含了
    aws sdk
    ,覆盖了默认的Lambda运行时环境
解决方案是在捆绑所有其他模块的同时,使用动态导入来禁止捆绑
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",
  }
}