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