

# AWS CDK を使用した C\$1 Lambda 関数のデプロイ
<a name="csharp-package-cdk"></a>

AWS Cloud Development Kit (AWS CDK) は、最新のプログラミング言語と .NET などのフレームワークを使用して、クラウドインフラストラクチャをコードとして定義するためのオープンソースソフトウェア開発フレームワークです。AWS CDK プロジェクトを実行して CloudFormation テンプレートを生成し、そのテンプレートを使用してコードをデプロイします。

AWS CDK を使用してサンプルの Hello World .NET アプリケーションを構築し、デプロイするには、以下のセクションの指示に従ってください。サンプルアプリケーションは、API Gateway エンドポイントと Lambda 関数で構成される基本的な API バックエンドを実装しています。エンドポイントに HTTP GET リクエストを送信すると、API Gateway によって Lambda 関数が呼び出されます。この関数は、リクエストを処理する Lambda インスタンスの IP アドレスと共に Hello World メッセージを返します。

## 前提条件
<a name="csharp-package-cdk-prereqs"></a>

**.NET 8 SDK**  
[.NET 8](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) SDK とランタイムをインストールします。

**AWS CDK バージョン 2**  
AWS CDK の最新バージョンをインストールする方法については、「AWS Cloud Development Kit (AWS CDK) v2 開発者ガイド」の「[AWS CDK の開始方法](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html)」を参照してください。

## AWS CDK サンプルアプリケーションをデプロイする
<a name="csharp-package-cdk-deploy"></a>

1. サンプルアプリケーションのプロジェクトディレクトリを作成して、そこに移動します。

   ```
   mkdir hello-world
   cd hello-world
   ```

1. 以下のコマンドを実行して、新しい AWS CDK アプリケーションを初期化します。

   ```
   cdk init app --language csharp
   ```

   このコマンドは、プロジェクトディレクトリに以下のファイルとディレクトリを作成します。

   ```
   ├── README.md
   ├── cdk.json
   └── src
       ├── HelloWorld
       │   ├── GlobalSuppressions.cs
       │   ├── HelloWorld.csproj
       │   ├── HelloWorldStack.cs
       │   └── Program.cs
       └── HelloWorld.sln
   ```

1. `src` ディレクトリを開き、.NET CLI を使用して新しい Lambda 関数を作成します。これは、AWS CDK を使用してデプロイする関数です。この例では、`lambda.EmptyFunction` テンプレートを使用して、`HelloWorldLambda` という名前の Hello World 関数を作成します。

   ```
   cd src
   dotnet new lambda.EmptyFunction -n HelloWorldLambda
   ```

   このステップ完了後のプロジェクトディレクトリ内のディレクトリ構造は、次のようになります。

   ```
   ├── README.md
   ├── cdk.json
   └── src
       ├── HelloWorld
       │   ├── GlobalSuppressions.cs
       │   ├── HelloWorld.csproj
       │   ├── HelloWorldStack.cs
       │   └── Program.cs
       ├── HelloWorld.sln
       └── HelloWorldLambda
           ├── src
           │   └── HelloWorldLambda
           │       ├── Function.cs
           │       ├── HelloWorldLambda.csproj
           │       ├── Readme.md
           │       └── aws-lambda-tools-defaults.json
           └── test
               └── HelloWorldLambda.Tests
                   ├── FunctionTest.cs
                   └── HelloWorldLambda.Tests.csproj
   ```

1. `src/HelloWorld` ディレクトリの `HelloWorldStack.cs` ファイルを開きます。ファイルの内容を次のコードに置き換えます。

   ```
   using Amazon.CDK;
   using Amazon.CDK.AWS.Lambda;
   using Amazon.CDK.AWS.Logs;
   using Constructs;
   
   namespace CdkTest
   {
       public class HelloWorldStack : Stack
       {
           internal HelloWorldStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)
           {
               var buildOption = new BundlingOptions()
               {
                   Image = Runtime.DOTNET_8.BundlingImage,
                   User = "root",
                   OutputType = BundlingOutput.ARCHIVED,
                   Command = new string[]{
               "/bin/sh",
                   "-c",
                   " dotnet tool install -g Amazon.Lambda.Tools"+
                   " && dotnet build"+
                   " && dotnet lambda package --output-package /asset-output/function.zip"
                   }
               };
   
                var helloWorldLambdaFunction = new Function(this, "HelloWorldFunction", new FunctionProps
               {
                   Runtime = Runtime.DOTNET_8,
                   MemorySize = 1024,
                   LogRetention = RetentionDays.ONE_DAY,
                   Handler = "HelloWorldLambda::HelloWorldLambda.Function::FunctionHandler",
                   Code = Code.FromAsset("./src/HelloWorldLambda/src/HelloWorldLambda", new Amazon.CDK.AWS.S3.Assets.AssetOptions
                   {
                       Bundling = buildOption
                   }),
               });
           }
       }
   }
   ```

   これは、アプリケーションコードをコンパイルしてバンドルするコードであり、Lambda 関数自体の定義でもあります。この `BundlingOptions` オブジェクトにより、zip ファイルの内容を生成するために使用される一連のコマンドと共に zip ファイルを作成できます。この場合、`dotnet lambda package` コマンドは zip ファイルのコンパイルと生成に使用されます。

1. アプリケーションをデプロイするには、次のコマンドを実行します。

   ```
   cdk deploy
   ```

1. .NET Lambda CLI を使用して、デプロイした Lambda 関数を呼び出します。

   ```
   dotnet lambda invoke-function HelloWorldFunction -p "hello world"
   ```

1. テストの完了後、作成したリソースは、保持することを希望しない限り削除できます。リソースを削除するには、次のコマンドを実行します。

   ```
   cdk destroy
   ```

## 次のステップ
<a name="csharp-package-cdk-next"></a>

AWS CDK を使用し、.NET を使用して Lambda 関数を構築し、デプロイする方法については、以下のリソースを参照してください。
+ [C\$1 で AWS CDK を操作](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-csharp.html)
+ [Build, package, and publish .NET C\$1 Lambda functions with the AWS CDK](https://aws.amazon.com/blogs/modernizing-with-aws/build-package-publish-dotnet-csharp-lambda-functions-aws-cdk/)