view release on metacpan or search on metacpan
[![Actions Status](https://github.com/shogo82148/p5-aws-lambda/workflows/Test/badge.svg)](https://github.com/shogo82148/p5-aws-lambda/actions)
# NAME
AWS::Lambda - Perl support for AWS Lambda Custom Runtime.
# SYNOPSIS
Save the following Perl script as `handler.pl`.
sub handle {
my ($payload, $context) = @_;
return $payload;
}
1;
and then, zip the script.
$ zip handler.zip handler.pl
Finally, create new function using awscli.
author/perl-stripper/perl-stripper/handler.pl view on Meta::CPAN
use Perl::Strip;
use Plack::Request;
use AWS::Lambda::PSGI;
mkdir '/tmp/.perl-strip';
my $stripper = Perl::Strip->new(
cache => '/tmp/.perl-strip',
optimise_size => 1,
);
my $app = sub {
my $env = shift;
my $req = Plack::Request->new($env);
my $code = do { local $/; my $body = $req->body; <$body> };
my $stripped = $stripper->strip($code);
my $res = $req->new_response(200);
$res->content_type('text/plain');
$res->body($stripped);
return $res->finalize;
};
my $func = AWS::Lambda::PSGI->wrap($app);
sub handle($payload, $context) {
return $func->($payload);
}
1;
author/pod-stripper/scripts/pod_stripper.pl view on Meta::CPAN
# Utility to strip POD from Perl module files.
# based on https://github.com/pplu/p5-pod-stripper
use v5.10;
use warnings;
use strict;
use File::Find ();
use Pod::Strip;
use autodie;
sub wanted;
sub dostrip;
sub delete_pod;
my $original_bytes = 0;
my $final_bytes = 0;
use Cwd ();
my $cwd = Cwd::cwd();
my @dirs;
if (@ARGV) {
@dirs = @ARGV;
author/publish-perl-runtimes.pl view on Meta::CPAN
use 5.03000;
use strict;
use warnings;
use FindBin;
use Parallel::ForkManager;
use File::Basename 'basename';
use JSON qw(decode_json);
my $force = ($ARGV[0] // '') eq '-f';
sub head_or_put {
my ($region, $key, $zip, $md5) = @_;
my $object = decode_json(`aws --output json --region "$region" s3api head-object --bucket "shogo82148-lambda-perl-runtime-$region" --key "$key" || echo "{}"`);
my $current = $object->{Metadata}{md5chksum} || "";
if ($current ne $md5) {
say STDERR "Upload $zip to 3://shogo82148-lambda-perl-runtime-$region/$key";
my $cmd = "aws --output json --region '$region' s3api put-object --bucket 'shogo82148-lambda-perl-runtime-$region' --key '$key' --body '$zip' --content-md5 '$md5' --metadata md5chksum='$md5'";
say STDERR "Excuting: $cmd";
if ($force) {
$object = decode_json(`$cmd`);
die "exit: $!" if $! != 0;
}
} else {
say STDERR "$zip in s3://shogo82148-lambda-perl-runtime-$region/$key is already updated";
}
return $object;
}
sub run_command {
my @cmd = @_;
say STDERR "Excuting: @cmd";
if ($force) {
my $code = system(@cmd);
die "exit: $code" if $! != 0;
}
}
sub publish {
my ($suffix, $arch, $arch_suffix) = @_;
$arch_suffix //= "-$arch";
my $pm = Parallel::ForkManager->new(10);
my $regions = do {
open my $fh, '<', "$FindBin::Bin/regions-$arch.txt" or die "$!";
my @regions = sort { $a cmp $b } map { chomp; $_; } <$fh>;
close($fh);
\@regions;
};
author/update-aws-lambda-al.pl view on Meta::CPAN
"5.32",
"5.30",
"5.28",
"5.26",
];
$versions = [sort {version->parse("v$b") <=> version->parse("v$a")} @$versions];
# get the list of layers on Amazon Linux 1
my $layers = {};
my $pm = Parallel::ForkManager->new(10);
$pm->run_on_finish(sub {
my ($pid, $exit_code, $ident, $exit_signal, $core_dump, $data) = @_;
return unless $data;
my ($version, $region, $arn) = @$data;
return unless $version && $region && $arn;
$layers->{$version} //= {};
$layers->{$version}{$region} = $arn;
});
for my $version (@$versions) {
for my $region (@{$regions->{x86_64}}) {
author/update-aws-lambda-al2.pl view on Meta::CPAN
"5.38",
"5.36",
"5.34",
"5.32",
];
$versions_al2 = [sort {version->parse("v$b") <=> version->parse("v$a")} @$versions_al2];
# get the list of layers on Amazon Linux 2
my $layers_al2_x86_64 = {};
my $pm_al2_x86_64 = Parallel::ForkManager->new(10);
$pm_al2_x86_64->run_on_finish(sub {
my ($pid, $exit_code, $ident, $exit_signal, $core_dump, $data) = @_;
return unless $data;
my ($version, $region, $arn) = @$data;
return unless $version && $region && $arn;
$layers_al2_x86_64->{$version} //= {};
$layers_al2_x86_64->{$version}{$region} = $arn;
});
for my $version (@$versions_al2) {
requires 'JSON::XS', '4.0';
requires 'Try::Tiny', '0.30';
requires 'Plack', '1.0047';
requires 'Plack::Middleware::ReverseProxy', '0.16';
requires 'JSON::Types', '0.05';
requires 'URI::Escape';
requires 'MIME::Base64';
recommends 'AWS::XRay', '>=0.09';
on 'test' => sub {
requires 'Test::More', '0.98';
requires 'Test::Deep', '1.128';
requires 'Test::TCP', '2.19';
requires 'Test::SharedFork';
requires 'Test::Warn';
requires 'File::Slurp', '9999.25';
requires 'Starman';
};
on 'develop' => sub {
requires 'Minilla';
requires 'Version::Next';
requires 'CPAN::Uploader';
requires 'Software::License::MIT';
requires 'Test::CPAN::Meta';
requires 'Test::Pod';
requires 'Test::MinimumVersion::Fast';
requires 'Mojolicious';
requires 'Dancer2';
requires 'Parallel::ForkManager';
examples/cgi/WwwCounter/gifcat.pl view on Meta::CPAN
;#
;# ====================================================================
package gifcat;
$pflag = 0; # print flag
;# =====================================================
;# gifcat'gifprint() - print out GIF diagnostics.
;# =====================================================
sub gifprint {
$pflag = 1;
&gifcat(@_);
$pflag = 0;
}
;# =====================================================
;# gifcat'gifcat() - get a concatenated GIF image.
;# =====================================================
sub gifcat {
@files = @_;
$Gif = 0;
$leftpos = 0;
$logicalScreenWidth = 0;
$logicalScreenHeight = 0;
$useLocalColorTable = 0;
foreach $file (@files) {
$size = -s $file;
open(IN, "$file") || return("ERROR");
examples/cgi/WwwCounter/handler.pl view on Meta::CPAN
use warnings;
use strict;
use lib "$ENV{'LAMBDA_TASK_ROOT'}/local/lib/perl5";
use AWS::Lambda::PSGI;
$ENV{WWWCOUNT_DIR} ||= "/tmp";
chdir($ENV{'LAMBDA_TASK_ROOT'});
my $app = require "$ENV{'LAMBDA_TASK_ROOT'}/app.psgi";
my $func = AWS::Lambda::PSGI->wrap($app);
sub handle {
my $payload = shift;
return $func->($payload);
}
1;
examples/cgi/WwwCounter/wwwcount.cgi view on Meta::CPAN
# CGIã®çµæã¨ãã¦ã«ã¦ã³ã¿ã¼ãæ¸ãåºã
outputCounter($count);
# ããã¯ã解æ¾ãã
unlockLock();
}
#
# å¼æ°ã解éãã
#
sub parseArguments {
my(@argv) = split(/\+/, $ENV{'QUERY_STRING'});
for (my $i = 0; $i <= $#argv; $i++) {
# ãã¹ãã¢ã¼ã
if ($argv[$i] eq "test") {
$g_mode = "test";
# ããã¹ãã¢ã¼ã
} elsif ($argv[$i] eq "text") {
$g_mode = "text";
examples/docker/handler.pl view on Meta::CPAN
use utf8;
use warnings;
use strict;
sub handle {
my $payload = shift;
return +{"hello" => "lambda"};
}
1;
examples/hello/handler.pl view on Meta::CPAN
use utf8;
use warnings;
use strict;
sub handle {
my $payload = shift;
return +{"hello" => "lambda"};
}
1;
examples/psgi/app.psgi view on Meta::CPAN
use strict;
use warnings;
use utf8;
use Plack::Request;
use Plack::Builder;
use Data::Dumper;
return builder {
mount '/foo' => sub {
my $env = shift;
my $req = Plack::Request->new($env);
my $meth = $req->method;
if ($meth eq 'POST') {
return [
200,
['Content-Type', 'application/octet-stream'],
[$req->content],
]
}
return [
405,
['Content-Type', 'text/plain'],
['Method Not Allowed'],
]
};
mount '/' => sub {
my $env = shift;
return [
200,
['Content-Type', 'text/plain'],
[Dumper($env)],
]
};
};
examples/psgi/handler.pl view on Meta::CPAN
use utf8;
use warnings;
use strict;
use AWS::Lambda::PSGI;
my $app = require "$ENV{'LAMBDA_TASK_ROOT'}/app.psgi";
my $func = AWS::Lambda::PSGI->wrap($app);
sub handle {
my $payload = shift;
return $func->($payload);
}
1;
examples/s3-get-object/handler.pl view on Meta::CPAN
use warnings;
use strict;
use 5.30.0;
use lib "$ENV{'LAMBDA_TASK_ROOT'}/extlocal/lib/perl5";
use Paws;
use Try::Tiny;
use URI::Escape;
my $obj = Paws->service('S3', region => 'ap-northeast-1');
sub handle {
my $payload = shift;
# Get the object from the event and show its content type
my $bucket = $payload->{Records}[0]{s3}{bucket}{name};
my $key = uri_unescape($payload->{Records}[0]{s3}{object}{key} =~ s/\+/ /gr);
my $resp = try {
$obj->GetObject(
Bucket => $bucket,
Key => $key,
);
} catch {
lib/AWS/Lambda.pm view on Meta::CPAN
our $VERSION = "0.4.3";
# the context of Lambda Function
our $context;
our $LAYERS = $AWS::Lambda::AL::LAYERS;
our $LAYERS_AL2 = $AWS::Lambda::AL2::LAYERS;
our $LAYERS_AL2023 = $AWS::Lambda::AL2023::LAYERS;
sub get_layer_info {
my ($version, $region) = @_;
return $LAYERS->{$version}{$region};
}
sub print_runtime_arn {
my ($version, $region) = @_;
print $LAYERS->{$version}{$region}{runtime_arn};
}
sub print_paws_arn {
my ($version, $region) = @_;
print $LAYERS->{$version}{$region}{paws_arn};
}
sub get_layer_info_al2 {
my ($version, $region, $arch) = @_;
$arch //= 'x86_64';
return $LAYERS_AL2->{$version}{$arch}{$region};
}
sub print_runtime_arn_al2 {
my ($version, $region, $arch) = @_;
$arch //= 'x86_64';
print $LAYERS_AL2->{$version}{$arch}{$region}{runtime_arn};
}
sub print_paws_arn_al2 {
my ($version, $region, $arch) = @_;
$arch //= 'x86_64';
print $LAYERS_AL2->{$version}{$arch}{$region}{paws_arn};
}
sub get_layer_info_al2023 {
my ($version, $region, $arch) = @_;
$arch //= 'x86_64';
return $LAYERS_AL2023->{$version}{$arch}{$region};
}
sub print_runtime_arn_al2023 {
my ($version, $region, $arch) = @_;
$arch //= 'x86_64';
print $LAYERS_AL2023->{$version}{$arch}{$region}{runtime_arn};
}
sub print_paws_arn_al2023 {
my ($version, $region, $arch) = @_;
$arch //= 'x86_64';
print $LAYERS_AL2023->{$version}{$arch}{$region}{paws_arn};
}
1;
__END__
=encoding utf-8
=head1 NAME
AWS::Lambda - Perl support for AWS Lambda Custom Runtime.
=head1 SYNOPSIS
Save the following Perl script as C<handler.pl>.
sub handle {
my ($payload, $context) = @_;
return $payload;
}
1;
and then, zip the script.
$ zip handler.zip handler.pl
Finally, create new function using awscli.
lib/AWS/Lambda/AL.pm view on Meta::CPAN
'us-west-2' => {
runtime_arn => "arn:aws:lambda:us-west-2:445285296882:layer:perl-5-26-runtime:21",
runtime_version => 21,
paws_arn => "arn:aws:lambda:us-west-2:445285296882:layer:perl-5-26-paws:11",
paws_version => 11,
},
},
};
sub get_layer_info {
my ($version, $region) = @_;
return $LAYERS->{$version}{$region};
}
sub print_runtime_arn {
my ($version, $region) = @_;
print $LAYERS->{$version}{$region}{runtime_arn};
}
sub print_paws_arn {
my ($version, $region) = @_;
print $LAYERS->{$version}{$region}{paws_arn};
}
1;
__END__
=encoding utf-8
=head1 NAME
lib/AWS/Lambda/AL2.pm view on Meta::CPAN
runtime_arn => "arn:aws:lambda:us-west-2:445285296882:layer:perl-5-32-runtime-al2-arm64:6",
runtime_version => 6,
paws_arn => "arn:aws:lambda:us-west-2:445285296882:layer:perl-5-32-paws-al2-arm64:6",
paws_version => 6,
},
},
},
};
sub get_layer_info {
my ($version, $region, $arch) = @_;
$arch //= 'x86_64';
return $LAYERS->{$version}{$arch}{$region};
}
sub print_runtime_arn {
my ($version, $region, $arch) = @_;
$arch //= 'x86_64';
print $LAYERS->{$version}{$arch}{$region}{runtime_arn};
}
sub print_paws_arn {
my ($version, $region, $arch) = @_;
$arch //= 'x86_64';
print $LAYERS->{$version}{$arch}{$region}{paws_arn};
}
1;
__END__
=encoding utf-8
lib/AWS/Lambda/AL2023.pm view on Meta::CPAN
runtime_arn => "arn:aws:lambda:us-west-2:445285296882:layer:perl-5-38-runtime-al2023-arm64:4",
runtime_version => 4,
paws_arn => "arn:aws:lambda:us-west-2:445285296882:layer:perl-5-38-paws-al2023-arm64:3",
paws_version => 3,
},
},
},
};
sub get_layer_info {
my ($version, $region, $arch) = @_;
$arch //= 'x86_64';
return $LAYERS->{$version}{$arch}{$region};
}
sub print_runtime_arn {
my ($version, $region, $arch) = @_;
$arch //= 'x86_64';
print $LAYERS->{$version}{$arch}{$region}{runtime_arn};
}
sub print_paws_arn {
my ($version, $region, $arch) = @_;
$arch //= 'x86_64';
print $LAYERS->{$version}{$arch}{$region}{paws_arn};
}
1;
__END__
=encoding utf-8
lib/AWS/Lambda/Bootstrap.pm view on Meta::CPAN
use JSON::XS qw/decode_json encode_json/;
use Try::Tiny;
use AWS::Lambda;
use AWS::Lambda::Context;
use AWS::Lambda::ResponseWriter;
use Scalar::Util qw(blessed);
use Exporter 'import';
our @EXPORT = ('bootstrap');
sub bootstrap {
my $handler = shift;
my $bootstrap = AWS::Lambda::Bootstrap->new(
handler => $handler,
);
$bootstrap->handle_events;
}
sub new {
my $proto = shift;
my $class = ref $proto || $proto;
my %args;
if (@_ == 1 && ref $_[0] eq 'HASH') {
%args = %{$_[0]};
} else {
%args = @_;
}
my $api_version = '2018-06-01';
lib/AWS/Lambda/Context.pm view on Meta::CPAN
package AWS::Lambda::Context;
use 5.026000;
use strict;
use warnings;
use Time::HiRes qw(time);
sub new {
my $proto = shift;
my $class = ref $proto || $proto;
my %args;
if (@_ == 1 && ref $_[0] eq 'HASH') {
%args = %{$_[0]};
} else {
%args = @_;
}
my $deadline_ms = $args{deadline_ms} // die 'deadine_ms is required';
my $invoked_function_arn = $args{invoked_function_arn} // '';
lib/AWS/Lambda/ResponseWriter.pm view on Meta::CPAN
use Carp qw(croak);
use Scalar::Util qw(blessed);
use MIME::Base64 qw(encode_base64);
use HTTP::Tiny;
my %DefaultPort = (
http => 80,
https => 443,
);
sub new {
my $proto = shift;
my $class = ref $proto || $proto;
my %args;
if (@_ == 1 && ref $_[0] eq 'HASH') {
%args = %{$_[0]};
} else {
%args = @_;
}
my $http = $args{http} // HTTP::Tiny->new;
t/01_echo.t view on Meta::CPAN
deadline_ms => 1000,
aws_request_id => '8476a536-e9f4-11e8-9739-2dfe598c3fcd',
invoked_function_arn => 'arn:aws:lambda:us-east-2:123456789012:function:custom-runtime',
trace_id => "Root=1-5bef4de7-ad49b0e87f6ef6c87fc2e700;Parent=9a9197af755a6419;Sampled=1",
);
my $bootstrap = BootstrapMock->new(
handler => "echo.handle",
runtime_api => "example.com",
task_root => "$FindBin::Bin/test_handlers",
lambda_next => sub {
return $payload, $dummy_context;
},
lambda_response => sub {
my $self = shift;
$response = shift;
$context = shift;
},
);
ok $bootstrap->handle_event;
cmp_deeply $response, $payload, "echo handler";
is $context, $dummy_context, "context";
t/02_error.t view on Meta::CPAN
use FindBin;
use lib "$FindBin::Bin/lib";
use BootstrapMock;
my $error;
my $bootstrap = BootstrapMock->new(
handler => "error.handle",
runtime_api => "example.com",
task_root => "$FindBin::Bin/test_handlers",
lambda_next => sub {
return +{
key1 => 1,
key2 => 2,
key3 => 3,
}, undef;
},
lambda_error => sub {
my $self = shift;
$error = shift;
},
);
ok !$bootstrap->handle_event;
like $error, qr/some error/;
done_testing;
t/03_init_error.t view on Meta::CPAN
use lib "$FindBin::Bin/lib";
use BootstrapMock;
use AWS::Lambda::Context;
use Try::Tiny;
my $error;
my $bootstrap = BootstrapMock->new(
handler => "init_error.handle",
runtime_api => "example.com",
task_root => "$FindBin::Bin/test_handlers",
lambda_init_error => sub {
my $self = shift;
$error = shift;
},
);
ok !$bootstrap->handle_event;
like $error, qr/did not return a true value/;
done_testing;
t/04_handler_not_found.t view on Meta::CPAN
use lib "$FindBin::Bin/lib";
use BootstrapMock;
use AWS::Lambda::Context;
use Try::Tiny;
my $error;
my $bootstrap = BootstrapMock->new(
handler => "echo.handle_not_found",
runtime_api => "example.com",
task_root => "$FindBin::Bin/test_handlers",
lambda_init_error => sub {
my $self = shift;
$error = shift;
},
);
ok !$bootstrap->handle_event;
like $error, qr/handler handle_not_found is not found/;
done_testing;
view all matches for this distributionview release on metacpan - search on metacpan