使用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: ["[email protected]"]
      },
      Message: {
         Body: {
            Text: {
               Data:s3message
            }
         },
         Subject: {
            Data: "cloudtrail logs"
         }
      },
      Source: "[email protected]"
   };
   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中根据您的需要处理日志。

广告