AWS-Lambda
view release on metacpan or search on metacpan
lib/AWS/Lambda/PSGI.pm view on Meta::CPAN
for my $chunk (@$body) {
$writer->write($chunk) or die "failed to write chunk: $!";
}
} else {
# IO::Handle-like object
local $/ = \4096;
while (defined(my $chunk = $body->getline)) {
$writer->write($chunk) or die "failed to write chunk: $!";
}
}
$writer->close or die "failed to close writer: $!";
return;
};
$response->($psgi_responder);
};
}
sub _format_response_stream {
my ($self, $status, $headers) = @_;
my $headers_hash = {};
my $cookies = [];
Plack::Util::header_iter($headers, sub {
my ($k, $v) = @_;
$k = lc $k;
if ($k eq 'set-cookie') {
push @$cookies, string $v;
} elsif (exists $headers_hash->{$k}) {
$headers_hash->{$k} = ", $v";
} else {
$headers_hash->{$k} = string $v;
}
});
return +{
statusCode => number $status,
headers => $headers_hash,
cookies => $cookies,
};
}
1;
__END__
=encoding utf-8
=head1 NAME
AWS::Lambda::PSGI - It translates event of Lambda Proxy Integrations in API Gateway and
Application Load Balancer into L<PSGI>.
=head1 SYNOPSIS
Add the following script into your Lambda code archive.
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 {
return $func->(@_);
}
1;
And then, L<Set up Lambda Proxy Integrations in API Gateway|https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html> or
L<Lambda Functions as ALB Targets|https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html>
=head1 DESCRIPTION
=head2 Streaming Response
L<AWS::Lambda::PSGI> supports L<response streaming|https://docs.aws.amazon.com/lambda/latest/dg/configuration-response-streaming.html>.
The function urls's invoke mode is configured as C<"RESPONSE_STREAM">, and Lambda environment variable "PERL5_LAMBDA_PSGI_INVOKE_MODE" is set to C<"RESPONSE_STREAM">.
ExampleApi:
Type: AWS::Serverless::Function
Properties:
FunctionUrlConfig:
AuthType: NONE
InvokeMode: RESPONSE_STREAM
Environment:
Variables:
PERL5_LAMBDA_PSGI_INVOKE_MODE: RESPONSE_STREAM
# (snip)
In this mode, the PSGI server accepts L<Delayed Response and Streaming Body|https://metacpan.org/pod/PSGI#Delayed-Response-and-Streaming-Body>.
my $app = sub {
my $env = shift;
return sub {
my $responder = shift;
$responder->([ 200, ['Content-Type' => 'text/plain'], [ "Hello World" ] ]);
};
};
An application MAY omit the third element (the body) when calling the responder.
my $app = sub {
my $env = shift;
return sub {
my $responder = shift;
my $writer = $responder->([ 200, ['Content-Type' => 'text/plain'] ]);
$writer->write("Hello World");
$writer->close;
};
};
=head2 Request ID
L<AWS::Lambda::PSGI> injects the request id that compatible with L<Plack::Middleware::RequestId>.
env->{'psgix.request_id'} # It is same value with $context->aws_request_id
=head1 LICENSE
( run in 1.946 second using v1.01-cache-2.11-cpan-fe3c2283af0 )