C#でAWSLambda関数を作ってみた
この記事はOUCC Advent Calendar 2022の23日目の記事です。前回の記事は紅茶さんの「お気に入りの量産型・地雷系ファッションブランドについて語る」でした。
どうもこんにちは、3回のかきのたねです。
今知り合いとの忘年会を終えて酔いを冷ましながらこの記事を書いています。
エンジニアは孤独な職業と言いますが、最近人と遊んだり飲んだりするのが楽しくて仕方なくていよいよエンジニア失格かもしれませんね。。。
まあ、人付き合いも1種の立派な勉強と開き直っています。
さて先日AWSLambdaを触る機会があったので、備忘録として記事にしておこうと思います。
まずは準備
- AWS Toolkit for Visual Studioのインストール
- VisualStudio 2022 を開く。
- 上のメニューから拡張機能≫拡張機能を管理するを選択
- AWS Toolkit for Visual Studioを選択してダウンロード。
- VisualStudioをいったん閉じるとインストールが開始される。
- AWSでアカウント登録を済ませておきましょう。
プロジェクト作成
-
VisualStudio2022を起動し新しいプロジェクトの作成画面を開くと、AWSLambdaプロジェクトのテンプレートが出てくるので、
AWS Lambda Project (.Net Core -C#)
を選択。
-
以下の構成でプロジェクトが作成されるはず。
.Project |---- Properties | └ launchSettings.json |--- Function.cs |--- aws-lambda-tools-defaults.json --- readme.md
AWSアカウントとの連携
-
AWSのコンソールを開き、
アカウント -> セキュリティ認証情報
を選択。 -
セキュリティ認証情報画面で、
新しいアクセスキーの作成
を選択してアクセスキーを作成。キーファイルのダウンロード
を選択してアクセスキーをダウンロードする。(このファイルは無くさないように大切に保管しておく。)
-
VisualStudioで
表示 -> AWSExplorer
を選択してウインドウを開き、アカウント追加ボタン(赤線部分)をクリックする。
-
アカウント作成画面が出るので、ダウンロードしたキーファイルの情報を入力。
プロフィール名は自由で、リージョンは一応東京を選択しておく。
サンプル関数をAWSLambdaに発行、テストする
-
入力文字列を受け取り、簡単なメッセージを返す以下のようなメソッドをLambdaに発行する。
// ------------------------------------------------------------------------------- #region +LambdaTestFunc:AWS用の簡単な関数 // ------------------------------------------------------------------------------- /// <summary> /// AWSLambdaで実行されるテスト用の関数です。 /// ただ入力を受け取って簡単な文字列を返します。 /// </summary> /// <param name="input">入力</param> /// <param name="context">関数とリクエストに関する情報を持つ[コンテキストオブジェクト](</param> /// <returns>返答メッセージ</returns> [LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] public string LambdaTestFunc(string input, ILambdaContext context) { return $"こんにちは: {input}さん"; } #endregion (LambdaTestFunc)
VisualStudioでのテスト
AWSでのテスト
LambdaをAPIGateway経由で呼び出そう
- 今度は発行したLambda関数をAPIとして呼び出せるようにします
-
Nugetから
Newtonsoft.Json
とAmazon.Lambda.Serialization.Json
を取得。 -
Lambda関数の戻り値をAPIGatewayに対応させるため、新しいクラスを作成する。
実際にはLambda関数はこのクラスを戻り値といて返しますが、Jsonに変換されてAPIGatewayに渡されます。-
HttpStatusCode
やIsBase64Encoded
,Headers
プロパティはAPIGatewayが参照する情報で、ユーザに渡したい値はBody
に文字列として渡します。クラスの情報を渡したい時はJson
文字列にシリアライズして渡します。 -
JsonProperty
属性はJsonに変換される際のキー名です。(指定しなかった場合プロパティ名がキーとなります。)
APIGatewayに合わせてキー名がキャメルケースになるようにしています
// =================================================================================== #region LambdaResponse:Lambda関数の返答クラス // =================================================================================== /// <summary> /// Lambda関数が戻り値として使用するクラスです。 /// 実際にはJsonにシリアライズされて返されます。 /// </summary> public class LambdaResponse { // =============================================================================== #region プロパティ // =============================================================================== /// <summary>Base64エンコードが行われているか</summary> [JsonProperty(PropertyName = "isBase64Encoded")] public bool IsBase64Encoded; /// <summary>HTTPのステータスコード</summary> [JsonProperty(PropertyName = "statusCode")] public HttpStatusCode StatusCode; /// <summary>HTTPのヘッダ情報</summary> [JsonProperty(PropertyName = "headers")] public Dictionary<string, string> Headers; /// <summary>本体メッセージ</summary> [JsonProperty(PropertyName = "body")] public string Body; #endregion (プロパティ) } #endregion (LambdaResponseクラス)
-
-
APIGatewayに対応した新しいメソッドをLambdaに発行する。
// ------------------------------------------------------------------------------- #region +APIGatewayGetTest:APIGatewayのGETメソッドテスト用の簡単な関数 // ------------------------------------------------------------------------------- /// <summary> /// APIGatewayのGETメソッドをテストするメソッドです。 /// Lambdaに登録されAPIGatewayのGETメソッドを通して呼び出されます。 /// </summary> /// <param name="input">入力</param> /// <param name="context">関数とリクエストに関する情報を持つ[コンテキストオブジェクト]</param> /// <returns></returns> public LambdaResponse APIGatewayGetTest(object input, ILambdaContext context) { return new LambdaResponse() { IsBase64Encoded = false, StatusCode = HttpStatusCode.OK, Headers = new Dictionary<string, string>() { {"my_header", "my_value" } }, Body = $"こんにちは!!", }; } #endregion (APIGatewayGetTest)
-
AWSコンソールからAPIGatewayを開き、APIの作成を選択。
-
設定画面は以下のように選択する。プロトコルでWebSocketを選択すると、WebSocketによりコネクションを作って通信するAPIとなるが、今回はRESTでいい。
-
今回はGETメソッドを選択。
-
作成したRESTAPIを呼び出すと、以下のようになる。
レスポンスの本文はBody
プロパティの文字列になっているのがわかる。
REST APIをデプロイ
最後に
このRESTAPIに引数を渡したり、パスワード認証をかけたりといった事もできるんですが、長くなるのでこのあたりまでにしておきます。
サーバレスというのはなにか魅力を感じますね。
あとけちなAWS君にしては5万リクエストまで無料というのもメリットの一つです。
何かに活かせないかな。。。アイデア募集中です。