47

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.

6 Answers 6

76

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

Sign up to request clarification or add additional context in comments.

4 Comments

This is the exact answer
This is a better answer but note that you will get both the return value from your lambda function printed to stdout along with the return of the call to 'invoke'.
Any idea how to get he payload accepted in version 2 that is not base64 and not coming from a file?
See: cli_binary_format=raw-in-base64-out ~/.aws/config . docs.aws.amazon.com/cli/latest/userguide/…
22

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

1 Comment

Thanks for your answer. I will try with that.
14

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.

Comments

14

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"
}

1 Comment

aws lambda invoke --function-name greetingsOnDemand --payload "$payload" $(tty) >/dev/null --- Windows 10 git bash - [Errno 2] No such file or directory: '/dev/pty0'
4

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; })

1 Comment

This can be done without the ; in the same invocation: aws lambda invoke --function-name Func /dev/fd/3 3>&1 >/dev/null
0

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.