AWS Lambda
开发人员指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

步骤 2.3:创建 Lambda 函数并手动对其进行测试

请在此部分中执行以下操作:

  • 通过上传部署程序包来创建 Lambda 函数。

  • 通过手动调用 Lambda 函数来对其进行测试。

    在本步骤中,您使用标识存储桶名称和示例对象(即示例 CloudTrail 日志)的示例 S3 事件。在下一节中,您将 S3 存储桶通知配置为发布对象创建事件并测试端到端体验。

步骤 2.3.1:创建 Lambda 函数(上传部署程序包)

在本步骤中,您使用 AWS CLI 上传部署程序包并在创建 Lambda 函数时提供配置信息。在命令提示符处,使用 adminuser profile 运行下面的 Lambda CLI create-function 命令。

注意

您需要通过提供 .zip 文件路径 (//file-path/CloudTrailEventProcessing.zip \) 和执行角色 ARN (execution-role-arn) 来更新该命令。如果您使用了本教程的前面部分提供的示例代码,请将 --runtime 参数值设置为 nodejs6.10nodejs4.3

您也可以用 Java 或 Python 编写 Lambda 函数。如果您使用了其他语言,请根据需要将 --runtime 参数值更改为 java8python3.6python2.7

Copy
$ aws lambda create-function \ --region us-west-2 \ --function-name CloudTrailEventProcessing \ --zip-file fileb://file-path/CloudTrailEventProcessing.zip \ --role execution-role-arn \ --handler CloudTrailEventProcessing.handler \ --runtime nodejs6.10 \ --profile adminuser \ --timeout 10 \ --memory-size 1024

或者,您也可以将 .zip 文件上传到同一 AWS 区域中的 Amazon S3 存储桶,然后在之前的命令中指定该存储桶和对象名称。您需要将 --zip-file 参数替换为 --code 参数,如下所示:

Copy
--code S3Bucket=bucket-name,S3Key=zip-file-object-key

注意

您可以使用 AWS Lambda 控制台创建 Lambda 函数,在这种情况下,应记下 create-function AWS CLI 命令参数的值。您应在控制台中提供相同的值。

步骤 2.3.2:测试 Lambda 函数(手动调用)

在本节中,您将使用示例 Amazon S3 事件数据手动调用 Lambda 函数。Lambda 函数执行时,会从 S3 事件数据标识的存储桶中读取 S3 对象(示例 CloudTrail 日志),如果示例 CloudTrail 日志报告使用了特定的 API,则会向您的 SNS 主题发布事件。对于本教程,API 是用于创建主题的 SNS API。即:CloudTrail 日志报告将 sns.amazonaws.com 标识为 eventSource、将 CreateTopic 标识为 eventName 的记录。

  1. 将下面的示例 CloudTrail 日志保存到文件 (ExampleCloudTrailLog.json) 中。

    注意

    注意:该日志中某个事件的 sns.amazonaws.comeventSourceCreateTopiceventName。您的 Lambda 函数将读取这些日志,如果它找到此类型的事件,则向您创建的 Amazon SNS 主题发布该事件,然后当您手动调用 Lambda 函数时,您会收到一封电子邮件。

    Copy
    { "Records":[ { "eventVersion":"1.02", "userIdentity":{ "type":"Root", "principalId":"account-id", "arn":"arn:aws:iam::account-id:root", "accountId":"account-id", "accessKeyId":"access-key-id", "sessionContext":{ "attributes":{ "mfaAuthenticated":"false", "creationDate":"2015-01-24T22:41:54Z" } } }, "eventTime":"2015-01-24T23:26:50Z", "eventSource":"sns.amazonaws.com", "eventName":"CreateTopic", "awsRegion":"us-west-2", "sourceIPAddress":"205.251.233.176", "userAgent":"console.amazonaws.com", "requestParameters":{ "name":"dropmeplease" }, "responseElements":{ "topicArn":"arn:aws:sns:us-west-2:account-id:exampletopic" }, "requestID":"3fdb7834-9079-557e-8ef2-350abc03536b", "eventID":"17b46459-dada-4278-b8e2-5a4ca9ff1a9c", "eventType":"AwsApiCall", "recipientAccountId":"account-id" }, { "eventVersion":"1.02", "userIdentity":{ "type":"Root", "principalId":"account-id", "arn":"arn:aws:iam::account-id:root", "accountId":"account-id", "accessKeyId":"access-key-id", "sessionContext":{ "attributes":{ "mfaAuthenticated":"false", "creationDate":"2015-01-24T22:41:54Z" } } }, "eventTime":"2015-01-24T23:27:02Z", "eventSource":"sns.amazonaws.com", "eventName":"GetTopicAttributes", "awsRegion":"us-west-2", "sourceIPAddress":"205.251.233.176", "userAgent":"console.amazonaws.com", "requestParameters":{ "topicArn":"arn:aws:sns:us-west-2:account-id:exampletopic" }, "responseElements":null, "requestID":"4a0388f7-a0af-5df9-9587-c5c98c29cbec", "eventID":"ec5bb073-8fa1-4d45-b03c-f07b9fc9ea18", "eventType":"AwsApiCall", "recipientAccountId":"account-id" } ] }
  2. 运行 gzip 命令以从之前的源文件创建 .gz 文件。

    Copy
    $ gzip ExampleCloudTrailLog.json

    这会创建 ExampleCloudTrailLog.json.gz 文件。

  3. ExampleCloudTrailLog.json.gz 文件上传到您在 CloudTrail 配置中指定的 examplebucket

    该对象在我们用于手动调用 Lambda 函数的示例 Amazon S3 事件数据中指定。

  4. 将下面的 JSON(示例 S3 事件)保存到文件 input.txt 中。记下存储桶名称和对象键名称值。

    在调用 Lambda 函数时,您将提供该示例事件。有关 S3 事件结构的更多信息,请参阅 Amazon Simple Storage Service 开发人员指南 中的事件消息结构

    Copy
    { "Records":[ { "eventVersion":"2.0", "eventSource":"aws:s3", "awsRegion":"us-west-2", "eventTime":"1970-01-01T00:00:00.000Z", "eventName":"ObjectCreated:Put", "userIdentity":{ "principalId":"AIDAJDPLRKLG7UEXAMPLE" }, "requestParameters":{ "sourceIPAddress":"127.0.0.1" }, "responseElements":{ "x-amz-request-id":"C3D13FE58DE4C810", "x-amz-id-2":"FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD" }, "s3":{ "s3SchemaVersion":"1.0", "configurationId":"testConfigRule", "bucket":{ "name":"your bucket name", "ownerIdentity":{ "principalId":"A3NL1KOZZKExample" }, "arn":"arn:aws:s3:::mybucket" }, "object":{ "key":"ExampleCloudTrailLog.json.gz", "size":1024, "eTag":"d41d8cd98f00b204e9800998ecf8427e", "versionId":"096fKKXTRTtl3on89fVO.nfljtsv6qko" } } } ] }
  5. 在 AWS 管理控制台中,使用示例 Amazon S3 事件数据手动调用函数。有关说明,请参阅入门练习步骤 2.2:手动调用 Lambda 函数并验证结果、日志和指标。在控制台中,使用以下示例 Amazon S3 事件数据。

    注意

    建议您使用控制台来调用函数,因为控制台 UI 提供了用于查看执行结果(包括执行摘要、代码写入的日志和函数返回的结果)的用户友好型界面(因为控制台始终执行同步执行 - 使用 RequestResponse 调用类型来调用 Lambda 函数)。

    Copy
    { "Records":[ { "eventVersion":"2.0", "eventSource":"aws:s3", "awsRegion":"us-west-2", "eventTime":"1970-01-01T00:00:00.000Z", "eventName":"ObjectCreated:Put", "userIdentity":{ "principalId":"AIDAJDPLRKLG7UEXAMPLE" }, "requestParameters":{ "sourceIPAddress":"127.0.0.1" }, "responseElements":{ "x-amz-request-id":"C3D13FE58DE4C810", "x-amz-id-2":"FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD" }, "s3":{ "s3SchemaVersion":"1.0", "configurationId":"testConfigRule", "bucket":{ "name":"your bucket name", "ownerIdentity":{ "principalId":"A3NL1KOZZKExample" }, "arn":"arn:aws:s3:::mybucket" }, "object":{ "key":"ExampleCloudTrailLog.json.gz", "size":1024, "eTag":"d41d8cd98f00b204e9800998ecf8427e", "versionId":"096fKKXTRTtl3on89fVO.nfljtsv6qko" } } } ] }
  6. 执行下面的 AWS CLI 命令,以使用 adminuser profile 手动调用该函数。

    Copy
    $ aws lambda invoke-async \ --function-name CloudTrailEventProcessing \ --region us-west-2 \ --invoke-args /filepath/input.txt \ --debug \ --profile adminuser

    由于示例日志对象中有一条事件记录,其中显示了要调用的用于创建主题的 SNS API,因此,Lambda 函数会将该事件发布到您的 SNS 主题,而您应该会收到一封电子邮件通知。

    您可以借助 CloudWatch 指标和日志监控 Lambda 函数的活动。有关 CloudWatch 监控的更多信息,请参阅使用 Amazon CloudWatch 诊断和监控 AWS Lambda 函数

  7. (可选)使用 AWS CLI 手动调用 Lambda 函数,如下所示:

    1. 将本过程前面部分的步骤 2 中的 JSON 保存到名为 input.txt 的文件中。

    2. 执行下面的 invoke 命令:

      Copy
      $ aws lambda invoke \ --invocation-type Event \ --function-name CloudTrailEventProcessing \ --region us-west-2 \ --payload file://file-path/input.txt \ --profile adminuser outputfile.txt

      注意

      在本教程示例中,消息保存在 outputfile.txt 文件中。如果您请求同步执行(RequestResponse 作为调用类型),函数将在响应正文中返回字符串消息。

      对于 Node.js,该消息可能为以下形式之一(您在代码中指定的任何一个):

      context.succeed("message")

      context.fail("message")

      context.done(null, "message)

      对于 Python 或 Java,它是返回语句中的消息:

      return "message"

下一步

步骤 3:添加事件源(配置 Amazon S3 以发布事件)