メニュー
AWS Lambda
開発者ガイド

ステップ 2.3: Lambda 関数を作成し、手動でテストする

このセクションでは、以下の作業を行います。

  • デプロイパッケージをアップロードして、Lambda 関数を作成します。

  • Lambda 関数を手動で呼び出してテストします。

    このステップでは、バケット名を特定するサンプルの S3 イベントとサンプルオブジェクト (サンプルの CloudTrail ログ) を使用します。次のセクションでは、オブジェクト作成イベントを発行するように 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.10 または nodejs4.3 に設定します。

Lambda関数は Java または Python で記述することもできます。他の言語を使用する場合は、その言語に合わせて --runtime パラメータ値を java8python3.6、または python2.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

オプションとして、同じ AWS リージョンの Amazon S3 バケットに .zip ファイルをアップロードし、前述のコマンドでそのバケットとオブジェクト名を指定することもできます。次に示すように、--zip-file パラメーターを --code パラメーターで置き換える必要があります。

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

注記

AWS Lambda コンソールを使用して Lambda 関数を作成できます。その場合には、AWS CLI コマンド create-function のパラメーターの値をメモしておきます。コンソールで同じパラメーター値を指定します。

ステップ 2.3.2: Lambda 関数をテストする (手動で呼び出す)

このセクションでは、サンプルの Amazon S3 イベントデータを使用して Lambda関数を手動で呼び出します。Lambda 関数は、実行されると S3 イベントデータで識別されたバケットから S3 オブジェクト (サンプルの CloudTrail ログ) を読み取り、サンプルの CloudTrail ログで特定の API の使用が報告された場合に、SNS トピックにイベントを発行します。このチュートリアルでは、この特定の API として、トピックの作成に使用される SNS API を使用しています。つまり、CloudTrail ログでは、sns.amazonaws.comeventSource として識別し、CreateTopiceventName として識別するレコードが報告されます。

  1. 次のサンプル CloudTrail ログをファイル (ExampleCloudTrailLog.json) に保存します。

    注記

    このログには、eventSourcesns.amazonaws.com で、eventNameCreateTopic である 1 つのイベントがあります。この Lambda 関数は、ログを読み取り、このタイプのイベントを見つけると、作成した Amazon SNS トピックにイベントを発行します。この Lambda 関数を手動で呼び出すと、1 通の E メールが送信されます。

    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. CloudTrail 設定で指定した examplebucketExampleCloudTrailLog.json.gz ファイルをアップロードします。

    このオブジェクトは、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 トピックに投稿し、E メール通知が送信されます。

    Lambda 関数のアクティビティは、CloudWatch のメトリクスとログを使用してモニタリングできます。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 を設定する)