Aws-lambda-executing-and-invoking-lambda-function

提供:Dev Guides
移動先:案内検索

Lambda関数の実行と呼び出し

この章では、Lambda関数の実行と呼び出しのプロセスとそれに関連する手順について詳しく説明します。

AWS Lambda実行モデル

AWSの実行は、AWS Lambda Functionに追加された設定の詳細に依存します。 関数が作成されると、AWS Lambda関数の実行に使用される memory と* timeが割り当てられます*があります。

設定の詳細を利用して、AWS Lambdaは実行コンテキストを作成します。 実行コンテキストは一時的なランタイム環境であり、データベース接続、httpエンドポイント、サードパーティライブラリなどの外部依存関係があれば準備が完了しています。

AWS Lambda関数が初めて呼び出されたとき、またはラムダ関数が更新された場合、実行コンテキストのセットアップのために遅延がほとんど追加されません。 ただし、後続の呼び出しは最初の呼び出しに比べて高速です。 AWS Lambdaは、Lambda関数の呼び出し時間が短くなると、実行コンテキストの再利用を再試行します。

実行コンテキストの再利用には、次の意味があります-

  • Lambdaの実行のために行われたデータベース接続がある場合、その接続は再利用のために維持されます。 そのため、Lambdaコードは、接続が最初にチェックされ、存在し、再利用されるようにする必要があります。それ以外の場合は、新しい接続を新しく作成する必要があります。
  • 実行コンテキストは、 /tmp ディレクトリに500MBのディスク容量を維持します。 必要なデータはこのディレクトリにキャッシュされます。 コードに追加のチェックを行って、データが存在するかどうかを確認できます。
  • Lambda関数が呼び出されたときにコールバックまたはバックグラウンドプロセスが完了していない場合、ラムダ関数が再度呼び出されたときに実行が開始されます。 そのようなことを行う必要がない場合は、関数の実行が完了したときにプロセスがすべて正しく終了することを確認してください。

実行コンテキストと、tmpディレクトリに保存されているデータを使用する必要があります。 新しいデータを作成する前に、コードに必要なチェックを追加して、必要なデータが存在するかどうかを確認する必要があります。 これにより、実行中の時間が節約され、より高速になります。

AWS Lambda関数を呼び出す

*aws cli* を使用してAWSを手動で呼び出すことができます。 *cli* を使用してAWS Lambdaを作成およびデプロイする方法は既に説明しました。 ここでは、まず *aws cli* を使用して関数を作成し、同じ関数を呼び出します。

AWS CLIを使用してAWS Lambda関数を作成する

*aws cli* を使用してAWS Lambda関数を作成するには、次のコマンドを使用できます-

コマンド

create-function
--function-name <value>
--runtime <value>
--role <value>
--handler <value>
[--code <value>]
[--description <value>]
[--timeout <value>]
[--memory-size <value>]
[--environment <value>]
[--kms-key-arn <value>]
[--tags <value>]
[--zip-file <value>]
[--cli-input-json <value>]

値を指定したコマンド

aws lambda create-function
--function-name "lambdainvoke"
--runtime "nodejs8.10"
--role "arn:aws:iam::625297745038:role/lambdaapipolicy"
--handler "index.handler"
--timeout 5
--memory-size 256
--zip-file "fileb://C:\nodeproject\index.zip"

出力は次のようになります-

値を持つコマンド

AWSコンソールで作成された関数は以下のとおりです-

作成された関数

コードエントリタイプ 既存のロール

これで、次のコマンドを使用して関数を呼び出すことができます: invoke

--function-name <value>
[--invocation-type <value>]
[--log-type <value>]
[--client-context <value>]
[--payload <value>]
[--qualifier <value>]
outfile <value>

オプション

  • -function-name-*呼び出す関数の名前を指定します。

-invocation-type(string)-*デフォルトでは、invokation-typeは *requestresponse です。 invokation-typeで使用できる値は、 RequestResponse、Event 、および DryRun です。

  • イベント呼び出しタイプは、非同期応答に使用されます。
  • DryRunは、Lambda関数を実行せずに検証する場合に使用します。

