BernardoMorais
BernardoMorais

Reputation: 631

Invoking aws lambda without output file

I'm trying to invoke a lambda on AWS using CLI:

aws lambda invoke --function-name GetErrorLambda --payload '{"body":"{\"Id\":[\"321\",\"123\"]}"}' \output.

I would like to know if there's a way to print the output on the cli instead of create a file.

Thanks in advance.

Upvotes: 43

Views: 20221

Answers (6)

Jean-Charles Bertin
Jean-Charles Bertin

Reputation: 101

Using a Bourne shell and for systems that support /dev/fd/<n>, you can duplicate stdout to a new file descriptor and use it for aws output:

exec 3>&1; aws lambda invoke --function-name Func /dev/fd/3 >/dev/null

You can also use that with pipeline:

{ exec 3>&1; aws lambda invoke --function-name Func /dev/fd/3 >/dev/null; } | cat

Or with command substitution:

out=$({ exec 3>&1; aws lambda invoke --function-name Func /dev/fd/3 >/dev/null; })

Upvotes: 3

odie5533
odie5533

Reputation: 562

I would output it to a file and then cat it, but also redirect the regular output so the only thing printed is from the lambda invocation:

aws lambda invoke --function-name GetErrorLambda --payload '{"body":"{\"Id\":[\"321\",\"123\"]}"}' out >>log && cat out

You can also add && echo to the end of it to echo a new line.

Upvotes: 0

Mark Melville
Mark Melville

Reputation: 813

You can use your current tty as the outfile, which allows command output to still be redirected:

> aws lambda invoke --function-name name --payload '{}' $(tty) >/dev/null
LAMBDA_OUTPUT

Using /dev/stdout for the outfile sort of works. Issue #1: the command output gets mixed up with it:

> aws lambda invoke --function-name name --payload '{}' /dev/stdout
{ACTUAL_OUTPUT
  "StatusCode": 200,
  "ExecutedVersion": "$LATEST"
}

Issue #2: If you try to redirect the stdout then you've just directed the lambda result as well. You can at least separate them by piping to cat:

> aws lambda invoke --function-name name --payload '{}' /dev/stdout | cat
ACTUAL_OUTPUT{
  "StatusCode": 200,
  "ExecutedVersion": "$LATEST"
}

Upvotes: 12

Mike Shauneu
Mike Shauneu

Reputation: 3289

I use following command:

aws lambda invoke --function-name name --payload '{...}' /dev/stdout 2>/dev/null

The idea is redirect command output to stderr and the function result to stdout.

Upvotes: 14

Vlad
Vlad

Reputation: 739

stdout and stderr are basically files so can be used for arguments that expect one

aws lambda invoke --function-name GetErrorLambda --payload '{"body":"{\"Id\":[\"321\",\"123\"]}"}' /dev/stdout

though in this case the rest of the commands output will overlap with it, so probably better to cat it later anyways

Upvotes: 73

Adam Thomason
Adam Thomason

Reputation: 1166

It's not possible to output directly to the terminal after invoking a lambda function. This is likely by design as the output could easily be greater than the buffer size for a window.

A simple workaround would be to simply 'cat' out the contents of the output file following the cli command like so:

aws lambda invoke --function-name GetErrorLambda --payload '{"body":"{\"Id\":[\"321\",\"123\"]}"}' \output. && cat outputFileName.txt

Upvotes: 22

Related Questions