AWS Lambda とは、クラウド上でプログラムを実行できるサービスです。VPSのようにサーバー自体の実行ではなく、コードの実行になりますので、比較的安価に実行が可能です。
AWS Lambdaは様々なプログラム言語に対応していますが、この記事では、C#を用いて簡単にLambda関数を作成・実行してみたいと思います。
前提
この記事では、 .Net Core SDK 3.1.300 を使用します。
> dotnet --list-sdks
3.1.300 [C:\Program Files\dotnet\sdk]
.Net Core テンプレートのインストール
以下のコマンドを実行して、AWS Lambda に関連する.Net Core テンプレートをインストールします。
dotnet new -i Amazon.Lambda.Templates
dotnet new
コマンドを実行して、Lambdaに関するテンプレートが選択可能になっていることを確認します。
.Net Core CLI ツールのインストール
以下のコマンドを実行して、AWS .Net Core CLI ツールをインストールします。
dotnet tool install -g Amazon.Lambda.Tools
インストール済みの場合は、以下のコマンドでアップデートします。
dotnet tool update -g Amazon.Lambda.Tools
アップデートすると、以下のような出力が帰ってきます。
c:\jwork\@Programming\LambdaFunction2>dotnet tool update -g Amazon.Lambda.Tools
ツール 'amazon.lambda.tools' が安定した最新バージョン (バージョン '4.0.0') で再インストールされました。
lambda.EmptyFunction の生成
ディレクトリを作成して、以下のコマンドで lambda.EmptyFunction
プロジェクトを生成します。
> dotnet new lambda.EmptyFunction
aws-lambda-tools-defaults.json を修正してリージョンを設定
src
ディレクトリ配下にあるaws-lambda-tools-defaults.json
は、デフォルトではリージョンが設定されていません。
{
Information: [
This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.,
To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.,
dotnet lambda help,
All the command line options for the Lambda command can be specified in this file.
],
profile: ,
region: ,
configuration: Release,
framework: netcoreapp3.1,
function-runtime: dotnetcore3.1,
function-memory-size: 256,
function-timeout: 30,
function-handler: LambdaFunction2::LambdaFunction2.Function::FunctionHandler
}
region
を入力します。東京リージョンであればap-northeast-1
です。
そのほかのリージョンとコードは以下のページに記載されています。
ソースコードを少し修正
Lambda関数のソースコードは、src
ディレクトリ内のFunction.cs
になります。
public class Function
{
/// <summary>
/// A simple function that takes a string and does a ToUpper
/// </summary>
/// <param name=input></param>
/// <param name=context></param>
/// <returns></returns>
public string FunctionHandler(string input, ILambdaContext context)
{
return input?.ToUpper();
}
}
文字列 Hello UsefulEdge を返すように変更してみましょう。
public class Function
{
/// <summary>
/// A simple function that takes a string and does a ToUpper
/// </summary>
/// <param name=input></param>
/// <param name=context></param>
/// <returns></returns>
public string FunctionHandler(string input, ILambdaContext context)
{
//return input?.ToUpper();
return Hello UsefulEdge;
}
}
デプロイ
以下のコマンドを実行して、コンパイル・デプロイを行います。
dotnet lambda deploy-function UEEasyLambdaFunction
Amazon Lambda Tools for .NET Core applications (4.0.0)
Project Home: https://github.com/aws/aws-extensions-for-dotnet-cli, https://github.com/aws/aws-lambda-dotnet
Executing publish command
Deleted previous publish folder
... invoking 'dotnet publish', working folder 'c:\jwork\@Programming\LambdaFunction2\src\LambdaFunction2\bin\Release\netcoreapp3.1\publish'
... publish: .NET Core 向け Microsoft (R) Build Engine バージョン 16.6.0+5ff7b0c9e
... publish: Copyright (C) Microsoft Corporation.All rights reserved.
... publish: 復元対象のプロジェクトを決定しています...
... publish: 復元対象のすべてのプロジェクトは最新です。
... publish: LambdaFunction2 -> c:\jwork\@Programming\LambdaFunction2\src\LambdaFunction2\bin\Release\netcoreapp3.1\linux-x64\LambdaFunction2.dll
... publish: LambdaFunction2 -> c:\jwork\@Programming\LambdaFunction2\src\LambdaFunction2\bin\Release\netcoreapp3.1\publish\
Zipping publish folder c:\jwork\@Programming\LambdaFunction2\src\LambdaFunction2\bin\Release\netcoreapp3.1\publish to c:\jwork\@Programming\LambdaFunction2\src\LambdaFunction2\bin\Release\netcoreapp3.1\LambdaFunction2.zip
... zipping: Amazon.Lambda.Core.dll
... zipping: Amazon.Lambda.Serialization.SystemTextJson.dll
... zipping: LambdaFunction2.deps.json
... zipping: LambdaFunction2.dll
... zipping: LambdaFunction2.pdb
... zipping: LambdaFunction2.runtimeconfig.json
Created publish archive (c:\jwork\@Programming\LambdaFunction2\src\LambdaFunction2\bin\Release\netcoreapp3.1\LambdaFunction2.zip).
Creating new Lambda function UEEasyLambdaFunction
ロールの選択メニューが表示されます。作成済みのロールを選択する場合は、表示されている番号を入力して、エンターキーを押します。
新しいロールを作成する場合は、*** Create new IAM Role ***
の番号を入力します。
以下は、ロールを新規作成する方法で説明します。
Select IAM Role that to provide AWS credentials to your code:
1) CodeStarWorker-test-Lambda
2) cognito5f4544ca_userpoolclient_lambda_role-test
3) cognito973c685a_userpoolclient_lambda_role-test
4) cognitobfa13e62_userpoolclient_lambda_role-test
5) cognitoc7fab389_userpoolclient_lambda_role-test
6) cognitof36f5e67_userpoolclient_lambda_role-test
7) execlambda
8) expressAPI-epsagon-dev-ap-northeast-1-lambdaRole
9) insDynamo_lambda
10) jinja-role
11) jinja2_lambda_function
12) jinja3_lambda_function
13) jinja_lambda_function
14) pinpointLambdaRole65a67da6-test
15) pinpointLambdaRole7c56b66f-test
16) serverlesstest-AspNetCoreFunctionRole-9KIO7ZOKP39U
17) SnippetHubExpress-role-z7iuvrsm
18) testFunction-role-h1rj9fw7
19) *** Create new IAM Role ***
19
ロール名称を入力します。
Enter name of the new IAM Role:
UELambdaRole
権限を割り当てるポリシーの番号を入力します。
今回は、1) AWSLambdaFullAccess
を選択しました。
Select IAM Policy to attach to the new role and grant permissions
1) AWSLambdaFullAccess (Provides full access to Lambda, S3, DynamoDB, CloudWatch Metrics and ...)
2) AWSLambdaReplicator
3) AWSLambdaDynamoDBExecutionRole (Provides list and read access to DynamoDB streams and writ ...)
4) AWSLambdaExecute (Provides Put, Get access to S3 and full access to CloudWatch Logs.)
5) AWSLambdaSQSQueueExecutionRole (Provides receive message, delete message, and read attribu ...)
6) AWSLambdaKinesisExecutionRole (Provides list and read access to Kinesis streams and write ...)
7) AWSLambdaReadOnlyAccess (Provides read only access to Lambda, S3, DynamoDB, CloudWatch Met ...)
8) AWSLambdaBasicExecutionRole (Provides write permissions to CloudWatch Logs.)
9) AWSLambdaInvocation-DynamoDB (Provides read access to DynamoDB Streams.)
10) AWSLambdaVPCAccessExecutionRole (Provides minimum permissions for a Lambda function to exe ...)
11) AWSLambdaRole (Default policy for AWS Lambda service role.)
12) AWSLambdaENIManagementAccess (Provides minimum permissions for a Lambda function to manage ...)
13) AWSLambdaBasicExecutionRole-fd1d360b-d71b-490c-9b68-92cdeebb698d
14) AWSLambdaS3ExecutionRole-ad02e503-3504-4e3b-9e60-c39508a72ea0
15) jinja2_lambda_logs
16) AWSLambdaBasicExecutionRole-7b592c56-d633-4490-a833-8d06e361bcfd
17) CodeStar_test_Viewer
18) jinja_lambda_logs
19) AWSLambdaTestHarnessExecutionRole-eccc063a-c0b9-4f8d-871d-12215d9167ba
20) CodeStar_test_Contributor
21) *** No policy, add permissions later ***
1
Waiting for new IAM Role to propagate to AWS regions
............... Done
New Lambda function created
これで、Lambda関数の作成が完了です。
AWS Consoleから、関数が作成されたことを確認します。
テスト
以下のコマンドを実行して、Lambda関数を実行します。
dotnet lambda invoke-function UEEasyLambdaFunction --payload Test
以下のように、Hello UsefulEdge
が表示されれば、成功です。
Amazon Lambda Tools for .NET Core applications (4.0.0)
Project Home: https://github.com/aws/aws-extensions-for-dotnet-cli, https://github.com/aws/aws-lambda-dotnet
Payload:
Hello UsefulEdge
Log Tail:
おすすめ本 c#コードレシピ集
c#コードレシピ集は、「文字列を大文字あるいは小文字に変換したい」や「Taskをキャンセルしたい」など逆引き的にコードの書き方を調べられるレシピ集です。
2021年8月に発売された本で、全部で385個のレシピが収録されています。
ジャンルは日付処理やLINQ、並列処理と非同期処理など幅広く記載されています。
Kindle対応ですので、まずはサンプルをダウンロードして何が書かれているか確認してはいかがでしょうか。
コメント