Writing PowerShell Core AWS Lambda Functions – Part I
AWS Lambda support for PowerShell Core is here! In this series of blogs, we’re going to be a taking a dive into writing one of these Lambda functions in PowerShell Core. To make it a bit more fun, we’ll be connecting this function with Lex , which will in turn be connected to a custom Facebook page to drive an interactive AWS PowerShell help facility.
By the end of this series of blogs, we’ll have in place a Facebook page which, by sending a message containing an AWS PowerShell command to, will provide an overview of what the command does. It will do this by forwarding the request to a Lex ‘bot, which will parse it, and then provide the input criteria to our PowerShell Lambda function. Our function will then lookup the documentation page for the command, extract a summary, and provide a JSON formatted response back to Lex, which in turn will feed the result back to the Facebook chat channel. Phew!
How PowerShell Processes Lambda Input & Output
First though, let’s take a look at how a Lamda function written in PowerShell works.
As covered in a previous blog, when a Lambda function is invoked, up to two parameters are passed: context, and input object. The context object simply contains details of the Lambda environment, whilst the input one contains event details, such as S3 information relating to when the CreateObject action occurred. For languages such as Go, you need to write an event handler for processing of the above information, an example of which is in the blog previous to this one.
This months announcement from AWS of support for PowerShell Core 6.0 with Lambda and new tools for this was quite a step in the evolution of PowerShell, and introduces another way for processing of events. In a packaged PowerShell script for Lambda, the value of the parameters passed into the Lambda function are made available via predefined $LambdaInput and $LambdaContext. There is no need to write method or function handlers. Particularly of note though is that $LambdaInput is automatically cast into PSObject, making parsing and processing of the information a lot simpler. The handler does not need to know in advance the JSON schema and neither do you need to go through reflection hell and mappings to identify it. PowerShell does it all for you. There is no need to even use the ConvertFrom-JSON cmdlet.
For returning output (if so desired), strings are processed as is. Non returned string types are dynamically cast to JSON prior to them being handed over to the recipient. The choice is yours.
In order to develop this solution, we need to have the following already in place
- AWS account
- Facebook developer account
- Facebook app
- .Net Core 2.1 SDK
- PowerShell Core 6.0
- AWSLambdaPSCore Module
I’m going to assume that you already have the first in the list. If for whatever reason that’s not the case, you can sign up for a Free Tier account via the following link:
Creating a Facebook Developer Account
You have the option of either converting an existing Facebook account to a developer one, or alternatively creating a new, developer specific, Facebook account. This is necessary in order to allow our application to access both Lex, and internal Facebook API’s.
Full instructions for doing this are at: https://developers.facebook.com/docs/apps/
Creating Our FaceBook App & Page
Once you have carried out the previous step, we need to register an application and page which will connect to our forthcoming Lex ‘bot. You can find full instructions https://developers.facebook.com/docs/messenger-platform/getting-started/quick-start
In your browser, go to https://developers.facebook.com/
- Click Log In
- Enter the Facebook credentials that are associated with your development account
- Click Log In
- Click My Apps
- Click Add New App
- On the Create a New App ID, enter AWS PowerShell Help for Display Name, and your own email address for Contact Email
- Click Create App ID
- Follow any instructions if prompted for a Security Check
- You’ll be taken to an Add a Product screen. Locate Messenger, and click Set Up
- Scroll down to Token Generation
- Click Create a new page
- In the Community or Public Figure page, select Get Started
- Page Name : AWS PowerShell Help
- Category: Computers & Internet Website
- Click Continue
- On Add a Profile Picture, select Skip
- On Add a Cover Photo, select Skip
- After a couple of seconds, our AWS PowerShell Help page will be created.
Go back to Token Generation for our Messenger settings
- Select our AWS PowerShell Help page
- Select Continue as … when prompted to allow the application to receive your name and profile picture
- The next dialog is to do with allowing your application to act on your behalf. Click OK to authorize.
- When the screen returns to Token Generation, it will now have a Page Access Token. Record this information for later use
- Now go to Settings, Basic
- Click Show in the App Secret dialog, and enter your password when prompted
- The App Secret will be displayed. Also record this information for later use
At this point, with the exception of one setting which needs to be carried out after we have created our Lex ‘bot, our pre-requisites for our Facebook app are in place. In the next blog, we’ll get our development environment setup for generating our PowerShell function.
Thanks for reading! Feedback welcome!