[![Actions Status](https://github.com/shogo82148/p5-aws-lambda/workflows/Test/badge.svg)](https://github.com/shogo82148/p5-aws-lambda/actions)
# NAME

AWS::Lambda - It's Perl support for AWS Lambda Custom Runtime.

# SYNOPSIS

Save the following Perl script as `handler.pl`.

   sub handle {
       my ($payload, $context) = @_;
       return $payload;
   }

and then, zip the script.

   zip handler.zip handler.pl

Finally, create new function using awscli.

   aws --region "$REGION" --profile "$PROFILE" lambda create-function \
       --function-name "hello-perl" \
       --zip-file "fileb://handler.zip" \
       --handler "handler.handle" \
       --runtime provided \
       --role arn:aws:iam::xxxxxxxxxxxx:role/service-role/lambda-custom-runtime-perl-role \
       --layers "arn:aws:lambda:$REGION:445285296882:layer:perl-5-30-runtime:3"

# DESCRIPTION

This package makes it easy to run AWS Lambda Functions written in Perl.

## Use Prebuild Public Lambda Layer

1. Login to your AWS Account and go to the Lambda Console.
2. Create a new function and give it a name and an IAM Role.
3. For the "Runtime" selection, select **Use custom runtime in function code or layer**.
4. In the "Designer" section of your function dashboard, select the **Layers** box.
5. Scroll down to the "Referenced Layers" section and click **Add a layer**.
6. Select the **Provide a layer version ARN** option, then copy/paste the Layer ARN for your region.
7. Click the **Add** button.
8. Click **Save** in the upper right.
9. Upload your code and start using Perl in AWS Lambda!

The Layer ARN list is here.

- Perl 5.30
   - `arn:aws:lambda:ap-east-1:445285296882:layer:perl-5-30-runtime:6`
   - `arn:aws:lambda:ap-northeast-1:445285296882:layer:perl-5-30-runtime:6`
   - `arn:aws:lambda:ap-northeast-2:445285296882:layer:perl-5-30-runtime:6`
   - `arn:aws:lambda:ap-south-1:445285296882:layer:perl-5-30-runtime:6`
   - `arn:aws:lambda:ap-southeast-1:445285296882:layer:perl-5-30-runtime:6`
   - `arn:aws:lambda:ap-southeast-2:445285296882:layer:perl-5-30-runtime:6`
   - `arn:aws:lambda:ca-central-1:445285296882:layer:perl-5-30-runtime:6`
   - `arn:aws:lambda:eu-central-1:445285296882:layer:perl-5-30-runtime:6`
   - `arn:aws:lambda:eu-west-1:445285296882:layer:perl-5-30-runtime:6`
   - `arn:aws:lambda:eu-west-2:445285296882:layer:perl-5-30-runtime:6`
   - `arn:aws:lambda:eu-west-3:445285296882:layer:perl-5-30-runtime:6`
   - `arn:aws:lambda:me-south-1:445285296882:layer:perl-5-30-runtime:4`
   - `arn:aws:lambda:sa-east-1:445285296882:layer:perl-5-30-runtime:6`
   - `arn:aws:lambda:us-east-1:445285296882:layer:perl-5-30-runtime:6`
   - `arn:aws:lambda:us-east-2:445285296882:layer:perl-5-30-runtime:6`
   - `arn:aws:lambda:us-west-1:445285296882:layer:perl-5-30-runtime:6`
   - `arn:aws:lambda:us-west-2:445285296882:layer:perl-5-30-runtime:6`
- Perl 5.28
   - `arn:aws:lambda:ap-east-1:445285296882:layer:perl-5-28-runtime:6`
   - `arn:aws:lambda:ap-northeast-1:445285296882:layer:perl-5-28-runtime:13`
   - `arn:aws:lambda:ap-northeast-2:445285296882:layer:perl-5-28-runtime:13`
   - `arn:aws:lambda:ap-south-1:445285296882:layer:perl-5-28-runtime:13`
   - `arn:aws:lambda:ap-southeast-1:445285296882:layer:perl-5-28-runtime:13`
   - `arn:aws:lambda:ap-southeast-2:445285296882:layer:perl-5-28-runtime:13`
   - `arn:aws:lambda:ca-central-1:445285296882:layer:perl-5-28-runtime:13`
   - `arn:aws:lambda:eu-central-1:445285296882:layer:perl-5-28-runtime:13`
   - `arn:aws:lambda:eu-west-1:445285296882:layer:perl-5-28-runtime:13`
   - `arn:aws:lambda:eu-west-2:445285296882:layer:perl-5-28-runtime:13`
   - `arn:aws:lambda:eu-west-3:445285296882:layer:perl-5-28-runtime:13`
   - `arn:aws:lambda:me-south-1:445285296882:layer:perl-5-28-runtime:4`
   - `arn:aws:lambda:sa-east-1:445285296882:layer:perl-5-28-runtime:13`
   - `arn:aws:lambda:us-east-1:445285296882:layer:perl-5-28-runtime:13`
   - `arn:aws:lambda:us-east-2:445285296882:layer:perl-5-28-runtime:13`
   - `arn:aws:lambda:us-west-1:445285296882:layer:perl-5-28-runtime:13`
   - `arn:aws:lambda:us-west-2:445285296882:layer:perl-5-28-runtime:13`
- Perl 5.26
   - `arn:aws:lambda:ap-east-1:445285296882:layer:perl-5-26-runtime:7`
   - `arn:aws:lambda:ap-northeast-1:445285296882:layer:perl-5-26-runtime:14`
   - `arn:aws:lambda:ap-northeast-2:445285296882:layer:perl-5-26-runtime:14`
   - `arn:aws:lambda:ap-south-1:445285296882:layer:perl-5-26-runtime:14`
   - `arn:aws:lambda:ap-southeast-1:445285296882:layer:perl-5-26-runtime:14`
   - `arn:aws:lambda:ap-southeast-2:445285296882:layer:perl-5-26-runtime:14`
   - `arn:aws:lambda:ca-central-1:445285296882:layer:perl-5-26-runtime:14`
   - `arn:aws:lambda:eu-central-1:445285296882:layer:perl-5-26-runtime:14`
   - `arn:aws:lambda:eu-west-1:445285296882:layer:perl-5-26-runtime:14`
   - `arn:aws:lambda:eu-west-2:445285296882:layer:perl-5-26-runtime:13`
   - `arn:aws:lambda:eu-west-3:445285296882:layer:perl-5-26-runtime:13`
   - `arn:aws:lambda:me-south-1:445285296882:layer:perl-5-26-runtime:4`
   - `arn:aws:lambda:sa-east-1:445285296882:layer:perl-5-26-runtime:13`
   - `arn:aws:lambda:us-east-1:445285296882:layer:perl-5-26-runtime:13`
   - `arn:aws:lambda:us-east-2:445285296882:layer:perl-5-26-runtime:13`
   - `arn:aws:lambda:us-west-1:445285296882:layer:perl-5-26-runtime:13`
   - `arn:aws:lambda:us-west-2:445285296882:layer:perl-5-26-runtime:13`

## Use Prebuild Zip Archive

1. Login to your AWS Account and go to the Lambda Console.
2. Create a new layer and give it a name.
3. For the "Code entry type" selection, select **Upload a file from Amazon S3**.
4. In the "License" section, input [https://github.com/shogo82148/p5-aws-lambda/blob/master/LICENSE](https://github.com/shogo82148/p5-aws-lambda/blob/master/LICENSE).
5. Click **Create** button.
6. Use the layer created. For detail, see Use Prebuild Public Lambda Layer section.

URLs for Zip archive are here.

`https://shogo82148-lambda-perl-runtime-$REGION.s3.amazonaws.com/perl-$VERSION-runtime.zip`

## Run in Local using Docker

[https://hub.docker.com/r/shogo82148/p5-aws-lambda](https://hub.docker.com/r/shogo82148/p5-aws-lambda) is pre-build docker image based on [https://hub.docker.com/r/lambci/lambda/](https://hub.docker.com/r/lambci/lambda/)

   # Install the dependency.
   docker run --rm -v $(PWD):/var/task shogo82148/p5-aws-lambda:build-5.30 \
       cpanm --notest --local-lib extlocal --no-man-pages --installdeps .

   # run an event.
   docker run --rm -v $(PWD):/var/task shogo82148/p5-aws-lambda:5.30 \
       handler.handle '{"some":"event"}'

## AWS XRay SUPPORT

[AWS X-Ray](https://aws.amazon.com/xray/) is a service that collects data about requests that your application serves.
You can trace AWS Lambda requests and sends segment data with pre-install module [AWS::XRay](https://metacpan.org/pod/AWS::XRay).

   use utf8;
   use warnings;
   use strict;
   use AWS::XRay qw/ capture /;

   sub handle {
       my ($payload, $context) = @_;
       capture "myApp" => sub {
           capture "nested" => sub {
               # do something ...
           };
       };
       capture "another" => sub {
           # do something ...
       };
       return;
   }

   1;

# Paws SUPPORT

If you want to call AWS API from your Lambda function,
you can use a pre-build Lambda Layer for [Paws](https://metacpan.org/pod/Paws) - A Perl SDK for AWS (Amazon Web Services) APIs.

## Use Prebuild Public Lambda Layer

Add the perl-runtime layer and the perl-paws layer into your lambda function.

   aws --region "$REGION" --profile "$PROFILE" lambda create-function \
       --function-name "hello-perl" \
       --zip-file "fileb://handler.zip" \
       --handler "handler.handle" \
       --runtime provided \
       --role arn:aws:iam::xxxxxxxxxxxx:role/service-role/lambda-custom-runtime-perl-role \
       --layers \
           "arn:aws:lambda:$REGION:445285296882:layer:perl-5-30-runtime:3" \
           "arn:aws:lambda:$REGION:445285296882:layer:perl-5-30-paws:2"

Now, you can use [Paws](https://metacpan.org/pod/Paws) to call AWS API from your Lambda function.

   use Paws;
   my $obj = Paws->service('...');
   my $res = $obj->MethodCall(Arg1 => $val1, Arg2 => $val2);
   print $res->AttributeFromResult;

The Layer ARN list is here.

- Perl 5.30
   - `arn:aws:lambda:ap-east-1:445285296882:layer:perl-5-30-paws:4`
   - `arn:aws:lambda:ap-northeast-1:445285296882:layer:perl-5-30-paws:4`
   - `arn:aws:lambda:ap-northeast-2:445285296882:layer:perl-5-30-paws:4`
   - `arn:aws:lambda:ap-south-1:445285296882:layer:perl-5-30-paws:4`
   - `arn:aws:lambda:ap-southeast-1:445285296882:layer:perl-5-30-paws:4`
   - `arn:aws:lambda:ap-southeast-2:445285296882:layer:perl-5-30-paws:4`
   - `arn:aws:lambda:ca-central-1:445285296882:layer:perl-5-30-paws:4`
   - `arn:aws:lambda:eu-central-1:445285296882:layer:perl-5-30-paws:4`
   - `arn:aws:lambda:eu-west-1:445285296882:layer:perl-5-30-paws:4`
   - `arn:aws:lambda:eu-west-2:445285296882:layer:perl-5-30-paws:4`
   - `arn:aws:lambda:eu-west-3:445285296882:layer:perl-5-30-paws:4`
   - `arn:aws:lambda:me-south-1:445285296882:layer:perl-5-30-paws:3`
   - `arn:aws:lambda:sa-east-1:445285296882:layer:perl-5-30-paws:4`
   - `arn:aws:lambda:us-east-1:445285296882:layer:perl-5-30-paws:4`
   - `arn:aws:lambda:us-east-2:445285296882:layer:perl-5-30-paws:4`
   - `arn:aws:lambda:us-west-1:445285296882:layer:perl-5-30-paws:4`
   - `arn:aws:lambda:us-west-2:445285296882:layer:perl-5-30-paws:4`
- Perl 5.28
   - `arn:aws:lambda:ap-east-1:445285296882:layer:perl-5-28-paws:4`
   - `arn:aws:lambda:ap-northeast-1:445285296882:layer:perl-5-28-paws:4`
   - `arn:aws:lambda:ap-northeast-2:445285296882:layer:perl-5-28-paws:4`
   - `arn:aws:lambda:ap-south-1:445285296882:layer:perl-5-28-paws:4`
   - `arn:aws:lambda:ap-southeast-1:445285296882:layer:perl-5-28-paws:4`
   - `arn:aws:lambda:ap-southeast-2:445285296882:layer:perl-5-28-paws:4`
   - `arn:aws:lambda:ca-central-1:445285296882:layer:perl-5-28-paws:4`
   - `arn:aws:lambda:eu-central-1:445285296882:layer:perl-5-28-paws:4`
   - `arn:aws:lambda:eu-west-1:445285296882:layer:perl-5-28-paws:4`
   - `arn:aws:lambda:eu-west-2:445285296882:layer:perl-5-28-paws:4`
   - `arn:aws:lambda:eu-west-3:445285296882:layer:perl-5-28-paws:4`
   - `arn:aws:lambda:me-south-1:445285296882:layer:perl-5-28-paws:3`
   - `arn:aws:lambda:sa-east-1:445285296882:layer:perl-5-28-paws:4`
   - `arn:aws:lambda:us-east-1:445285296882:layer:perl-5-28-paws:4`
   - `arn:aws:lambda:us-east-2:445285296882:layer:perl-5-28-paws:4`
   - `arn:aws:lambda:us-west-1:445285296882:layer:perl-5-28-paws:4`
   - `arn:aws:lambda:us-west-2:445285296882:layer:perl-5-28-paws:4`
- Perl 5.26
   - `arn:aws:lambda:ap-east-1:445285296882:layer:perl-5-26-paws:5`
   - `arn:aws:lambda:ap-northeast-1:445285296882:layer:perl-5-26-paws:5`
   - `arn:aws:lambda:ap-northeast-2:445285296882:layer:perl-5-26-paws:5`
   - `arn:aws:lambda:ap-south-1:445285296882:layer:perl-5-26-paws:5`
   - `arn:aws:lambda:ap-southeast-1:445285296882:layer:perl-5-26-paws:5`
   - `arn:aws:lambda:ap-southeast-2:445285296882:layer:perl-5-26-paws:5`
   - `arn:aws:lambda:ca-central-1:445285296882:layer:perl-5-26-paws:5`
   - `arn:aws:lambda:eu-central-1:445285296882:layer:perl-5-26-paws:5`
   - `arn:aws:lambda:eu-west-1:445285296882:layer:perl-5-26-paws:5`
   - `arn:aws:lambda:eu-west-2:445285296882:layer:perl-5-26-paws:4`
   - `arn:aws:lambda:eu-west-3:445285296882:layer:perl-5-26-paws:4`
   - `arn:aws:lambda:me-south-1:445285296882:layer:perl-5-26-paws:3`
   - `arn:aws:lambda:sa-east-1:445285296882:layer:perl-5-26-paws:4`
   - `arn:aws:lambda:us-east-1:445285296882:layer:perl-5-26-paws:4`
   - `arn:aws:lambda:us-east-2:445285296882:layer:perl-5-26-paws:4`
   - `arn:aws:lambda:us-west-1:445285296882:layer:perl-5-26-paws:4`
   - `arn:aws:lambda:us-west-2:445285296882:layer:perl-5-26-paws:4`

URLs for Zip archive are here.

`https://shogo82148-lambda-perl-runtime-$REGION.s3.amazonaws.com/perl-$VERSION-paws.zip`

## Run in Local using Docker

[https://hub.docker.com/r/shogo82148/p5-aws-lambda](https://hub.docker.com/r/shogo82148/p5-aws-lambda) is pre-build docker image based on [https://hub.docker.com/r/lambci/lambda/](https://hub.docker.com/r/lambci/lambda/)

   # Install the dependency.
   docker run --rm -v $(PWD):/var/task shogo82148/p5-aws-lambda:build-5.30-paws \
       cpanm --notest --local-lib extlocal --no-man-pages --installdeps .

   # run an event.
   docker run --rm -v $(PWD):/var/task shogo82148/p5-aws-lambda:5.30-paws \
       handler.handle '{"some":"event"}'

# CREATE MODULE LAYER

To create custom module layer such as the Paws Layer,
install the modules into `/opt/lib/perl5/site_perl` in the layer.

   # Create Some::Module Layer
   docker run --rm \
       -v $(PWD):/var/task \
       -v $(PATH_TO_LAYER_DIR)/lib/perl5/site_perl:/opt/lib/perl5/site_perl \
       shogo82148/p5-aws-lambda:build-5.30 \
       cpanm --notest --no-man-pages Some::Module
   cd $(PATH_TO_LAYER_DIR) && zip -9 -r $(PATH_TO_DIST)/some-module.zip .

# SEE ALSO

- [AWS::Lambda::Bootstrap](https://metacpan.org/pod/AWS::Lambda::Bootstrap)
- [AWS::Lambda::Context](https://metacpan.org/pod/AWS::Lambda::Context)
- [AWS::Lambda::PSGI](https://metacpan.org/pod/AWS::Lambda::PSGI)
- [Paws](https://metacpan.org/pod/Paws)
- [AWS::XRay](https://metacpan.org/pod/AWS::XRay)

# LICENSE

The MIT License (MIT)

Copyright (C) Ichinose Shogo.

# AUTHOR

Ichinose Shogo <[email protected]>