Runtime.ImportModuleError:错误:找不到模块“onCreateRadonData”

时间:2021-08-01 12:28:54

标签: amazon-web-services aws-lambda serverless-framework aws-appsync

我正在尝试使用 AppSync 和无服务器将 DynamoDB 流部署为 lambda 函数。部署顺利,没有任何错误。但是当我触发 lambda 在我的 DynamoDB 表中创建一个新实例时,它无法抛出此错误:

{
    "errorType": "Runtime.ImportModuleError",
    "errorMessage": "Error: Cannot find module 'onCreateRadonData'\nRequire stack:\n- /var/runtime/UserFunction.js\n- /var/runtime/index.js",
    "stack": [
        "Runtime.ImportModuleError: Error: Cannot find module 'onCreateRadonData'",
        "Require stack:",
        "- /var/runtime/UserFunction.js",
        "- /var/runtime/index.js",
        "    at _loadUserApp (/var/runtime/UserFunction.js:100:13)",
        "    at Object.module.exports.load (/var/runtime/UserFunction.js:140:17)",
        "    at Object.<anonymous> (/var/runtime/index.js:43:30)",
        "    at Module._compile (internal/modules/cjs/loader.js:999:30)",
        "    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)",
        "    at Module.load (internal/modules/cjs/loader.js:863:32)",
        "    at Function.Module._load (internal/modules/cjs/loader.js:708:14)",
        "    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12)",
        "    at internal/main/run_main_module.js:17:47"
    ]
}

这很奇怪,因为通常我会在以错误的方式导入某些模块/依赖项时看到这种情况。但是报错onCreateRadonData中提到的函数是lambda本身的名字,而且在部署过程中,很明显的表明该函数的部署进行得很顺利,所以不知道是怎么回事。。 .

serverless.yaml 文件:

service: aws

plugins:
  - serverless-appsync-plugin
  - serverless-offline

provider:
  name: aws
  runtime: nodejs12.x
  region: eu-west-1
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:Scan
        - dynamodb:Query
        - dynamodb:PutItem
      Resource:
        - !GetAtt RadonDataTable.Arn
        - !Join [ '', [ !GetAtt RadonDataTable.Arn, '/*' ] ]
    - Effect: Allow
      Action:
        - appsync:GraphQL
      Resource: 
      - !GetAtt GraphQlApi.Arn
      - !Join [ '/', [ !GetAtt GraphQlApi.Arn, 'types', 'Mutation', 'fields', 'createRadonData' ] ]

custom:
  appSync:
    name: ${self:service}
    authenticationType: AWS_IAM
    mappingTemplates:
      - dataSource: RadonData
        type: Query
        field: listRadonData
        request: Query.listRadonData.request.vtl
        response: Query.listRadonData.response.vtl
      - dataSource: None
        type: Mutation
        field: createRadonData
        request: Mutation.createRadonData.request.vtl
        response: Mutation.createRadonData.response.vtl
    schema: src/schema.graphql
    dataSources:
      - type: NONE
        name: None
      - type: AMAZON_DYNAMODB
        name: RadonData
        description: 'DynamoDB Radon Data table'
        config:
          tableName: !Ref RadonDataTable

functions:
  handleDynamoDbStream:
    maximumRetryAttempts: 1
    maximumRecordAgeInSeconds: 1
    handler: src/handlers/onCreateRadonData.handler
    environment:
      APP_SYNC_API_URL: !GetAtt GraphQlApi.GraphQLUrl
    events:
      - stream:
          type: dynamodb
          arn: !GetAtt RadonDataTable.StreamArn

resources:
  Resources:
    RadonDataTable:
      Type: AWS::DynamoDB::Table
      Properties:
        ProvisionedThroughput:
          ReadCapacityUnits: 5
          WriteCapacityUnits: 5
        AttributeDefinitions:
          - AttributeName: id
            AttributeType: S
        KeySchema:
          - AttributeName: id
            KeyType: HASH
        StreamSpecification:
          StreamViewType: NEW_IMAGE

还有 lambda 函数 onCreateRadonData.ts

export const handler = (event) => {
  console.log('Hello from lambda')

  return;
}

注意:我也尝试过 exports.handler = (event) ... 方式,但我抛出了同样的错误。

代码结构如下:

- src/handlers/onCreateRadonData.ts
- mapping-templates/files with mapping templates.vtl
- serverless.yml
- package.json

如您所见,我在 onCreateRadonData.tshandlers 文件夹中只有一个名为 src 的文件。就是这样,其余的文件都在根目录中。

对我做错了什么有任何想法吗?谢谢大家!

1 个答案:

答案 0 :(得分:0)

好吧,伙计们,我明白了。由于我使用的是打字稿,因此我必须导入 serverless-typescript 插件才能将所有 ts 文件转换为 js。