Lambda 함수 실행 및 호출

이 장에서는 Lambda 함수를 실행하고 호출하는 프로세스와 관련 단계에 대해 자세히 설명합니다.

AWS Lambda 실행 모델

AWS 실행은 AWS Lambda 함수에 추가 된 구성 세부 정보에 따라 다릅니다. 함수가 생성되면memorytime allotted, AWS Lambda 함수 실행에 사용됩니다.

구성 세부 정보의 도움으로 AWS Lambda는 실행 컨텍스트를 생성합니다. 실행 컨텍스트는 데이터베이스 연결, http 엔드 포인트, 타사 라이브러리 등과 같은 외부 종속성 (있는 경우)으로 준비된 임시 런타임 환경입니다.

AWS Lambda 함수가 처음으로 호출되거나 lambda 함수가 업데이트 된 경우 실행 컨텍스트 설정으로 인해 추가 지연 시간이 거의 없습니다. 그러나 후속 호출은 첫 번째 호출에 비해 더 빠릅니다. AWS Lambda는 Lambda 함수가 더 짧은 시간에 호출되면 실행 컨텍스트를 다시 재사용하려고합니다.

실행 컨텍스트의 재사용은 다음과 같은 의미를 갖습니다.

  • Lambda 실행을 위해 데이터베이스 연결이 완료된 경우 재사용을 위해 연결이 유지됩니다. 따라서 Lambda 코드는 연결이 존재하고 재사용되는 경우 먼저 확인해야하는 것과 같아야합니다. 그렇지 않으면 우리는 새로운 연결을 만들어야합니다.

  • 실행 컨텍스트는 500MB의 디스크 공간을 유지합니다. /tmp예배 규칙서. 필요한 데이터는이 디렉토리에 캐시됩니다. 데이터가 있는지 확인하기 위해 코드를 추가로 확인할 수 있습니다.

  • Lambda 함수가 호출 될 때 콜백 또는 일부 백그라운드 프로세스가 완료되지 않은 경우 Lambda 함수가 다시 호출 될 때 실행이 시작됩니다. 그런 일이 필요하지 않은 경우 함수 실행이 완료되면 프로세스가 모두 올바르게 종료되었는지 확인하십시오.

실행 컨텍스트와 tmp 디렉토리에 저장된 데이터를 사용해야합니다. 새 데이터를 만들기 전에 필요한 데이터가 있는지 확인하기 위해 코드에 필요한 검사를 추가해야합니다. 이렇게하면 실행하는 동안 시간이 절약되고 더 빨라집니다.

AWS Lambda 함수 호출

다음을 사용하여 AWS를 수동으로 호출 할 수 있습니다. aws cli. 우리는 이미 다음을 사용하여 AWS Lambda를 생성하고 배포하는 방법을 살펴 보았습니다.cli. 여기서는 먼저aws cli 동일한 것을 호출하십시오.

AWS CLI를 사용하여 AWS Lambda 함수 생성

다음 명령을 사용하여 AWS Lambda 함수를 생성 할 수 있습니다. aws cli

Commands

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>]

Command with values

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>

Options

--function-name − 호출하려는 함수의 이름을 지정하십시오.

--invocation-type(string) − 기본적으로 호출 유형은 다음과 같습니다. requestresponse. 호출 유형과 함께 사용할 수있는 값은 다음과 같습니다.RequestResponse, EventDryRun.

  • 이벤트 호출 유형은 비동기 응답에 사용됩니다.

  • DryRun은 실행하지 않고 Lambda 함수를 확인하려는 경우에 사용됩니다.

--log-type − 그것은 될 것입니다 Tail호출 유형이 RequestResponse 인 경우. 마지막 4KB base64로 인코딩 된 로그 데이터를 제공합니다. 가능한 값은 다음과 같습니다.TailNone.

--client-context −Lambda 함수에 클라이언트 별 세부 정보를 전달할 수 있습니다. clientcontext는 json 형식이어야하며 base64로 인코딩되어야합니다. 최대 파일 크기는 3583 바이트입니다.

--payload − 람다 함수에 json 형식 입력.

--qualifier −Lambda 함수 버전 또는 별칭 이름을 지정할 수 있습니다. 함수 버전을 전달하면 api가 정규화 된 함수 arn을 사용하여 Lambda 함수를 호출합니다. 별칭 이름을 지정하면 api는 별칭 ARN을 사용하여 Lambda 함수를 호출합니다.

outfile − 콘텐츠가 저장 될 파일 이름입니다.

Command with values

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

Thenpayload는 다음과 같이 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"
   }]
}

얻기 위해 details of the file from the s3 put event, 다음 명령을 사용할 수 있습니다-

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

get the bucket name, 다음 명령을 사용할 수 있습니다-

event.Records[0].s3.bucket.name  //will give the name of the bucket.

see the 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 Simple Notification Service

AWS Lambda는 다음에서 생성 된 알림을 처리하는 데 도움이 될 수 있습니다. Simple Notification Service (SNS). SNS에 게시 된 메시지가있을 때마다 메시지 세부 정보가 포함 된 SNS 이벤트로 Lambda 기능을 트리거 할 수 있습니다. 이 메시지는 Lambda 함수 내에서 처리 될 수 있으며 요구 사항에 따라 다른 서비스로 추가로 전송할 수 있습니다.

메시지가 입력되면 SNS가 Lambda 기능을 트리거합니다. 오류가 발생하여 Lambda 함수 호출을 시도하면 SNS는 최대 세 번까지 lambda 함수 호출을 재 시도합니다.

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 서비스

Amazon Simple Mail Service를 사용하여 메시지를 보내고받을 수도 있습니다. 메시지가 수신되면 Simple Mail Service에서 AWS Lambda 함수를 호출 할 수 있습니다.

Amazon SES 이메일 수신 샘플 이벤트

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는 다음을 사용하여 Amazon CloudWatch Logs에서 트리거 할 수 있습니다. CloudWatch Logs Subscriptions. 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 함수는 다음에서 호출 할 수 있습니다. httpsurl. 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"
}