AWS LambdaでPowerShellを使う

今更ながら自分でやってみたのでその時のメモ
こちらを参考にした。

PowerShellでAWS Lambdaを試してみた

以下、Ubuntu18.08にインストールしたPowerShell(Ver 6.2)で実施した。

.NET Core SDK 2.1のインストール

参考にしたページにも書かれている通り、内部ではPowerShellを呼び出すDLLをビルドしているため
.NET CoreのSDKが必要になる。
https://dotnet.microsoft.com/download/dotnet-core/2.1
から環境にあったものをダウンロードしインストールする。

標準では${HOME}/dotnet/以下にファイルを展開するらしいが、~/.local/share/dotnet以下に変更する。

if [ ! -d ~/.local/share/dotnet ]
then
  mkdir -p ~/.local/share/dotnet
fi

tar zxf dotnet-sdk-2.1.801-linux-x64.tar.gz -C ~/.local/share/dotnet

# 必要に応じて~/.bash_profileに記載する
export DOTNET_ROOT=$HOME/.local/share/dotnet
export PATH=$PATH:$HOME/.local/share/dotnet

関連モジュールのインストール

Install-Module -Name AwsLambdaPSCore -Scope CurrentUser -Force
Install-Module -Name AwsPowerShell.NetCore -Scope CurrentUser -Force

# Linuxなら~/.local/share/powershell/Modules以下にインストールされる

テンプレートからスクリプトをコピー

AwsLambdaPSCoreにはすでにサンプルスクリプトが用意されている。
(結局Requireくらいしていないが)これを利用すると簡単。

# テンプレート一覧の確認
Get-AWSPowerShellLambdaTemplate

# 指定したテンプレート(今回ばBasic)から雛形のスクリプトSample/Sample.ps1を作成
New-AwsPowerShellLambda -ScriptName Sample -Template Basic

コードの修正

適宜。
今回はBasicテンプレートの中身のWrite-Hostのコメントアウトを解除しただけ。

テスト

テストの環境はなさそうなので、変数LambdaInputにObject型のLambdaイベントを指定する。

# Lambdaの入力$LambdaInputはPSCustomObjectが与えられる
$LambdaInput = [PSCustomObject]@{"key1" = "value1"; "key2" = "value2"; "key3" = "value3"};

# テスト実行
./Sample/Sample.ps1

…PowerShellプロンプト上でちょこちょこやるのはちょっと微妙なのでもうちょっといい方法考えたい。

デプロイ

zipファイルの作成

# そのままLambdaにデプロイする場合

# Zipファイルに固めるだけの場合
$pack = New-AWSPowerShellLambdaPackage -ScriptPath ./Sample/Sample.ps1 -OutputPackage Sample.zip
$pack.LambdaHandler    # Lambdaに設定するLambda関数名、環境変数 AWS_POWERSHELL_FUNCTION_HANDLERで指定可能
$pack.PathToPackage    # 今回固めたZipファイル、だいたいCWD直下にできている

zipファイルのS3へのアップロード
方法はいろいろあるだろうが、今回はわかりやすくaws s3 cpした。

aws s3 cp /path/to/package.zip s3://bucket-name/path/to/package.zip

Lambda管理コンソール上で、S3上のファイルを指定し
アップロードしたファイルのS3のURL (https://s3.amazonaws.com/bucket-name/path/to/package.zip)を指定する。
※s3://~ と https://s3.amazonaws.com/~ のURLの読み替えがある点に注意

Lambdaで実行

AWS管理コンソール上から実行。

以上で一通り、PowerShellをLambdaで実行することができた。
開発〜デプロイまでまだ改良の余地がある。
GitリポジトリにPushしたら自動でLambdaでテストできるところまでできればいいなと思うが、でも多くのバッチ処理はそう気軽にテスト実行していいわけなかったりするので、あまり自動化のメリットもないのかもしれない。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です