AWS-Lambda-Quick
view release on metacpan or search on metacpan
lib/AWS/Lambda/Quick.pm view on Meta::CPAN
use strict;
use warnings;
use AWS::Lambda::Quick (
name => 'hello-world',
);
sub handler {
my $data = shift;
my $name = $data->{queryStringParameters}{who} // "World";
return {
statusCode => 200,
headers => {
'Content-Type' => 'text/plain',
},
body => "Hello, $name",
};
}
1;
To upload to and configure AWS, just run the script locally:
shell$ perl myscriptname.pl
https://52p3rf890b.execute-api.us-east-1.amazonaws.com/quick/hello-world
Then you can access it from anywhere:
shell$ curl https://52p3rf890b.execute-api.us-east-1.amazonaws.com/quick/hello-world?who=Mark'
Hello, Mark
=head1 DESCRIPTION
This module allows you to very quickly create a Perl based AWS
Lambda function which can be accessed via HTTP.
Coding Lambda functions in Perl is straight forward: You need only
implement a script with the one C<handler> function that returns the
expected data structure as described in the L<AWS::Lambda>
documentation.
The hard part is configuring AWS to execute the code. Traditionally
you have to complete the following steps.
=over
=item Create a zip file containing your code
=item Create (or update) an AWS Lambda function with this zip file
=item Create a REST API with AWS Gateway API
=item Configure a resource for that REST API for this script
=item Set up a method and put method response for that resource
=item Manage an integration and integration response for that resource
=back
And then debug all the above things, a lot, and google weird error
messages it generates when you inevitably make a mistake.
This module provides a way to do all of this completely transparently
just by executing your script, without having to either interact with
the AWS Management Console nor directly use the awscli utility.
Simply include this module at the top of your script containing the
handler function:
use AWS::Lambda::Quick (
name => 'random-lottery-numbers',
);
And then execute it locally. Rather than running as normal your script
will instead upload itself to AWS as a Lambda function (modifying
itself so that it no longer has a dependency on AWS::Lambda::Quick) and
handle all the other steps needed to make itself web accessible.
Running the script locally subsequent times will update the code and
AWS settings.
=head2 What This Actually Does
You probably don't care about this, but this is actually what's
going on when the script uploads itself. This is subject to change
in later versions of this utility as better ways to do things
become available (for example AWS has a HTTP API that is currently in
beta that could make some of this easier!).
By default, unless you specify extra parameters when you import
AWS::Lambda::Quick, AWS will be configured as described below
=head3 Create A New Role For Use With AWS::Lambda::Quick
Execution creates a new role called C<perl-aws-lambda-quick> that can
be assumed by both the API Gateway (C<apigateway.amazonaws.com>) and
Lambda (C<lambda.amazonaws.com>) services. The role will have
C<AWSLambdaRole> and C<CloudWatchLogsFullAccess> policies permissioned
(so it execute the lambda function and write logs.)
You can modify this role as you see fit. For example, to give your
lambda functions the ability to access S3:
shell$ aws iam attach-role-policy \
--policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess \
--role-name perl-aws-lambda-quick
If you really want your lambda functions to use a different role then
you can control this with the C<role> parameter described below.
=head3 Create a new Lambda Function
Execution uploads the script (and any extra files specified, see
the C<extra_files> parameter below) as a new Lambda function with the
passed name. Subsequent uploads will replace and update that Lambda
function
The function will be assigned the previously created role.
=head3 Create a API Gateway For All Quick Functions
( run in 2.807 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )