使用Lambda函式與CloudTrail



AWS CloudTrail是Amazon提供的一項服務,它可以記錄在AWS控制檯中執行的所有活動。它記錄所有API呼叫並存儲歷史記錄,這些記錄可用於後續的除錯目的。請注意,我們無法從CloudTrail觸發Lambda。相反,CloudTrail將所有歷史記錄以日誌的形式儲存在S3儲存桶中,我們可以從S3觸發AWS Lambda。每當向S3儲存桶新增任何日誌時,一旦需要處理任何日誌,AWS Lambda就會被觸發。

先決條件

在開始使用AWS CloudTrail、S3和AWS Lambda之前,您需要執行以下操作:

  • 建立S3儲存桶以儲存CloudTrail日誌
  • 建立SNS服務
  • 在CloudTrail中建立一個跟蹤,並分配S3儲存桶和SNS服務
  • 建立具有許可權的IAM角色。
  • 建立AWS Lambda函式
  • AWS Lambda配置

示例

讓我們考慮一個示例,該示例演示了AWS CloudTrail、S3和AWS Lambda的工作原理。在這裡,我們將建立一個S3儲存桶,用於儲存在AWS控制檯中執行的任何互動的所有日誌。讓我們建立一個SNS主題併發布它。對於此操作,日誌將作為檔案輸入到S3中。AWS Lambda將被觸發,它將使用Amazon SES服務傳送郵件。

解釋此過程的框圖如下所示:

Block Diagram Cloudtrail

建立S3儲存桶以儲存CloudTrail日誌

轉到AWS控制檯並單擊S3服務。單擊建立儲存桶並輸入要儲存CloudTrail日誌的儲存桶名稱,如下所示:

Create Bucket

請注意,在這裡我們建立了一個名為cloudtraillogsaws的S3儲存桶來儲存日誌。

建立SNS服務

轉到AWS控制檯並單擊簡單通知服務。從左側選擇主題,然後單擊“建立新主題”按鈕。

Simple Notification

我們建立了一個名為displaytrail的主題來發布主題。其詳細資訊將儲存在上面建立的S3儲存桶中。

在Cloudtrail中建立一個跟蹤,並分配S3儲存桶和SNS服務

轉到AWS控制檯,從管理工具中單擊CloudTrail服務,如下所示:

Create Trails

從左側單擊跟蹤,如下所示:

Trail Dashboard

Trails

單擊建立跟蹤按鈕。輸入跟蹤名稱,將跟蹤應用於所有區域選擇。然後日誌將應用於所有區域。

Trail Name

對於讀/寫事件,選擇全部。新增S3儲存桶SNS主題詳細資訊,如下所示。您可以在此處建立一個新的或新增一個現有的。

Read Events

請注意,可以選擇加密日誌檔案、啟用日誌檔案驗證、為每個日誌檔案交付傳送SNS通知等。我在這裡使用了預設值。您可以允許檔案加密,它將要求加密金鑰。新增詳細資訊後,單擊“建立跟蹤”按鈕。

Encrypt Log

建立具有許可權的IAM角色

轉到AWS控制檯並選擇IAM。建立一個具有S3、Lambda、CloudTrail和SES許可權的角色,用於傳送電子郵件。建立的角色如下所示:

Trail Lambda

建立AWS Lambda函式

轉到AWS服務並單擊Lambda服務。新增函式名稱,選擇執行時為nodejs,並選擇為Lambda函式建立的角色。以下是建立的Lambda函式。

Lambda Trail

AWS Lambda配置

接下來,我們需要新增S3作為建立的AWS Lambda的觸發器。

Lambda Configuration

新增S3儲存桶詳細資訊以新增觸發器,並新增以下AWS Lambda程式碼:

const aws =  require("aws-sdk");
const sns = new aws.SNS({
region:'us-east-1'
});
var ses = new aws.SES({
   region: 'us-east-1'
});
exports.handler = function(event, context, callback) {
   console.log("AWS lambda and SNS trigger ");
   console.log(event);
   const s3message = "Bucket Name:"+event.Records[0].s3.bucket.name+"\nLog details:"+event.Records[0].s3.object.key;
   console.log(s3message);
   var eParams = {
      Destination: {
         ToAddresses: ["xxxxxxxxx12@gmail.com"]
      },
      Message: {
         Body: {
            Text: {
               Data:s3message
            }
         },
         Subject: {
            Data: "cloudtrail logs"
         }
      },
      Source: "coxxxxxx@gmail.com"
   };
   var email = ses.sendEmail(eParams, function(err, data) {
      if (err) console.log(err);
      else {
         console.log("===EMAIL SENT===");
         console.log("EMAIL CODE END");
         console.log('EMAIL: ', email);
         context.succeed(event);
         callback(null, "email is send");
      }
   });
};

請注意,我們正在從事件中獲取S3儲存桶和日誌詳細資訊,並如上所示使用SES服務傳送郵件。

每當在AWS控制檯中發生任何活動時,日誌都將傳送到S3儲存桶,同時AWS Lambda將被觸發,並將郵件傳送到程式碼中提到的電子郵件ID。

Cloudtrail Logs

請注意,您可以在AWS Lambda中根據您的需要處理日誌。

廣告