将AWS SES与从S3调用的Lambda函数(nodejs)一起使用

esc*_*cat 4 amazon-s3 amazon-web-services amazon-ses amazon-iam aws-lambda

我的设置如下:

  • Lambda为通过AWS SES发送电子邮件的功能提供API端点
  • API端点是从S3存储桶上的静态JS文件调用的

这有效:

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...
};
Run Code Online (Sandbox Code Playgroud)

我想从函数中删除凭据,而是让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/my.identity@domain.com\'
Run Code Online (Sandbox Code Playgroud)

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

如果有人能给我一个暗示这可能如何起作用的话会很棒.或者如果不可能的话.

我从Lambda函数中删除凭据的主要原因是我想将函数代码添加到git仓库.我对将这些凭据添加到代码仓库感到很难过.

Ant*_*ace 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角色并更新现有内联策略(或附加新策略)以允许发送电子邮件操作:

{
    "Version": "2012-10-17",
    "Statement": [
    {
       "Effect": "Allow",
       "Action": ["ses:SendEmail", "ses:SendRawEmail"],
       "Resource":"*"
     }
    ]
 }
Run Code Online (Sandbox Code Playgroud)

从我对你的问题的解读看来,如果你只是将它用于那里托管的静态页面,并且有一个指向API端点的链接,那么S3似乎与执行角色无关.如果需要从函数本身列出/获取s3对象,则同样需要在IAM角色中包含这些权限.

进一步阅读:

  • 非常感谢。如此接近,却又如此遥远。我默认的 AWS 情绪。 (2认同)