将 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 Bucket 以存储 CloudTrail 日志

转到 AWS 控制台并单击 S3 服务。单击创建存储桶并输入要存储 cloudtrail 日志的存储桶的名称,如图所示 −

创建存储桶

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

创建 SNS 服务

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

简单通知

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

在 Cloudtrail 中创建 Trail 并分配 S3 bucket 和 SNS 服务

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

创建 Trails

从左侧单击 Trails,如下所示 −

Trail Dashboard Trails

单击Create Trail按钮。输入Trail name(跟踪名称)、Apply trail to allregion(将跟踪应用于所有区域)并选择Yes。这样,日志将应用于所有区域。

Trail Name(跟踪名称)

对于Read/Write events(读/写事件),选择All。添加S3 bucket(S3 存储桶)SNS topic(SNS 主题)详细信息,如下所示。您可以在此处创建一个新的或添加现有的。

读取事件

请注意,有可用的选项来加密日志文件、启用日志文件验证、为每个日志文件传送发送 sns 通知等。我在这里使用了默认值。您可以允许文件加密,它会要求输入加密密钥。添加详细信息后,单击"创建跟踪"按钮。

加密日志

创建具有权限的 IAM 角色

转到 AWS 控制台并选择 IAM。创建一个具有 S3、Lambda、CloudTrail 和 SES 权限的角色以发送电子邮件。创建的角色如下图所示 −

Trail Lambda

创建 AWS Lambda 函数

进入 AWS 服务,点击 Lambda 服务,添加函数名称,选择运行时为 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+"
Log 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 中处理日志。