将Lambda函数与CloudTrail一起使用

AWS CloudTrail 是亚马逊提供的服务,可帮助记录在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 Bucket以存储CloudTrail日志

转到AWS控制台并单击S3服务.单击创建存储桶,然后输入要存储cloudtrail日志的存储桶的名称,如下所示 :

创建存储桶

注意,我们在这里创建了一个用于存储日志的S3存储桶 cloudtraillogsaws .

创建SNS服务

转到AWS控制台并单击简单通知服务.从左侧选择主题,然后单击"创建新主题"按钮.

简单通知

我们创建了一个名为 displaytrail 的主题来发布主题.其详细信息将存储在上面创建的S3bucket中.

在Cloudtrail中创建路径并分配S3存储桶和SNS服务

转到AWS控制台并从管理工具中单击 CloudTrail 服务,如下所示 :

创建路径

点击左侧的 Trails ,如下图所示 :

Trail Dashboard


Trails

单击创建路径按钮.输入路径名称,将路径应用于所有地区,然后选择.那么日志将应用于所有区域.

Trail Name

对于读/写事件,请选择全部.添加 S3存储桶 SNS主题详细信息,如下所示.你可以在这里创建一个新的或添加现有的.

Read Events

请注意,加密日志文件,启用日志文件验证,为每个日志文件传送发送sns通知等可用选项.我在此处使用了默认值.您可以允许文件加密,它会要求加密密钥.添加详细信息后,单击"创建路径"按钮.

加密日志

使用权限创建IAM角色

转到AWS控制台并选择IAM.创建具有S3,Lambda,CloudTrail和SES权限的角色,用于发送电子邮件.创建的角色如下所示 :

Trail Lambda

创建AWS Lambda函数

转到AWS服务并单击 Lambda 服务.添加函数名称,选择runtime作为 nodejs ,然后选择为lambda函数创建的角色.以下是创建的lambda函数.

Lambda Trail

AWS Lambda配置

接下来,我们需要添加S3作为创建AWS lambda的触发器.

Lambda配置

添加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中的需要处理日志