-log-type-*呼び出しタイプがRequestResponseの場合、 *Tail になります。 最後の4KBのbase64でエンコードされたログデータを提供します。 可能な値は Tail および None です。

  • -client-context-*クライアント固有の詳細をLambda関数に渡すことができます。 clientcontextは、json形式でbase64エンコードされている必要があります。 最大ファイルサイズは3583バイトです。
  • -payload-*ラムダ関数へのjson形式の入力。

-qualifier- Lambda関数のバージョンまたはエイリアス名を指定できます。 関数バージョンを渡すと、apiは修飾された関数arnを使用してLambda関数を呼び出します。 エイリアス名を指定すると、APIはエイリアスARNを使用してLambda関数を呼び出します。

  • outfile-*これは、コンテンツが保存されるファイル名です。

値を指定したコマンド

aws lambda invoke --function-name "lambdainvoke" --log-type
Tail C:\nodeproject\outputfile.txt

コマンド値

ペイロードオプションを使用して、以下に示すように、json形式でダミーイベントをラムダ関数に送信できます。

関連するAWS Lambdaコードは次のとおりです-

exports.handler = async (event, callback) => {
   console.log("Hello => "+ event.name);
   console.log("Address =>"+ event.addr);
   callback(null, 'Hello '+event.name +" and address is "+ event.addr);
};

コードにコンソール event.nameevent.addr があることに注意してください。 さて、次のように名前とアドレスでイベントを送信するためにaws cliでペイロードオプションを使用してみましょう-

aws lambda invoke --function-name "lambdainvoke" --log-type
Tail --payload file://C:\clioutput\input.txt C:\clioutput\outputfile.txt

その後、payloadは、示されているようにjson入力を持つファイルパスとして入力を取ります-

{"name":"Roy Singh", "addr":"Mumbai"}

対応する出力は以下のとおりです-

対応する出力

出力は次のようにファイル C:\ clioutput \ outputfile.txt に保存されます-

"Hello Roy Singh and address is Mumbai"

サンプルイベント

サンプルイベントを渡すことで、AWS Lambda関数をテストできます。 このセクションでは、AWSサービスのサンプルイベントをいくつか示します。 invoke コマンドを使用して、いずれかのサービスでトリガーされたときに出力をテストできます。 以下の対応するサンプルイベントに指定されたコードを観察します-

Amazon S3 Putサンプルイベント

{
  "Records": [{
      "eventVersion": "2.0",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "requestParameters": {
         "SourceIPAddress": "127.0.0.1"
      },
      "s3": {
         "configurationId": "testConfigRule",
         "object": {
            "eTag": "0123456789abcdef0123456789abcdef",
            "sequencer": "0A1B2C3D4E5F678901",
            "key": "HappyFace.jpg",
            "size": 1024
         },
         "bucket": {
            "arn": bucketarn,
            "name": "Sourcebucket",
            "ownerIdentity": {
               "principalId": "EXAMPLE"
            }
         },
         "s3SchemaVersion": "1.0"
      },
      "responseElements": {
         "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
         "x-amz-request-id": "EXAMPLE123456789"
      },
      "awsRegion": "us-east-1",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
         "principalId": "EXAMPLE"
      },
      "eventSource": "aws:s3"
   }]
}

s3プットイベントからファイルの*詳細を取得するには、次のコマンドを使用できます-

event.Records[0].s3.object.key  //will display the name of the file

バケット名を取得するには、次のコマンドを使用できます-

event.Records[0].s3.bucket.name //will give the name of the bucket.
*EventName* を参照するには、次のコマンドを使用できます-
event.Records[0].eventName   //will display the eventname

Amazon S3サンプルイベントの削除

{
   "Records": [{
      "eventVersion": "2.0",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "requestParameters": {
         "SourceIPAddress": "127.0.0.1"
      },
      "s3": {
         "configurationId": "testConfigRule",
         "object": {
            "sequencer": "0A1B2C3D4E5F678901",
            "key": "HappyFace.jpg"
         },
         "bucket": {
            "arn": bucketarn,
            "name": "Sourcebucket",
            "ownerIdentity": {
               "principalId": "EXAMPLE"
            }
         },
        "s3SchemaVersion": "1.0"
      },
      "responseElements": {
         "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
         "x-amz-request-id": "EXAMPLE123456789"
      },
      "awsRegion": "us-east-1",
      "eventName": "ObjectRemoved:Delete",
      "userIdentity": {
         "principalId": "EXAMPLE"
      },
      "eventSource": "aws:s3"
   }]
}

