2

我的设置称为(的NodeJS)如下:使用AWS SES与lambda函数从S3

  • LAMBDA提供API端点经由AWS SES
  • API端点是发送出的电子邮件的功能从静态的JS文件叫上一个S3桶

这工作:

var exec = require('child_process').exec; 

var aws = require('aws-sdk'); 
var ses = new aws.SES({ 
    "accessKeyId": "MY_ACCESS_KEY", 
    "secretAccessKey": "MY_SECRET_ACCESS_KEY", 
    "region": "A_REGION" 
}); 

var ses = new aws.SES(); 

exports.handler = function(event, context) { 
    ...code to send email... 
}; 

我想从函数中删除证书,而让Lambda从其他地方获取证书。

如果我删除的凭据,我得到:

User `arn:aws:sts::1234567890:assumed-role/lambda_basic_execution/awslambda_1234567890\' is not authorized to perform `ses:SendEmail\' on resource `arn:aws:ses:us-region-123:1234567890:identity/[email protected]\' 

我仍然试图环绕策略,角色和凭据我的头。 我首先想到Lambda可能能够从S3环境变量中获取凭证,但我不知道如何设置这些凭据,或者无论如何这是正确的方法。

如果有人能给我一个提示这可能会起作用的话,会很棒。或者如果这是不可能的。

我从Lambda函数中删除证书的主要原因是我想将函数代码添加到git仓库中。我对将这些凭据添加到代码回购中感到不满。

+0

我发现这一点: “你可能会注意到的一件事是,我们暴露我们的AWS的公共和私有密钥其实,这是为了保证安全,我们实际上创建了一个新的AWS用户和一个策略,专门防止除了一个Lambda函数“ http://lg.i o/2015/05/16/the-future-is-now-and-its-using-aws-lambda.html (via http://stackoverflow.com/a/31013511/1667461) 所以也许创建一个只有这些权限的用户才是我的问题的答案。 – escapedcat

回答

5

当您创建了lambda函数时,您创建了具有足够权限的IAM角色来执行该函数本身,但不对其他任何AWS服务执行操作。从文档:

无论您的Lambda函数如何被调用,AWS Lambda总是 执行该函数。在创建Lambda函数时, 指定了AWS Lambda可以承担的代表您执行您的Lambda 函数的IAM角色。这个角色也被称为 执行角色。如果您的Lambda函数在执行期间访问其他AWS资源 (例如,要在Amazon S3 存储桶中创建对象,要从DynamoDB表读取项目或将日志写入 CloudWatch Logs),则需要授予执行角色权限为 您希望使用您的Lambda 函数执行的特定操作。

因此,您的新IAM角色无权执行SES发送操作。

从Web控制台或CLI,您可以找到这个IAM角色和update the existing inline policy (or attach a new one)允许发送电子邮件的行为:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Action": ["ses:SendEmail", "ses:SendRawEmail"], 
     "Resource":"*" 
    } 
    ] 
} 

我从你的问题的阅读,似乎S3主要是风马牛不相及的执行角色,如果您只是将其用于托管在那里的静态页面并且链接到API端点。如果您需要从函数本身列出/获取s3对象,您还需要在IAM角色中包含这些权限。

延伸阅读:

+1

非常感谢。如此接近,但迄今为止。我的默认AWS情绪。 – escapedcat