AWS Lambda関数をPowerShellで作成する

Posted on 2021/09/29

ToC

PowerShell on Mac

Mac上でPowerShellを動かしてみたくなり、それだけでは面白くないなぁと言うことで、勢いでAWS Lambdaのモジュールを作成してみました。 色々と調べながら試行錯誤したので、記事にしてみました。

まずは、Mac上でBrewを使って、PowerShellをインストールします。

brew install —cask powershell

==> Downloading https://github.com/PowerShell/PowerShell/releases/download/v7.1.
==> Downloading from https://github-releases.githubusercontent.com/49609581/89b7
######################################################################## 100.0%
==> Installing Cask powershell
==> Running installer for powershell; your password may be necessary.
Package installers may write to any location; options such as `--appdir` are ignored.
Password:
installer: Package name is PowerShell - 7.1.4
installer: Installing at base path /
installer: The install was successful.
🍺  powershell was successfully installed!

はい。順調です。
すでにこの段階でPowerShellが動き出します。コマンド名は、pwsh で起動します。

$ pwsh
PowerShell 7.1.4
Copyright (c) Microsoft Corporation.

https://aka.ms/powershell
Type 'help' to get help.

Mac上でも簡単にPowerShellが動いています。すでに割と面白いです。
続いて、サードパーティーのモジュール群をインストールします。

PS /PowerShell-Lambda> Install-Module AWSLambdaPSCore -Scope CurrentUser
PS /PowerShell-Lambda> Install-Module -Name AWS.Tools.Installer
PS /PowerShell-Lambda> Install-AWSToolsModule AWS.Tools.S3

PS /PowerShell-Lambda> Get-InstalledModule                                                                                                                                                           

Version              Name                                Repository           Description
-------              ----                                ----------           -----------
1.0.2.1              AWS.Tools.Installer                 PSGallery            The AWS.Tools.Installer module makes it easier to install, update and uninstall other AWS.Tools modules (see https://www.powershellgallery.com/packages/AWS.Tools.Common/).…
2.1.0.0              AWSLambdaPSCore                     PSGallery            The AWS Lambda Tools for Powershell can be used to create and deploy AWS Lambda functions written in PowerShell.
4.1.14.0             AWS.Tools.S3                        /var/folders/ps/7h7… The S3 module of AWS Tools for PowerShell lets developers and administrators manage Amazon Simple Storage Service (S3) from the PowerShell scripting environment. In order to m…
4.1.14.0             AWS.Tools.Common                    /var/folders/ps/7h7… The AWS Tools for PowerShell lets developers and administrators manage their AWS services from the PowerShell scripting environment. In order to manage each AWS service, insta…

.NET Core のインストール

事前にインストールしておかないとPowerShellのLambdaのパッケージを作成する際にエラーになってしまうので、 .NET Core 3.1 をダウンロードしてインストールしました。
バイナリ形式で配布されているので、インストーラーにしたがってインストールするだけです。

/posts/2021/09/img/f4c95b55_hu4d65e8ddae8c17008b07973f4532667a_91391_600x0_resize_lanczos_3.png

インストール後に dotnet という、これまた直感的なコマンドで、バージョンも確認できます。

$ dotnet --info
.NET Core SDK (reflecting any global.json):
 Version:   3.1.413

いよいよLambda関数の作成

事前の環境整備が完了したので、PowerShellでLambda関数を作成します。
AWSからPowerShellランタイム用のツールとライブラリAWS Lambda Tools for Powershellが提供されているので、 これを利用しました。(ちなみに前工程のPowerShellのモジュール取得時に取得済みです)

あまり理解していないながらに、Readmeの内容にしたがって新規のプロジェクトを作成してみます。

PS /PowerShell-Lambda> New-AWSPowerShellLambda -ScriptName MyFirstPSScript -Template Basic
PS /PowerShell-Lambda> ls
MyFirstPSScript
PS /PowerShell-Lambda> cd ./MyFirstPSScript/
PS /PowerShell-Lambda/Basic> ls
MyFirstPSScript.ps1       readme.txt

MyFirstPSScript.ps1というサンプル関数のテンプレートが作成されています。 単純な関数を作成すると下記のような形になります。

#Requires -Modules @{ModuleName='AWS.Tools.Common';ModuleVersion='4.1.14.0'}

Write-Host (ConvertTo-Json -InputObject $LambdaInput -Compress -Depth 5)
$PSVersionTable

実行時にパラメータとして下記の2つが利用可能な状況となっていて、スクリプトで最後に出力したオブジェクトが Lambda 関数の戻り値となるようです。上記の例だと $PSVersionTable が戻り値になります。

パラメータ名
$LambdaInputLambda関数の呼び出し時のインプットデータ
$LambdaContextLambda環境のコンテキスト情報

関数Lambdaパッケージを作る際には、 New-AWSPowerShellLambdaPackage を利用してZipファイルを作成します。
すると関連するパッケージをZipに内包した形でLambda用のパッケージが作成されます。
Lambdaにデプロイする際のパッケージ名等も表示されています。

PS /PowerShell-Lambda/Basic> New-AWSPowerShellLambdaPackage -ScriptPath ./MyFirstPSScript.ps1 -OutputPackage ./MyFirstPSLambdaPackage.zip  

LambdaHandler                                               PathToPackage                                                  PowerShellFunctionHandlerEnvVar
-------------                                               -------------                                                  -------------------------------
MyFirstPSScript::MyFirstPSScript.Bootstrap::ExecuteFunction /PowerShell-Lambda/MyFirstPSScript/MyFirstPSLambdaPackage5.zip AWS_POWERSHELL_FUNCTION_HANDLER

Lambdaパッケージだと1ファイルにすべての関数を定義するような簡易な処理の場合には十分対応できそうです。 ただ、LambdaInputの内容によって処理を切り替えたり、メイン関数以外にも別ファイルに処理を分離する場合などにはこのままだと少し難ありです。

今後は、このあたりを見ていきたいと思います。


参照