Amazon DynamoDB

Amazon DynamoDBは、DynamoDBテーブルに変更が加えられた場合、AWS Lambdaのイベントになります。 DynamodDBテーブルのエントリの追加、レコードの更新、削除などの操作を実行できます。

DynamoDBの追加、挿入、削除イベントのサンプルイベントを次に示します-

{
  "Records": [{
      "eventID": "1",
      "eventVersion": "1.0",
      "dynamodb": {
         "Keys": {
            "Id": {
               "N": "101"
            }
         },
         "NewImage": {
            "Message": {
               "S": "New item!"
            },
            "Id": {
               "N": "101"
            }
         },
         "StreamViewType": "NEW_AND_OLD_IMAGES",
         "SequenceNumber": "111",
         "SizeBytes": 26
      },
      "awsRegion": "us-west-2",
      "eventName": "INSERT",
      "eventSourceARN": eventSourcearn,
      "eventSource": "aws:dynamodb"
   },
   {
      "eventID": "2",
      "eventVersion": "1.0",
      "dynamodb": {
         "OldImage": {
            "Message": {
               "S": "New item!"
            },
            "Id": {
               "N": "101"
            }
         },
        "SequenceNumber": "222",
        "Keys": {
            "Id": {
               "N": "101"
            }
         },
        "SizeBytes": 59,
        "NewImage": {
            "Message": {
               "S": "This item has changed"
            },
            "Id": {
                   "N": "101"
            }
         },
         "StreamViewType": "NEW_AND_OLD_IMAGES"
      },
      "awsRegion": "us-west-2",
      "eventName": "MODIFY",
      "eventSourceARN": Sourcearn,
      "eventSource": "aws:dynamodb"
   },
   {
   "eventID": "3",
      "eventVersion": "1.0",
      "dynamodb": {
         "Keys": {
            "Id": {
               "N": "101"
            }
         },
         "SizeBytes": 38,
         "SequenceNumber": "333",
         "OldImage": {
            "Message": {
               "S": "This item has changed"
            },
            "Id": {
               "N": "101"
            }
         },
         "StreamViewType": "NEW_AND_OLD_IMAGES"
      },      "awsRegion": "us-west-2",
      "eventName": "REMOVE",
      "eventSourceARN": Sourcearn,
      "eventSource": "aws:dynamodb"
   }]
}

Amazon簡易通知サービス

AWS Lambdaは、* Simple Notification Service(SNS)*で作成された通知の処理に役立ちます。 SNSにメッセージが公開されるたびに、メッセージの詳細を含むSNSイベントでLambda関数をトリガーできます。 このメッセージはLambda関数内で処理でき、要件に従って他のサービスにさらに送信できます。

メッセージが入力されると、SNSはLambda関数をトリガーします。 エラーがLambda関数を呼び出そうとすると、SNSは最大3回までラムダ関数の呼び出しを再試行します。

Amazon SNSサンプルイベント

AWS Lambda関数で利用可能なすべての詳細を備えたサンプルイベントは、さらにプロセスを実行するために以下に示されています-

{
  "Records": [{
      "EventVersion": "1.0",
      "EventSubscriptionArn": eventsubscriptionarn,
      "EventSource": "aws:sns",
      "Sns": {
         "SignatureVersion": "1",
         "Timestamp": "1970-01-01T00:00:00.000Z",
         "Signature": "EXAMPLE",
         "SigningCertUrl": "EXAMPLE",
         "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e",
         "Message": "Hello from SNS!",
         "MessageAttributes": {
            "Test": {
               "Type": "String",
               "Value": "TestString"
            },
            "TestBinary": {
               "Type": "Binary",
               "Value": "TestBinary"
            }
         },
         "Type": "Notification",
         "UnsubscribeUrl": "EXAMPLE",
         "TopicArn": topicarn,
         "Subject": "TestInvoke"
      }
   }]
}

