AWS

【AWS Lambda入門】全サポート言語で簡単な関数を作成してみた

d

AWS Lambdaでサポートされている言語

2020年3月29日現在、AWS Lambdaでは 最新のサポート対象 として以下の言語が挙がっています。

  • .NET Core 2.1(C#/PowerShell)
  • Go 1.x
  • Java 11
  • Node.js 12.x
  • Python 3.8
  • Ruby 2.7

※上記のうち、AWSコンソール上で直接コードを記述できるのはNode.js, Python, Rubyのみ

今回は、AWS Lambdaでサポートされている全言語で関数を実装していきます。

処理内容は、以下のJSON形式のeventを受け取るとHello Daisaku Hazui! と出力する、というものです。

{
  "firstName": "Daisaku",
  "lastName": "Hazui"
}

それでは1つずつ関数を作成してAWS Lambdaにデプロイしていきましょう。

.NET Core 2.1(C#/PowerShell)

開発環境にAWS Tools for PowerShellをインストール

LinuxまたはmacOSのPCにAWS Tools for PowerShellをインストールする方法は2つあります。

ユーザーガイド PowerShell用AWSツール

今回はAWS.Toolsをインストールしていきます。

$ pwsh
PowerShell 7.0.0
Copyright (c) Microsoft Corporation. All rights reserved.

https://aka.ms/powershell
Type 'help' to get help.

PS /Users/daisakuhazui/mmmcorp/serverless-blog>Install-Module -Name AWS.Tools.Installer
Untrusted repository
You are installing the modules from an untrusted repository. If you trust this repository, change its InstallationPolicy value by running the Set-PSRepository cmdlet. Are you sure you want to
install the modules from 'PSGallery'?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): A

install the modules from 'PSGallery'?と聞かれるので、Aと入力してEnterキーを押します。

テンプレートから関数の雛形を作成

AWS.Toolsがインストールできたら、関数テンプレートの一覧を取得してみましょう。

PS /Users/daisakuhazui/mmmcorp/serverless-blog> Get-AWSPowerShellLambdaTemplate

Template                     Description
Basic                        Bare bones script
CloudFormationCustomResource PowerShell handler base for use with CloudFormation custom resource events
CodeCommitTrigger            Script to process AWS CodeCommit Triggers
DetectLabels                 Use Amazon Rekognition service to tag image files in S3 with detected labels.
KinesisStreamProcessor       Script to be process a Kinesis Stream
S3Event                      Script to process S3 events
S3EventToSNS                 Script to process SNS Records triggered by S3 events
S3EventToSNSToSQS            Script to process SQS Messages, subscribed to an SNS Topic that is triggered by S3 events
S3EventToSQS                 Script to process SQS Messages triggered by S3 events
SNSSubscription              Script to be subscribed to an SNS Topic
SNSToSQS                     Script to be subscribed to an SQS Queue, that is subscribed to an SNS Topic
SQSQueueProcessor            Script to be subscribed to an SQS Queue

現時点でこれだけのテンプレートがあります。

個々のテンプレートの詳細については省きますが、今回はBasicテンプレートをもとにHelloPowerShellという名前の関数を作成していきます。

PS /Users/daisakuhazui/mmmcorp/serverless-blog> mkdir powershell && cd powershell

PS /Users/daisakuhazui/mmmcorp/serverless-blog/powershell> New-AWSPowerShellLambda -ScriptName HelloPower -Template Basic

PS /Users/daisakuhazui/mmmcorp/serverless-blog/powershell> tree
.
└── HelloPowerShell
    ├── HelloPowerShell.ps1
    └── readme.txt

これで関数の雛形が作成されました。

関数の修正

次にお好きなエディタでHelloPowerShell.ps1を開き、最下部に下記のコードを追加していきます。

$firstName = $LambdaInput.FirstName
$lastName = $LambdaInput.LastName

Write-Output ("Hello {0} {1}!" -f $firstName, $lastName)

$LambdaInputが入力値を受け取り、$firstName$lastNameにそれぞれ値が格納されます。

Write-Outputによって、最終的に"Hello Daisaku Hazui!"と出力してくれます。

関数のデプロイ

関数を修正したらAWS Lambdaにデプロイしていきましょう。

以下のコマンドを実行します。

PS /Users/daisakuhazui/mmmcorp/serverless-blog/powershell/HelloPowerShell> Publish-AWSPowerShellLambda -ScriptPath .HelloPowerShell.ps1 -Name HelloPowerShell -Region ap-northeast-1 -Profile DaisakuHazui

デプロイ中にSelect IAM Role that to provide AWS credentials to your code:と聞かれるので、***Create new IAM Role ***に該当する数字を入力しましょう。

Enter name of the new IAM Role:と聞かれたらHelloPowerShellRoleと入力します。

関数をテストする

AWSコンソールからLambdaを開きます。

関数の一覧から、先ほど作成したHelloPowerShellを選択したら早速動作テストしてきましょう。

関数の詳細画面右上のテストイベントの設定を選択し、テストイベントを下記のように修正して保存します。

{
  "firstName": "Daisaku",
  "lastName": "Hazui"
}

保存できたらテストをクリックして、成功したら実行結果のログを確認してみましょう。

関数の実行結果として"Hello Daisaku Hazui!"が返ってきているはずです。

Go 1.x

関数を作成

※Go言語は1.11以前の場合、GOPATHを意識したディレクトリにGoファイルを作成する必要があります。ご自身の開発環境に合ったディレクトリに配置してください。

main.goというファイルを作成し、以下のように記述します。

package main

import (
    "context"
    "fmt"
    "github.com/aws/aws-lambda-go/lambda"
)

type MyEvent struct {
    FirstName string json:"firstName"
    LastName  string json:"lastName"
}

func HandleRequest(ctx context.Context, name MyEvent) (string, error) {
    return fmt.Sprintf("Hello %s %s!", name.FirstName, name.LastName), nil
}

func main() {
    lambda.Start(HandleRequest)
}

eventを受け取るためにMyEventという構造体を定義し、main()からHandleRequestを呼び出して目的の文字列を出力させています。

import内のモジュールですが、必要に応じてお使いの依存管理モジュールでインストールしてください。

関数をデプロイする

先ほど作成したGoファイルを実行可能な状態にコンパイルした上で、ZIPファイルとしてデプロイパッケージを作成していきます。

$ GOOS=linux GOARCH=amd64 go build -o main

$ zip main.zip ./main

デプロイパッケージを作成したら、AWSコンソール上でランタイムがGoの関数を作成し、関数パッケージから上記のZIPファイルをアップロードします。

関数をテストする

ZIPファイルが正常にアップロードできたら関数をテストしていきましょう。

関数の詳細画面右上のテストイベントの設定を選択し、テストイベントを下記のように修正して保存します。

{
  "firstName": "Daisaku",
  "lastName": "Hazui"
}

保存できたらテストをクリックして、成功したら実行結果のログを確認してみましょう。

関数の実行結果として"Hello Daisaku Hazui!"が返ってきているはずです。

Java 11

ディレクトリとファイルの作成

下記のようなディレクトリ構成になるようファイルを作成します。

java-lambda
├── pom.xml
└── src
    └── main
        └── java
            └── com
                └── example
                    ├── HelloWorld.java
                    └── Request.java

ファイルを作成できたら、Request.javaを下記のように修正します。

package com.example;

public class Request {
    String firstName;
    String lastName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Request(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public Request() {
    }
}

次に、Hello.javaを下記のように修正します。

package com.example;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

import java.util.HashMap;
import java.util.Map;

//   /**
//    * AWS Lambda のハンドラーメソッド
//    *
//    * @param input   入力データ
//    * @param context AWS Lambda Context オブジェクト
//    * @return 出力データ
//    */
public class Hello implements RequestHandler<Request, String> {

    public String handleRequest(Request request, Context context) {
        String greetingString = String.format("Hello %s %s !", request.firstName, request.lastName);
        return greetingString;
    }
}

最後に、pom.xmlを下記のように修正します。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>lambda-hello-world</artifactId>
  <packaging>jar</packaging>
  <version>1.0</version>
  <name>lambda-hello-world</name>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-lambda-java-core</artifactId>
      <version>1.2.0</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.1</version>
        <configuration>
          <createDependencyReducedPom>false</createDependencyReducedPom>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

</project>

関数をデプロイする

Hello.java, Request.java, pom.xmlの修正が完了したら、AWS LambdaにデプロイするJARファイルを作成します。

先程作成したディレクトリ中の、java-lambda直下で以下のコマンドを実行していきましょう。

$ mvn package

$ ls -l target/*.jar
-rw-r--r--  1 daisakuhazui  staff  10535  3 29 12:34 target/lambda-hello-world-1.0.jar
-rw-r--r--  1 daisakuhazui  staff   3164  3 29 12:34 target/original-lambda-hello-world-1.0.jar

今回、AWS Lambdaにデプロイするのはlambda-hello-world-1.0.jarの方です。

AWSコンソールからランタイムがJava11のLambda関数を作成し、関数パッケージからlambda-hello-world-1.0.jarをアップロードします。

関数をテストする

JARファイルが正常にアップロードできたら関数をテストしていきましょう。

これまでと同様に、関数の詳細画面右上のテストイベントの設定を選択し、テストイベントを下記のように修正して保存します。

{
  "firstName": "Daisaku",
  "lastName": "Hazui"
}

保存できたらテストをクリックして、成功したら実行結果のログを確認してみましょう。

今回も、関数の実行結果として"Hello Daisaku Hazui!"が返ってきます。

AWSコンソール上でインライン編集可能な言語

ここまで .NET Core 2.1(C#/PowerShell), Go 1.x, Java 11についてご紹介してきました。

これからご紹介する Node.js, Python, Rubyについては、ローカル開発環境で関数コードを用意する必要がありません。AWSコンソール上でLambda関数を作成後、そのまま関数コードをインライン編集することができるからです。

動作テストについてはこれまでと同様に、テストイベントの設定から以下をイベントとして設定して頂ければOKです。AWSコンソール上のテストをクリックすると関数の出力結果が表示されます。

Node.js 12.x

AWSコンソールでLambda関数を作成時に、ランタイムNode.js 12.xを選択してください。

関数が作成できたら、自動生成されているindex.jsを下記のように修正します。

exports.handler = async (event, context) => {
    return 'Hello ' + event.firstName + ' ' + event.lastName;
};

Python 3.8

AWSコンソールでLambda関数を作成時に、ランタイムPython 3.8を選択すると、lambda_function.pyというファイルが自動生成されています。

上記ファイルを以下のように修正してください。

def lambda_handler(event, context):
    message = 'Hello {} {}!'.format(event['firstName'],
                                    event['lastName'])
    return message

Ruby 2.7

Ruby 2.7をランタイムに選択した場合も、Lambda関数をインライン編集する事が可能です。

Rubyの場合、lambda_function.rbというファイルが自動生成されているので、以下のように修正してください。

require 'json'

def lambda_handler(event:, context:)
    first_name = event["firstName"]
    last_name = event["lastName"]
    return "Hello #{first_name} #{last_name}!"
end

おわりに

以上、AWS Lambdaでサポートされている全言語について、簡単な文字列を返す関数を実装していきました。

参考にして頂ければ幸いです。

AUTHOR
d
d
記事URLをコピーしました