[AWS.1] .net AWS Lambda 開発環境(for mac) の構築

## 1. 概要
2022年2月、AWS Lambda で .NET6 が利用できるようになりました。
VisualStudio 2022 for MAC によって Mac上でも .NET6 アプリケーションを作成できるようになったため、本記事では C#(.NET6) で AWS Lambda 関数を作成するための環境構築について整理していきます。

:::note warn
同様の記事はネット上に溢れており、開発ツールのバージョンアップも頻繁に行われています。
本記事の内容もあっという間に陳腐化すると思われますので、ご注意ください。
:::

#### VisualStudio 2022 for MAC
.NET コンソールアプリケーションを作成する環境であり、プロジェクトを包括的に管理することができる統合開発環境です。
.NET6 を正式にサポートする Visual Studio ですが、Visual Studio Code でも同様の開発環境を整えることは可能です。

Visual Studio for Mac
https://visualstudio.microsoft.com/ja/vs/mac/

#### AWS Toolkit for Visual Studio
現時点では、AWS Toolkit for Visual Studio は Visual Studio for Mac をサポートしていません。
AWS を利用する .NETアプリケーションの開発、デバッグ、デプロイが容易になるとのことですが、残念ながら利用することができないため、AWS CLI を手動操作で駆使するしかないようです。

AWS Toolkit for Visual Studio
https://aws.amazon.com/jp/visualstudio/

#### AWS SDK for .NET
VisualStudio のパッケージ管理システム NuGet を使うと、プロジェクトに AWS SDK のパッケージを追加することができます。
コマンドツールからパッケージを追加することもできますが、Visual Studio からの画面操作で導入する方が遥かに容易です。（特に、導入可能なパッケージを目視で探すときなど）

AWS SDK for .NET のドキュメント
https://docs.aws.amazon.com/ja_jp/sdk-for-net/

NuGet で AWSSDK パッケージをインストールする
https://docs.aws.amazon.com/ja_jp/sdk-for-net/v3/developer-guide/net-dg-install-assemblies.html

#### AWS アカウント
最初に作成した root アカウントは開発時には利用しません。
管理者権限を持たせた「管理用のユーザアカウント（IAMアカウント）」を作成し、そのアカウントでログインして開発作業を進めてください。
このアカウントは、AWSの各APIや AWS CLI 実行時のアカウントとして使用します。

AWS アカウントでの IAM ユーザーの作成
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users_create.html

#### 本記事を作成する際に参考にしたサイト
AWS CLI v2をMacにインストールする
https://qiita.com/NorihitoYamamoto/items/badd32785078bc944089

初級：AWS Lambda + .NET C# の最初の一歩
https://qiita.com/nanananamememe/items/8c57b17e5f7f60b768d4

.NET Core CLI
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/csharp-package-cli.html

## 2. IAMユーザのアクセスキーを取得
IAMユーザはアクセスキー情報を持つことができます。
IAMユーザ作成時、「AWSアクセスの種類を選択」の「アクセスの種類」欄で、『**プログラムによるアクセス**』にチェックをつけておくと、アカウント作成中にアクセスキー情報を取得可能です。

アクセスキー情報には下記の値が含まれており、AWS へアクセスする際の認証情報として使用します。
* アクセスキーID
* シークレットアクセスキー

:::note info
アカウント作成中に取得し忘れた場合は、IAMコンソール画面から対象ユーザーを選択して再取得可能です。

IAM ユーザーのアクセスキーの管理
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_access-keys.html
:::
:::note warn
アクセスキー情報は必ず CSVファイル形式でダウンロードしてください。
作成直後は画面上でも確認できますが、後日改めて確認しようとしても「シークレットアクセスキー」値は二度と表示されません。
その場合、古いキー情報を削除して新しいアクセスキー情報を再作成する必要があります。
:::

## 3. AWS CLI のインストール
MacOS用のパッケージをダウンロードしてインストールします。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

1. ブラウザから、MacOS用の pkgファイルをダウンロードします。
https://awscli.amazonaws.com/AWSCLIV2.pkg
　
1. ダウンロードしたファイルを実行し、画面の指示に従ってインストールします。
「インストール先の選択」画面では次の３つを選択可能ですが、特に問題が無ければ既定で選択されている『**このコンピュータのすべてのユーザ用にインストール**』のままで良いと思います。
　・このコンピュータのすべてのユーザ用にインストール
　・自分専用にインストール
　・特定のディスクにインストール
　
1. ターミナルを起動し、次のようにコマンドを投入して AWS CLI がインストールされたことを確認します。
```
$ which aws
/usr/local/bin/aws
$ aws --version
aws-cli/2.7.16 Python/3.9.11 Darwin/19.6.0 exe/x86_64 prompt/off
```
## 4. AWS CLI の設定
AWS CLI のインストールが終わった後、認証情報などの設定作業を行います。
この作業は ```aws configure```コマンドで簡単に実施できます。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html

設定する情報は次のとおりです。
* アクセスキーID
* シークレットアクセスキー
* AWSリージョン
* 出力形式

#### アクセスキーID/シークレットアクセスキー
先の手順で取得した、IAMユーザのアクセスキー情報を指定します。

#### AWSリージョン
既定のリージョンを指定します。
通常は最寄りのリージョン（例. "Asia Pacific (Tokyo)" の場合は ap-northeast-1）を指定しますが、どのリージョンでも構いません。
コマンド実行時に個別指定しない限り、ここで設定したリージョンへリクエストが送信されます。

