Amazon API Gateway経由でPowerShellベースのAWS Lambdaを実行する

記事タイトルとURLをコピーする

こんにちは。鎌田(裕)です。
常々、API GatewayからPowerShellベースのLambdaを実行したい!と考えていたのですが、ようやくたどり着けたので、備忘も兼ねてのご紹介です。

下記の記事で、コードの準備からデプロイまでを紹介しているので、併せてご確認ください。 blog.serverworks.co.jp

このブログで書いていること

1.LambdaからAPI Gatewayに値を渡すために必要なPowerShellの実装 2.コード実装例 3.API Gatewayの設定 4.API Gatewayで発行されたURLにPOSTしてみる

1.LambdaからAPI Gatewayに値を渡すために必要なPowerShellの実装

下記の公式ドキュメントにも記載されていますが、API Gatewayから呼び出されたWebリクエストに返答する場合、Lambda側で返す値が必要です。 https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/powershell-handler.html#powershell-handler-output

PowerShellのコードでは、「PowerShellスクリプトの最後にあるオブジェクト」が返されるようになっていて、

  • PowerShellスクリプトの最後にあるオブジェクトが文字列の場合、そのまま返す
  • PowerShellスクリプトの最後にあるオブジェンとが文字列以外の場合、ConverTo-JsonでJSONに変換して返す

という仕様になっています。 なので実装としては、最後にオブジェクトを返すような形の実装をしておく、ということになります。

2.コード実装例

少し分かりづらいので、実際のコード例を見てみましょう。

$json = $LambdaInput.body

@{
    'statusCode' = 200;
    'body' = $json;
    'headers' = @{'Content-Type' = 'text/plain'}
}

これは、Lambda関数のPowerShellコードとして、実装した部分です。 API Gatwayに値を返すため、HTTPのStatusコード、本文、ヘッダをそれぞれ設定していて、この値を最後のオブジェクトとしています。 これで、API Gatewayは値を受け取って、Web表示するような挙動が出来る、という訳です。

コード全体としては、API Gatewayから送られたデータがLambdaの$LambdaInputというオブジェクトの中にあるbodyに入っているので取り出し、そのままその値を返す、というようなコードです。 標準テンプレートで作ったPowerShellのコードから、上記の部分を実装としてコーディングしています。

3.API Gatewayの設定

API Gatewayを設定して、PowerShellベースのLambdaを起動できるようにしてみましょう。

マネジメントコンソール上からAPI Gatwayのページにアクセスし、右上にある「APIを作成」をクリックします。

APIを作成

APIタイプを選択する画面になるので、"REST API"をのところにある「構築」をクリックします。

REST APIの作成

APIの詳細画面になります。 "新しいAPI"を選び、API名を入力して、「APIを作成」をクリックしましょう。

APIを作成

まずはAPI Gatewayを作ることが出来ました。
続けて、POSTメソッドをLambdaに渡していくための設定をします。

メソッドを作成

メソッドの作成画面になります。
メソッドタイプにPOST、統合タイプはLambda関数を選びます。また、Lambdaプロキシ統合は有効にしておきます。ここを有効にしておかないと、API GatewayからLambdaにデータが渡されません。Lambda関数は、PowerShellでデプロイしたLambdaを選択しましょう。
選択などが終わったら、「メソッドを作成」をクリックします。

メソッドを作成

準備が整ったので、APIをデプロイしていきます。「APIをデプロイ」をクリックします。

APIをデプロイ

ステージは 「New stage」を選択します。ステージ名の入力も出来るようになるので、任意のステージ名を入力しましょう。入力出来たら「デプロイ」をクリックします。

デプロイ

呼び出し用のURLまで発行されました!

デプロイ完了

4.API Gatewayで発行されたURLにPOSTしてみる

実際に発行されたURLにPOSTしてみました。せっかくなので、PowerShellでPOSTしてみましょう。 ポストするデータの変数を用意した上でPOSTしてみます。

$postparam = @"
{               
  "Name":"test"
}
"@

invoke-WebRequest -Uri https://xxx.execute-api.ap-northeast-1.amazonaws.com/powershelltest -Method POST -Body $postparam

すると、

StatusCode        : 200
StatusDescription : OK
Content           : {
                      "Name":"test"
                    }
RawContent        : HTTP/1.1 200 OK

(以下は省略)

お、PowerShellの最後に指定したオブジェクトが無事戻ってきました。 これで、API Gatewayを経由するPowerShellのコードも、色々書いてみることも出来そうです。

まとめ

PowerShellとAPI Gatewayというなかなか結びつきづらいものを組み合わせたものを紹介しましたが、いかがでしたでしょうか。 これで、PowerShellでコーディングしてサーバーレス出来る、と言い張ることも出来そうです。

誰かのお役に立ちましたら幸いです。