Amazon Simple Mail Service

Amazon Simple Mail Serviceは、メッセージの送信とメッセージの受信に使用できます。 AWS Lambda関数は、メッセージの受信時にSimple Mail Serviceで呼び出すことができます。

Amazon SES Eメール受信サンプルイベント

AWS Lambda内で使用される場合のSESイベントの詳細を以下に示します-

{
  "Records": [{
      "eventVersion": "1.0",
      "ses": {
         "mail": {
            "commonHeaders": {
               "from": [
                  "Jane Doe <[email protected]>"
               ],
            "to": [
               "[email protected]"
            ],
            "returnPath": "[email protected]",
            "messageId": "<0123456789Source.com>",
            "date": "Wed, 7 Oct 2015 12:34:56 -0700",
            "subject": "Test Subject"
         },
         "example": "[email protected]",
         "timestamp": "1970-01-01T00:00:00.000Z",
         "destination": [
            "[email protected]"
         ],
         "headers": [{
            "name": "Return-Path",
            "value": "<[email protected]>"
         },
         {
            "name": "Received",
            "value": "from mailer.example.com (mailer.example.com [203.0.113.1]) by inbound-smtp.us-west-2.amazonaws.com with SMTP id o3vrnil0e2ic for [email protected]; Wed, 07 Oct 2015 12:34:56 +0000 (UTC)"
         },
         {
            "name": "DKIM-Signature",
            "value": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; s=example; h=mime-version:from:date:message-id:subject:to:content-type; bh=jX3F0bCAI7sIbkHyy3mLYO28ieDQz2R0P8HwQkklFj4=; b=sQwJ+LMe9RjkesGu+vqU56asvMhrLRRYrWCbV"
         },
         {
            "name": "MIME-Version",
            "value": "1.0"
         },
         {
            "name": "From",
            "value": "Jane Doe <[email protected]>"
         },
         {
            "name": "Date",
            "value": "Wed, 7 Oct 2015 12:34:56 -0700"
         },
         {
            "name": "Message-ID",
            "value": "<0123456789example.com>"
         },
         {
            "name": "Subject",
            "value": "Test Subject"
         },
         {
            "name": "To",
            "value": "[email protected]"
         },
         {
            "name": "Content-Type",
            "value": "text/plain; charset=UTF-8"
         }],
         "headersTruncated": false,
         "messageId": "o3vrnil0e2ic28tr"
      },
      "receipt": {
         "recipients": [
            "[email protected]"
         ],
         "timestamp": "1970-01-01T00:00:00.000Z",
         "spamVerdict": {
            "status": "PASS"
         },
         "dkimVerdict": {
            "status": "PASS"
         },
         "processingTimeMillis": 574,
         "action": {
            "type": "Lambda",
            "invocationType": "Event",
            "functionArn": "arn:aws:lambda:us-west-2:012345678912:function:example"
         },
         "spfVerdict": {
            "status": "PASS"
         },
         "virusVerdict": {
            "status": "PASS"
         }
      }
   },
   "eventexample": "aws:ses"
   }]
}

Amazon Cloudwatchログ

AWS Lambdaは、 CloudWatch Logs Subscriptions を使用してAmazon CloudWatch Logsからトリガーできます。 CloudWatch Logsサブスクリプションには、AWS Lambda内で処理および分析できる、または他のシステムへのロードに使用できるログに関するデータのリアルタイムデータがあります。

Amazon CloudWatch Logsサンプルイベント

{
   "awslogs": {
      "data": "H4sIAAAAAAAAAHWPwQqCQBCGX0Xm7EFtK+smZBEUgXoLCdMhFtKV3akI8d0bLYmibvPPN3wz00CJxmQnTO41whwW
      QRIctmEcB6sQbFC3CjW3XW8kxpOpP+OC22d1Wml1qZkQGtoMsScxaczKN3plG8zlaHIta5KqWsozoTYw3/djzwhpL
      wivWFGHGpAFe7DL68JlBUk+l7KSN7tCOEJ4M3/qOI49vMHj+zCKdlFqLaU2ZHV2a4Ct/an0/ivdX8oYc1UVX860fQ
      DQiMdxRQEAAA=="
   }
}

