C#で簡単にAWS Lambda 関数を作成して実行する方法

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です。

そのほかのリージョンとコードは以下のページに記載されています。

https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html

ソースコードを少し修正

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対応ですので、まずはサンプルをダウンロードして何が書かれているか確認してはいかがでしょうか。

カテゴリー: AWS

コメントを残す

メールアドレスが公開されることはありません。