AWS service endpoints - AWS General Reference
https://docs.aws.amazon.com/general/latest/gr/rande.html

#### 出力形式
既定の出力形式を指定します。
省略時は「JSON」形式となります。

### 実行例
<font color="red">下記はサンプル値です。</font>
実際の設定値へ置き換えて実行してください。
```
$ aws configure
AWS Access Key ID [None]: AK****************LE
AWS Secret Access Key [None]: w***********I/K*****G/b****************Y
Default region name [None]: us-west-2
Default output format [None]: json
```
:::note info
設定情報は、既定で「default」という名前のプロファイルへ保存されますが、--profile オプションにより、任意の名前のプロファイルへ保存することが可能です。
例えば、「user1」という名前のプロファイルへ保存するときは、次のようにオプションを指定して実行します。
```
$ aws configure --profile user1
```

保存したプロファイルを指定してコマンドを実行する際も、--profile オプションを指定します。
```
$ aws s3 ls --profile user1
```
:::

## 5. AWS Extensions for .NET CLI のインストール
AWS拡張機能の一つである「Lambda.Tools」を、.NET CLI へ追加します。
この拡張には、Lambda 関数をパッケージングして AWS上へデプロイする機能が含まれます。
https://github.com/aws/aws-extensions-for-dotnet-cli

**(1) インストール**
```
$ dotnet tool install -g Amazon.Lambda.Tools
```
　 
**(2) アップデート**
```
$ dotnet tool update -g Amazon.Lambda.Tools
```

## 6. Lambda プロジェクトテンプレートのインストール
AWS Toolkit for Visual Studio が MacOS をサポートしていないため、 新規 Lambda プロジェクトは dotnet コマンドで作成しなければなりません。
そのためのそのためのプロジェクトテンプレートをインストールします。
```
$ dotnet new -i Amazon.Lambda.Templates
```
コマンドの実行が成功すると、インストールしたテンプレートの一覧が表示されます。
```
次のパッケージがインストールされます:
   Amazon.Lambda.Templates

成功: Amazon.Lambda.Templates::6.2.0により次のテンプレートがインストールされました。
テンプレート名             短い名前                                      言語     タグ                 
-------------------------  --------------------------------------------  -------  ---------------------
Empty Top-level Function   lambda.EmptyTopLevelFunction                  [C#]     AWS/Lambda/Serverless
Lambda Annotations Fra...  serverless.Annotations                        [C#]     AWS/Lambda/Serverless
Lambda ASP.NET Core Mi...  serverless.AspNetCoreMinimalAPI               [C#]     AWS/Lambda/Serverless
Lambda ASP.NET Core We...  serverless.AspNetCoreWebAPI                   [C#],F#  AWS/Lambda/Serverless
Lambda ASP.NET Core We...  serverless.image.AspNetCoreWebAPI             [C#],F#  AWS/Lambda/Serverless
Lambda ASP.NET Core We...  serverless.AspNetCoreWebApp                   [C#]     AWS/Lambda/Serverless
Lambda Custom Runtime ...  lambda.CustomRuntimeFunction                  [C#],F#  AWS/Lambda/Function  
Lambda Detect Image La...  lambda.DetectImageLabels                      [C#],F#  AWS/Lambda/Function  
Lambda Empty Function      lambda.EmptyFunction                          [C#],F#  AWS/Lambda/Function  
Lambda Empty Function ...  lambda.image.EmptyFunction                    [C#],F#  AWS/Lambda/Function  
Lambda Empty Serverless    serverless.EmptyServerless                    [C#],F#  AWS/Lambda/Serverless
Lambda Empty Serverles...  serverless.image.EmptyServerless              [C#],F#  AWS/Lambda/Serverless
Lambda Giraffe Web App     serverless.Giraffe                            F#       AWS/Lambda/Serverless
Lambda Simple Applicat...  lambda.SimpleApplicationLoadBalancerFunction  [C#]     AWS/Lambda/Function  
Lambda Simple DynamoDB...  lambda.DynamoDB                               [C#],F#  AWS/Lambda/Function  
Lambda Simple Kinesis ...  lambda.KinesisFirehose                        [C#]     AWS/Lambda/Function  
Lambda Simple Kinesis ...  lambda.Kinesis                                [C#],F#  AWS/Lambda/Function  
Lambda Simple S3 Function  lambda.S3                                     [C#],F#  AWS/Lambda/Function  
Lambda Simple SNS Func...  lambda.SNS                                    [C#]     AWS/Lambda/Function  
Lambda Simple SQS Func...  lambda.SQS                                    [C#]     AWS/Lambda/Function  
Lex Book Trip Sample       lambda.LexBookTripSample                      [C#]     AWS/Lambda/Function  
Order Flowers Chatbot ...  lambda.OrderFlowersChatbot                    [C#]     AWS/Lambda/Function  
Serverless Detect Imag...  serverless.DetectImageLabels                  [C#],F#  AWS/Lambda/Serverless
Serverless Simple S3 F...  serverless.S3                                 [C#],F#  AWS/Lambda/Serverless
Serverless WebSocket API   serverless.WebSocketAPI                       [C#]     AWS/Lambda/Serverless
Step Functions Hello W...  serverless.StepFunctionsHelloWorld            [C#],F#  AWS/Lambda/Serverless
```
## 7. 終わりに
これで Lambda プロジェクトソースを作成する準備が整いました。
次回は、ありきたりなネタですが HelloWorld 的なサンプル関数を作成して AWS へデプロイする手順について説明します。