AWS Lambda:无法导入模块“mail”:没有名为mail

时间:2016-01-22 10:18:50

标签: javascript email amazon-web-services amazon-s3 aws-lambda

我正在关注这个小教程,用于在S3存储桶中上传对象时发送电子邮件。要与Lambda一起使用,我创建了一个带有以下结构的.zip文件:

在mail.js / node_modules

mail.js有以下代码:

var MailComposer = require('mailcomposer').MailComposer,
    mailcomposer = new MailComposer();
var ses =
    new aws.SES({
        accessKeyId: 'xxxxxxxxxxxx',
        secretAccessKey: 'xxxxxxxxxxxx'});

s3.getObject(params, function(err, data) {
  if (err) {
    //error handling
  } else {
    mailcomposer.setMessageOption({
      from: 'chirer@gmail.com’,
      to: 'sjuif@gmail.com',
      subject: 'Test’,
      body: 's3://' + bucket + '/' + key,
      html: 's3://' + bucket + '/' + key +
            '<br/><img src="cid:' + key + '" />'
    });
    var attachment = {
      contents: data.Body,
      contentType: 'image/png',
      cid: key
    };
    mailcomposer.addAttachment(attachment);
    mailcomposer.buildMessage(function(err, messageSource) {
      if (err) {
        // error handling
      } else {
        ses.sendRawEmail({RawMessage: {Data: messageSource}}, function(err, data) {
          if(err) {
            // error handling
          } else {
              context.done(null, data);
          }
        });
      }
    });
  }
});

当我创建lambda函数时,我会执行以下操作:

  1. 在选择蓝图菜单中,我选择“s3-get-object-python”
  2. 我选择了我的水桶
  3. 事件我选择“Put”
  4. 点击“下一步”
  5. 我给lambda函数命名并选择“上传.zip文件”
  6. 我使用mail.js和node_modules目录上传zip文件
  7. 作为处理程序,我填写“mail.handler”
  8. 作为角色,我选择“S3执行角色”。该向导现在提供一个新屏幕,我单击“查看策略文档”。我编辑文档,文档现在就像:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents"
          ],
          "Resource": "arn:aws:logs:*:*:*"
        },
        {
          "Effect": "Allow",
          "Action": [
            "s3:GetObject",
            "s3:PutObject",
            "ses:SendEmail",
            "ses:SendRawEmail"
          ],
          "Resource": [
            "*"
          ]
        }
      ]
    }
    
  9. 我点击“允许”并返回上一个屏幕

  10. 然后我选择next zh_cn启用lambda函数

  11. 当我现在上传一个png文件时,我的日志中出现以下错误。

    START RequestId: a4401d96-c0ef-11e5-9ae4-8f38a4f750b6 Version: $LATEST
    **Unable to import module 'mail': No module named mail**
    
    END RequestId: a4401d96-c0ef-11e5-9ae4-8f38a4f750b6
    REPORT RequestId: a4401d96-c0ef-11e5-9ae4-8f38a4f750b6  Duration: 0.35 ms   Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 9 MB   
    

    我不知道为什么因为我确定mail.js位于我的.Zip文件的根目录

2 个答案:

答案 0 :(得分:1)

在为AWS Lambda(Python)创建部署包时,您可以运行许多 gotchas 。我花了几个小时来调试会话,直到找到一个很少失败的公式。

我创建了一个自动化整个过程的脚本,因此不易出错。我还编写了教程,解释了一切是如何工作的。你可能想看一下:

Hassle-Free Python Lambda Deployment [Tutorial + Script]

答案 1 :(得分:0)

该错误意味着Lambda无法找到lib。它不能在proj / lib / python2.7 / site-packages或proj / lib64 / python2.7 / site-packages

它必须在proj /本身内。我遇到了与MySQL-python相同的问题并编写了一个howto:

http://www.iheavy.com/2016/02/14/getting-errors-building-amazon-lambda-python-functions-help-howto/

HTH -Sean