【AWS Lambda入門】全サポート言語で簡単な関数を作成してみた
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つあります。
今回は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でサポートされている全言語について、簡単な文字列を返す関数を実装していきました。
参考にして頂ければ幸いです。