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:

速攻でメモできる QuickNote リリースしました!

QuickNoteは動作が超軽量でサクサクかけるノートアプリです。一瞬の閃きを逃さずにノートを開き書き始めることができます。 アカウント登録も不要です。お試しあれ!

Excel操作をコマンドで! proBoarderExcel

Excelはマウスで操作するのが基本ですが、マウス操作に疲れてはいませんか? キーボードでExcel操作ができるようになるアプリです。オープンソースで無料です。

積み上げ! Daily Stack リリースしました!

Daily Stack は日々の積み上げを管理するToDoアプリです。過去の積み上げの振り返りだけでなく、ツイート機能もあります。 アカウント登録不要ですぐに使い始めることができます。

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