AWS Toolkit for Visual Studio Codeを使ってみた（C#編）

# AWS Toolkit for Visual Studio Codeとは
AWS Toolkit for Visual Studio CodeはAWSがオープンソースで開発を行っているVisual Studio Code（以下VS Code）用のプラグインで、ソースコードはGitHubの[aws/aws-toolkit-vscode](https://github.com/aws/aws-toolkit-vscode) で公開され開発が進められています。 ライセンスは Apache License 2.0で、2019/10/20 時点の最新バージョンは1.1.0です。

## AWS Toolkit for Visual Studio Codeの便利な機能
AWS Toolkit for Visual Studio Codeは、VS Codeのプラグインとして下記の便利な機能を提供します。

- AWS Serverless Application Model (以下 SAM) を利用したサーバーレスアプリケーションの開発
- AWS Lambdaの開発言語として、Node.js、Python、.NET Coreに対応
- SAMテンプレートを含むAWS Lambdaファンクションプロジェクトの生成
- ユニットテスト用コードの提供
- VS Code内でローカル実行やデバッグ実行
- VS Code内からSAMテンプレートによるAWSへのデプロイ

## 利用するための準備

### 前提条件
AWS Toolkit for Visual Studio Codeをインストールするために必要な前提条件は以下の通りです。

- アマゾンウェブサービスのアカウント
- サポートされている以下のいずれかのオペレーティングシステム
 - Windows
 - Linux
 - macOS
- 使用する言語のSDK
 - [.NET Core SDK](https://dotnet.microsoft.com/download)
 - [Node.js SDK](https://nodejs.org/en/download)
 - [Python SDK](https://www.python.org/downloads)
- [Visual Studio Code バージョン 1.31.1 以降](https://code.visualstudio.com/)

また使用する言語に応じて下記のVS Codeプラグインをインストールします。

- [C# for Visual Studio Code (powered by OmniSharp)](https://marketplace.visualstudio.com/items?itemName=ms-vscode.csharp)
- [Python extension for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-python.python)
 
AWSサーバーレスアプリケーション開発を行うには以下もインストールします。

- AWS SAM CLI（インストールの詳細は[こちらを参照](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html)）
- [Docker](https://www.docker.com/)

筆者は下記の環境で動作を確認しました。

- macOS Mojave バージョン 10.14.6
- Visual Studio Code バージョン 1.39.2
- AWS Toolkit for Visual Studio バージョン 1.1.0
- C# for Visual Studio Code (powered by OmniSharp) 1.21.5
- .NET Core 3.0.100
- aws-cli/1.16.156 Python/3.6.1 Darwin/18.7.0 botocore/1.12.146
- SAM CLI, version 0.22.0
- Docker version 19.03.2, build 6a30dfc

### AWS Toolkit for Visual Studio Codeのインストール
インストールは、シンプルにプラグインをインストールするだけです。
![install_AWS_Toolkit_for_Visual_Studio_Code.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83238/2e2afebd-b710-4fbe-a5b5-682e17d82bf6.png)

### AWSで利用するプロファイルの設定
AWS Toolkit for Visual Studio Codeをインストールしたら、AWSのリソースにアクセスするために認証情報の設定を行います。コマンドパレットから [AWS: Create Credentials Profile]を選択します。
![スクリーンショット_2019_10_19_22_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83238/33d0b0e6-2c1f-630e-fe0f-4b84b81b284a.png)
初期プロファイル名、利用するIAM Userの認証情報（アクセスキーIDとシークレットアクセスキー）を入力します。すでに設定されている場合は、~/.aws/credentialsファイルと ~/.aws/configファイルが開きますので、内容を確認します。アクセスキーIDとシークレットアクセスキーの取得の方法は、[AWSアクセスキーの取得](https://docs.aws.amazon.com/ja_jp/toolkit-for-vscode/latest/userguide/obtain-credentials.html)を参照してください。
![credentials_—_demoapp2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83238/aa3a853e-9944-f7fd-d037-e34c6799759c.png)

## AWS Toolkit for Visual Studio Codeの利用
AWS Toolkit for Visual Studio Codeのインストールとプロファイルの設定が完了したら、サーバーレスアプリケーションを開始することができます。

### AWSサーバーレスアプリケーションの作成
サーバーレスアプリケーションの開発を始めるために、コマンドパレットから[AWS: Create New SAM Application]を選択します。
![create_new_sam_app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83238/86fe08ab-762a-bd6c-1c90-fc44be56c645.png)
作成するサーバーレスアプリケーションの言語を選択します。今回はC#編ということで、dotnetcore2.1を選択します。
![select_language.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83238/5e60776e-46dc-25aa-e56a-88779cec895e.png)
ワークスペースのフォルダを選択します。
![select_workspace_folder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83238/e9dc094c-f042-40d7-f58a-8e27a2e8293c.png)

アプリケーション名を入力します。
![enter_new_application.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83238/e8944c43-2ecd-b08b-6a3d-47f0ec8e899b.png)

サーバーレスアプリケーションプロジェクトが作成され、template.ymlが表示されます。Amazon API Gatewayから呼び出されるAWS LambdaをAWS上に生成するSAMテンプレートが作成されていることがわかります。
![sam_template.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83238/c700084f-6650-2b43-8907-6c54c8ca48be.png)

### ローカル環境でデバッグモードの実行
サーバーレスアプリケーションプロジェクトには、AWS Lambdaファンクションのサンプルコードが予め作成されています。srcフォルダ内のFunction.csを開きます。
![function_cd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83238/ce819c0b-4a9e-eac7-eb01-2d770fe6e5dd.png)
左側のアクティビティーバーからAWSアイコンをクリックするとCodeLensが表示されます。デバッグ実行で実行を中断したい行番号の左側をクリックしてブレークポイントを設定します。AWS LambdaファンクションのエントリポイントであるFunctionFunctionHandlerメソッドのCodeLensで[Debug Loccaly]をクリックしてデバッグ実行を開始します。
![debug2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83238/67119235-b6dd-4f71-b371-ef6d406ec31f.png)
デバッグツールバーとデバッグコンソールが表示され、.NET Coreアプリケーションがデバッグモードで実行開始されます。
![debug3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83238/d4611834-6b54-34df-276a-9a22ada9aad6.png)
デバッグツールバーの続行（F5）をクリックするとブレイクポイントを設定した箇所で実行が停止することを確認できます。またローカル変数の値が確認できることもわかります。
![debug4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83238/950f5f1f-ab5c-e682-c646-ac7cea9baded.png)

### API Gatewayイベントソースリクエストからの情報の受け取り
Amazon API GatewayをイベントソースとするAWS Lambdaファンクションでイベントソースからの値を受け取るためにAWS Lambda for .NET Coreでは、[Amazon.Lambda.APIGatewayEvents.APIGatewayProxyRequest](https://github.com/aws/aws-lambda-dotnet/blob/master/Libraries/src/Amazon.Lambda.APIGatewayEvents/APIGatewayProxyRequest.cs)クラスを提供しています。このクラスはパブリックプロパティを集めただけのクラスですが、AWS API Gatewayから渡されるJSONのメンバーの値が自動的にこのクラスのインスタンスにセットされて渡されるようになっています。この動作をデバッグモードの実行でエミュレートするための機能が提供されています。
![configure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83238/98236f76-45b6-14fa-3c14-3f7080857ec3.png)
CodeLensの[Configure]をクリックすると.aws/templates.jsonが開きます。
![event1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83238/a1c7cc48-d3e5-6b50-84c1-1725fa81057d.png)
このevnetプロパティに値をセットするとデバッグ実行にその値を受け取ることができます。サーバーレスアプリケーションプロジェクト内の[アプリケーション]/eents/event.jsonにAWS API Gatewayから渡されるjsonのサンプルがあるので、これをコピーして試してみます。
![event2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83238/c02825ac-00d5-efdb-65a7-3bcfaa805230.png)
再度、CodeLensの[Debug Locally]をクリックしてデバッグモードで実行して見るとAPIGatewayProxyRequestクラスのインスタンスであるapigProxyEventに値がセットされて渡されていることが、変数ウィンドウの値で確認できます。
![event3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83238/736f851f-fb4e-d195-ca43-0a48da4229d6.png)

## AWSへのデプロイ
AWS Toolkit for Visual Studio Codeが提供する機能を利用して、VS CodeからサーバーレスアプリケーションをAWSへデプロイすることができます。デプロイする前に、あらかじめAmazon S3にデプロイ用のバケットを作成しておきます。
VS Codeのコマンドパレットから[AWS: Deploy SAM Application]を選択します。
![deploy1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83238/369faa81-8ddd-66e2-78e4-f4be9f7fd8f1.png)
SAMテンプレートを選択します。
![deploy2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83238/95b99b55-5c12-0e2e-07e1-3e075313810c.png)
次にデプロイするリージョンを選択します。
![deploy3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83238/71ab232e-b972-4fc5-b586-011aeed33fc0.png)
あらかじめ作成しておいたAmazon S3のバケット名を入力します。バケットは1つ前で選択したリージョンに作成している必要があります。
![deploy4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83238/6995f49f-d6fa-9047-148c-7b0d26195087.png)
デプロイスタックのための名前を入力します。
![deploy5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83238/516a9b97-13d8-5f4f-9b4d-cee94fad19d3.png)
以上の手順でVS Codeからサーバーレスアプリケーションをデプロイすることができます。
![deploy6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83238/c7078152-e86e-4794-bbb9-3d88cd373a4f.png)

# 最後に
AWS Toolkit for Visual Studio Codeを利用することで使い慣れたVS Codeを使用してAWS Lambdaの開発を効率よく行うことができます。今回はC#（.NET Core）で開発を行う例を紹介しましたが、Node.jsやPythonでも同様に利用することができます。この投稿が、VS Codeでサーバーレスアプリケーション開発したいと考えている開発者の方の参考になれば幸いです。

#免責
本投稿は、個人の意見で、所属する企業や団体は関係ありません。
また掲載しているサンプルプログラム等の動作に関しても一切保証しておりません。