Amazon API Gateway

AWS Lambda関数は、 https URLで呼び出すことができます。 ITは GET、POST、PUT で実行できます。 https URLが呼び出されると、AWS Lambda関数もトリガーされ、get/postを使用してhttpsに渡されたデータをAWS Lambda内で使用可能にして、DynamoDBへの挿入やメールの送信などに使用できます。

API Gatewayプロキシリクエストイベント

{
   "path": "/test/hello",
   "headers": {
      "Accept":  "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
      "Accept-Encoding": "gzip, deflate, lzma, sdch, br",
      "Accept-Language": "en-US,en;q=0.8",
      "CloudFront-Forwarded-Proto": "https",
      "CloudFront-Is-Desktop-Viewer": "true",
      "CloudFront-Is-Mobile-Viewer": "false",
      "CloudFront-Is-SmartTV-Viewer": "false",
      "CloudFront-Is-Tablet-Viewer": "false",
      "CloudFront-Viewer-Country": "US",
      "Host": "wt6mne2s9k.execute-api.us-west-2.amazonaws.com",
      "Upgrade-Insecure-Requests": "1",
      "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48",
      "Via": "1.1 fb7cca60f0ecd82ce07790c9c5eef16c.cloudfront.net (CloudFront)",
      "X-Amz-Cf-Id": "nBsWBOrSHMgnaROZJK1wGCZ9PcRcSpq_oSXZNQwQ10OTZL4cimZo3g==",
      "X-Forwarded-For": "192.168.100.1, 192.168.1.1",
      "X-Forwarded-Port": "443",
      "X-Forwarded-Proto": "https"
   },
   "pathParameters": {
      "proxy": "hello"
   },
   "requestContext": {
      "accountId": "123456789012",
      "reexampleId": "us4z18",
      "stage": "test",
      "requestId": "41b45ea3-70b5-11e6-b7bd-69b5aaebc7d9",
       "identity": {
         "cognitoIdentityPoolId": "",
         "accountId": "",
         "cognitoIdentityId": "",
         "caller": "",
         "apiKey": "",
         "exampleIp": "192.168.100.1",
         "cognitoAuthenticationType": "",
         "cognitoAuthenticationProvider": "",
         "userArn": "",
         "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48",
         "user": ""
      },
      "reexamplePath": "/{proxy+}",
      "httpMethod": "GET",
      "apiId": "wt6mne2s9k"
   },
   "reexample": "/{proxy+}",
   "httpMethod": "GET",
   "queryStringParameters": {
      "name": "me"
   },
   "stageVariables": {
      "stageVarName": "stageVarValue"
   }
}

API Gatewayプロキシ応答イベント

{
   "statusCode": 200,
   "headers": {
      "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
      "Accept-Encoding": "gzip, deflate, lzma, sdch, br",
      "Accept-Language": "en-US,en;q=0.8",
      "CloudFront-Forwarded-Proto": "https",
      "CloudFront-Is-Desktop-Viewer": "true",
      "CloudFront-Is-Mobile-Viewer": "false",
      "CloudFront-Is-SmartTV-Viewer": "false",
      "CloudFront-Is-Tablet-Viewer": "false",
      "CloudFront-Viewer-Country": "US",
      "Host": "wt6mne2s9k.execute-api.us-west-2.amazonaws.com",
      "Upgrade-Insecure-Requests": "1",
      "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48",
      "Via": "1.1 fb7cca60f0ecd82ce07790c9c5eef16c.cloudfront.net (CloudFront)",
      "X-Amz-Cf-Id": "nBsWBOrSHMgnaROZJK1wGCZ9PcRcSpq_oSXZNQwQ10OTZL4cimZo3g==",
      "X-Forwarded-For": "192.168.100.1, 192.168.1.1",
      "X-Forwarded-Port": "443",
      "X-Forwarded-Proto": "https"
   },
   "body": "Hello World"
}