2022-09-27 08:33:42 -07:00
< ? php
2022-09-29 16:43:24 -07:00
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
2022-09-27 08:33:42 -07:00
# snippet-start:[php.example_code.lambda.basics.scenario]
namespace Lambda ;
use Aws\S3\S3Client ;
use GuzzleHttp\Psr7\Stream ;
2023-02-14 16:31:03 -07:00
use Iam\IAMService ;
2022-09-27 08:33:42 -07:00
class GettingStartedWithLambda
{
public function run ()
{
2023-05-12 05:28:46 -07:00
echo ( " \n " );
2022-09-27 08:33:42 -07:00
echo ( " -------------------------------------- \n " );
2022-09-29 16:43:24 -07:00
print ( " Welcome to the AWS Lambda getting started demo using PHP! \n " );
2022-09-27 08:33:42 -07:00
echo ( " -------------------------------------- \n " );
$clientArgs = [
'region' => 'us-west-2' ,
'version' => 'latest' ,
'profile' => 'default' ,
];
$uniqid = uniqid ();
2023-02-14 16:31:03 -07:00
$iamService = new IAMService ();
2022-09-27 08:33:42 -07:00
$s3client = new S3Client ( $clientArgs );
$lambdaService = new LambdaService ();
echo " First, let's create a role to run our Lambda code. \n " ;
$roleName = " test-lambda-role- $uniqid " ;
$rolePolicyDocument = " {
\" Version \" : \" 2012-10-17 \" ,
\" Statement \" : [
{
\" Effect \" : \" Allow \" ,
\" Principal \" : {
\" Service \" : \" lambda.amazonaws.com \"
},
\" Action \" : \" sts:AssumeRole \"
}
]
} " ;
$role = $iamService -> createRole ( $roleName , $rolePolicyDocument );
echo " Created role { $role [ 'RoleName' ] } . \n " ;
$iamService -> attachRolePolicy (
$role [ 'RoleName' ],
" arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole "
);
echo " Attached the AWSLambdaBasicExecutionRole to { $role [ 'RoleName' ] } . \n " ;
echo " \n Now let's create an S3 bucket and upload our Lambda code there. \n " ;
$bucketName = " test-example-bucket- $uniqid " ;
$s3client -> createBucket ([
'Bucket' => $bucketName ,
]);
echo " Created bucket $bucketName . \n " ;
$functionName = " doc_example_lambda_ $uniqid " ;
2023-02-14 16:31:03 -07:00
$codeBasic = __DIR__ . " /lambda_handler_basic.zip " ;
2022-09-27 08:33:42 -07:00
$handler = " lambda_handler_basic " ;
$file = file_get_contents ( $codeBasic );
$s3client -> putObject ([
'Bucket' => $bucketName ,
'Key' => $functionName ,
'Body' => $file ,
]);
echo " Uploaded the Lambda code. \n " ;
$createLambdaFunction = $lambdaService -> createFunction ( $functionName , $role , $bucketName , $handler );
// Wait until the function has finished being created.
do {
$getLambdaFunction = $lambdaService -> getFunction ( $createLambdaFunction [ 'FunctionName' ]);
} while ( $getLambdaFunction [ 'Configuration' ][ 'State' ] == " Pending " );
echo " Created Lambda function { $getLambdaFunction [ 'Configuration' ][ 'FunctionName' ] } . \n " ;
2022-09-29 16:43:24 -07:00
sleep ( 1 );
2022-09-27 08:33:42 -07:00
echo " \n Ok, let's invoke that Lambda code. \n " ;
$basicParams = [
'action' => 'increment' ,
'number' => 3 ,
];
/** @var Stream $invokeFunction */
$invokeFunction = $lambdaService -> invoke ( $functionName , $basicParams )[ 'Payload' ];
$result = json_decode ( $invokeFunction -> getContents ()) -> result ;
echo " After invoking the Lambda code with the input of { $basicParams [ 'number' ] } we received $result . \n " ;
echo " \n Since that's working, let's update the Lambda code. \n " ;
$codeCalculator = " lambda_handler_calculator.zip " ;
$handlerCalculator = " lambda_handler_calculator " ;
echo " First, put the new code into the S3 bucket. \n " ;
$file = file_get_contents ( $codeCalculator );
$s3client -> putObject ([
'Bucket' => $bucketName ,
'Key' => $functionName ,
'Body' => $file ,
]);
echo " New code uploaded. \n " ;
$lambdaService -> updateFunctionCode ( $functionName , $bucketName , $functionName );
// Wait for the Lambda code to finish updating.
do {
$getLambdaFunction = $lambdaService -> getFunction ( $createLambdaFunction [ 'FunctionName' ]);
} while ( $getLambdaFunction [ 'Configuration' ][ 'LastUpdateStatus' ] !== " Successful " );
echo " New Lambda code uploaded. \n " ;
$environment = [
'Variable' => [ 'Variables' => [ 'LOG_LEVEL' => 'DEBUG' ]],
];
$lambdaService -> updateFunctionConfiguration ( $functionName , $handlerCalculator , $environment );
do {
$getLambdaFunction = $lambdaService -> getFunction ( $createLambdaFunction [ 'FunctionName' ]);
} while ( $getLambdaFunction [ 'Configuration' ][ 'LastUpdateStatus' ] !== " Successful " );
echo " Lambda code updated with new handler and a LOG_LEVEL of DEBUG for more information. \n " ;
echo " Invoke the new code with some new data. \n " ;
$calculatorParams = [
'action' => 'plus' ,
'x' => 5 ,
'y' => 4 ,
];
$invokeFunction = $lambdaService -> invoke ( $functionName , $calculatorParams , " Tail " );
$result = json_decode ( $invokeFunction [ 'Payload' ] -> getContents ()) -> result ;
echo " Indeed, { $calculatorParams [ 'x' ] } + { $calculatorParams [ 'y' ] } does equal $result . \n " ;
echo " Here's the extra debug info: " ;
echo base64_decode ( $invokeFunction [ 'LogResult' ]) . " \n " ;
echo " \n But what happens if you try to divide by zero? \n " ;
$divZeroParams = [
'action' => 'divide' ,
'x' => 5 ,
'y' => 0 ,
];
$invokeFunction = $lambdaService -> invoke ( $functionName , $divZeroParams , " Tail " );
$result = json_decode ( $invokeFunction [ 'Payload' ] -> getContents ()) -> result ;
echo " You get a | $result | result. \n " ;
echo " And an error message: " ;
echo base64_decode ( $invokeFunction [ 'LogResult' ]) . " \n " ;
2022-09-29 16:43:24 -07:00
echo " \n Here's all the Lambda functions you have in this Region: \n " ;
2022-09-27 08:33:42 -07:00
$listLambdaFunctions = $lambdaService -> listFunctions ( 5 );
$allLambdaFunctions = $listLambdaFunctions [ 'Functions' ];
$next = $listLambdaFunctions -> get ( 'NextMarker' );
while ( $next != false ) {
$listLambdaFunctions = $lambdaService -> listFunctions ( 5 , $next );
$next = $listLambdaFunctions -> get ( 'NextMarker' );
$allLambdaFunctions = array_merge ( $allLambdaFunctions , $listLambdaFunctions [ 'Functions' ]);
}
foreach ( $allLambdaFunctions as $function ) {
echo " { $function [ 'FunctionName' ] } \n " ;
}
echo " \n \n And don't forget to clean up your data! \n " ;
$lambdaService -> deleteFunction ( $functionName );
echo " Deleted Lambda function. \n " ;
$iamService -> deleteRole ( $role [ 'RoleName' ]);
echo " Deleted Role. \n " ;
$deleteObjects = $s3client -> listObjectsV2 ([
'Bucket' => $bucketName ,
]);
$deleteObjects = $s3client -> deleteObjects ([
'Bucket' => $bucketName ,
'Delete' => [
'Objects' => $deleteObjects [ 'Contents' ],
]
]);
2022-09-29 16:43:24 -07:00
echo " Deleted all objects from the S3 bucket. \n " ;
2022-09-27 08:33:42 -07:00
$s3client -> deleteBucket ([ 'Bucket' => $bucketName ]);
echo " Deleted the bucket. \n " ;
}
}
# snippet-end:[php.example_code.lambda.basics.scenario]