直近ではPythonを使ってLambda+serverless framework+APIGatewayでRestAPIを作成していたのですが、そちらのプロジェクトが終わって知見を広めようとバックエンド系の言語を調べていた所、C#の文字を発見!
これまでC#はwindows用のアプリを開発する言語として利用してきたので、バックエンドでも使えることを知ってびっくりしました。
まだまだ初歩も初歩の部分をやっているのですが、初歩の部分のハードルがかなり高くて、自分でも2回目やるときにまた調べなきゃいけないことになりそうだったので、最小のAPIを作成してデプロイするところまでを手順化してみます!
環境
windows11
VisualStudio2022Community 17.8.6
.NET6
まずVisualStudioを変更する
- VisualStudioInstallerを起動して、変更を選択します。
- ASP.NETとWEB開発にチェックを入れて右下の変更を押します。
- しばらく待つとVisualStudioが変更されるので、これで完了です!
プロジェクトの作成
- 新しいプロジェクトの作成 をクリック
- テンプレートからASP.NET Core Web APIを選択
- 任意のプロジェクト名とソリューション名を設定し、場所の指定をし、次へを押す
- 追加情報の設定は基本的にはデフォルトで問題ないかなと思います。
フレームワークは.NET6.0
、認証の種類はなし
、HTTPS用の構成とOpenAPIサポート...とコントローラーを使用するにチェック☑を入れる。
これでプロジェクトの作成が完了しましたね!
この時点でローカルホストではAPIが動作するようになっているので、F5
or Ctrl+F5
で実行するとSwaggerViewがブラウザで立ち上がってローカルホストでAPIを叩けるようになります。
NuGetパッケージのインストール
- まずはLambdaにデプロイするために必要なNuGetパッケージをインストールします。
-
プロジェクトタブからNuGetパッケージの管理を選択し、参照タブで検索窓に
amazon.lambda.asp
と入力する。 - そうすると、
Amazon.Lambda.AspNetCoreServer.Hosting
というパッケージが出てくるので、インストールします。
- ポップアップが表示されたら
同意する
を押して、インストールの完了です。
プロジェクトファイルの編集
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<AWSProjectType>Lambda</AWSProjectType>
</PropertyGroup>
3. これで、このプロジェクトがLambda関数を開発しているとVisualStudioに認識させることができます。
<AWSProjectType>Lambda</AWSProjectType>
を追加する前と後では、.csproj
ファイルを右クリックしたときに表示されるメニューが違います。
デフォルトではPublish to AWS...
とAWSのすべてのサービスに対してデプロイするメニュー(使ったことがないので詳しくは知りません)ですが、AWSProjectType
プロパティにLambda
を設定すると、Publish to AWS Lambda...
というようにLambdaにデプロイする用のメニューに進化します。
Lambda関数にHTTPリクエストを送信するイベントを設定する
- 難しいことが書いてありますが、要はLambdaをトリガーする際のイベントを設定するというだけの事です。
今回はRestAPIでLambdaの発火を行うので、そのように設定します。 -
Program.cs
を開き、var app = builder.Build();
の上の行にbuilder.Services.AddAWSLambdaHosting(LambdaEventSource.RestApi);
を追加します。
builder.Services.AddSwaggerGen();
builder.Services.AddAWSLambdaHosting(LambdaEventSource.RestApi); //ここに追加
var app = builder.Build();
これだけでOKです!
RestApi
の部分をHttpApi
にすることでHTTP APIでも発火できます。
Lambda関数を作成する
- AWSコンソールからLambdaを開きます。
- 関数を作成ボタンをクリックして、関数の作成画面に移行します。
- 関数名に任意の名前を入力し、ランタイムに
.NET 6(C#/PowerShell)
を選択して関数を作成ボタンを押す。 - AWSコンソールでの操作は以上です。
Lambdaにデプロイする
-
ここまで出来たら、ついにLambdaにローカルの関数をデプロイしていきます。
-
まずはアセンブリ名を確認します。
-
.csprojを右クリックし、
Publish to AWS Lambda...
をクリック。 -
すると、Lambdaデプロイする用のインターフェースが表示されます。
-
FunctionNameで
Re-deploy to existing
にチェックを入れて、先ほどAWSコンソールで作成したLmabda関数を選択して、Handlerにアセンブリ名を入力してNextを押します。 -
デプロイの設定画面が表示されるので、RoleNameには、先ほど作成したLambda関数の名前がついているものを選択してください。(例 :
test_lambda_role_xxxxxxxxx
) -
他の設定もできますが、今回はそれ以外は特に触れずに、Uploadボタンを押します。
-
何事もなければ、publishingと表示され、アップロード作業が完了すると自動的にクローズします。
-
その後表示される画面でテストができるのですが、今回の構成ではテストしてもエラーが出るので、パスします。
-
これで、Lambda関数側は完了になります!
API GatewayでAPIを作る
- これまで色々やってきたLambda関数を発火する用のAPIを作成します。
- AWSコンソールにアクセスし、APIGatewayのコンソールを開きます。
- 作成出来るAPIの種類が表示されるので、REST APIの構築をクリックする。(APIの種類が表示されず、既存のAPI一覧が表示される場合は、APIを作成ボタンをクリックすると表示されます)
- API名だけ任意のものを付けて、他はデフォルトのままAPIを作成をクリック。
- リソースを作成をクリック。
-
プロキシのリソースをONにして。リソース名に
{proxy+}
と入力してリソースの作成をクリックします。
- 右側のリソースツリーから
/{proxy+}
を選択して、メソッドを作成ボタンをクリック。 - メソッドタイプは、今回のLambda関数は天気を取得するものなので、GETを選択します。
- Lambda関数には、先ほど作成したLambda関数を選択し、メソッドを作成をクリックします。
- 続いて、リソースツリーから、ANYを選択し、統合を編集ボタンをクリックします。
- Lambda関数で先ほど作成したLambda関数を選択し、他は何も触れずに保存を押します。
- ここまで出来たら、右上にあるAPIをデプロイをクリックし、
ステージを選択
プルダウンをクリックし、新しいステージ
で、ステージ名には任意の名前を付けてデプロイボタンをクリックします。 - これで、APIを作成す、Lambdaと紐づけることができたので、あとは動作チェックだけです。
実際に動作チェックする
- あとは簡単で、実際にAPIGatewayで作成されたURLにアクセスして、APIが動いているか確認するだけです。
- まず、APIGatewayのコンソールを表示して、作成したAPIをクリックします。(先ほどAPIを作成した画面のままならパスで大丈夫です)
- 左側のサイドバーからステージの項目をクリックします。
- すると、
ステージの詳細
という画面が表示されるので、そこの中央あたりにあるURLを呼び出すというセクションに書いてあるURLをコピーします。 - 新しくタブを開いて、先のURLを張り付けます。
- これだけでは
{"message":"Missing Authentication Token"}
が表示されてしまうはずなので、エンドポイントを編集します。 - いったんVisualStudioに戻って、
Controllers\WeatherForecastController.cs
を開きます。 - ここに書いてあるのが実際のLambda関数なのですが、クラス名がエンドポイントになっています。
namespace testAPI.Controllers
{
[ApiController]
[Route("[controller]")]
// Routeアトリビュートでの指定によるが、controllerを指定した場合、
// クラス名からControllerを引いたものがエンドポイントになる
public class WeatherForecastController : ControllerBase
9. この場合は、WeatherForecast
がエンドポイントとなるので、{先ほどコピーしたURL}/WeatherForecast
をブラウザで叩きます。
10. すると、
[{"date":"2024-02-27T09:13:18.9855303+00:00","temperatureC":22,"temperatureF":71,"summary":"Mild"},{"date":"2024-02-28T09:13:19.0011868+00:00","temperatureC":14,"temperatureF":57,"summary":"Hot"},{"date":"2024-02-29T09:13:19.0011904+00:00","temperatureC":3,"temperatureF":37,"summary":"Freezing"},{"date":"2024-03-01T09:13:19.0011907+00:00","temperatureC":4,"temperatureF":39,"summary":"Mild"},{"date":"2024-03-02T09:13:19.0011908+00:00","temperatureC":26,"temperatureF":78,"summary":"Warm"}]
11.このようにブラウザに表示されれば無事APIとして動作していることになります!
振り返り
C#でAPIを作れるには作れるのですが、Pythonほど日本語の資料や記事も無く、AWSの公式リファレンスでもあまり取り上げられていないので、なかなか難しかったです。
幸い、海外の方が動画でチュートリアルを挙げてくださっていて、その通りにしたらしっかりAPIが作れたので、今回はそのまま翻訳したような形にはなりましたが、記事にしてみました。
気が向いたら、C#で実際に実用的なAPIを作成したり、そもそものASP.NET Cre WEB APIでデフォルト作成されるフォルダの解説なんかも書いてみようと思います。
参考にした動画 : Building a Serverless ASP.NET Core Web API using AWS Lambda and Amazon API Gateway REST API