ローソンデジタルイノベーション テックブログ

ローソンデジタルイノベーション(LDI)の技術ブログです

GO の Lambda関数を Serverless Offline でローカル実行する

はじめまして、LDIで開発をしているOKです。 初投稿になります。

今回紹介するのは、Serverless Framework を利用して、AWS Lambda のプロジェクトの作成から、 AWS環境を利用せずに、ローカルで Lambda + API Gateway を実行するという事をしようと思います。

環境

本記事は以下の環境で作成しています。

  • Mac Book Pro (Intel製チップ)
  • macOS Big Sur
  • Go 1.17

Serverless Framework のインストール

まず、Serverless Framework をインストールします。
次のコマンドを実行してください。

 brew install serverless

インストールが完了したらバージョンを確認してみましょう。
(インストールするタイミングでバージョンは変わると思います)

sls -v

Running "serverless" from node_modules
Framework Core: 3.5.1 (local) 3.4.0 (global)
Plugin: 6.1.2
SDK: 4.3.1

Serverless Framework でプロジェクトを作成

続いて、Serverless Framework でプロジェクトの雛形を作成します。
次のコマンドを実行してください。(samplePJ は任意の名前で)

 sls create -t aws-go-dep -p samplePJ

コマンドを実行すると、samplePJ ディレクトリ配下に幾つかファイルが作成されています。
そのうち、Gopkg.toml というファイルは要らないので削除し、代わりに go.mod ファイルを作成してください。

Serverless offline Pluginインストール

続いて、Lambda と API Gateway をエミュレートしてくれる Serverless Offline プラグインをインストールします。
次のコマンドを実行してください。

 sls plugin install --name serverless-offline

ファイルの編集

今回はGoの実装自体には手を入れず、Serverless Offline でローカル実行することに注力します。

serverless.yml 編集

まず、 serverless.yml を編集します。
コメントは消しましたが、テンプレートで作成されものに対して pluginscustom を追加した以外はそのままです。
大事な事としては、Serverless OfflineGo のプログラムを実行する場合は、Docker を有効にしないと正しく動かないです。10〜12行目で対応しています。
全量は次の通り。

service: samplepj

frameworkVersion: '3'

# serverless-offline プラグイン追加
plugins:
  - serverless-offline

# serverless offline 実行時は Docker で起動するように指定
custom:
  serverless-offline:
    useDocker: true

provider:
  name: aws
  runtime: go1.x


package:
  patterns:
    - '!./**'
    - ./bin/**

functions:
  hello:
    handler: bin/hello
    events:
      - httpApi:
          path: /hello
          method: get
  world:
    handler: bin/world
    events:
      - httpApi:
          path: /world
          method: get

Makefile 編集

続いて、 Makefile を編集します。
テンプレートの初期状態に対して、 build を編集し、 deploy-local を追加しています。
全量は以下となります。

.PHONY: build clean deploy deploy-local

build: clean
    @env GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="-s -w" -o bin/hello hello/main.go
    @env GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="-s -w" -o bin/world world/main.go

clean:
    @rm -rf ./bin

deploy-local: build
    @sls offline

deploy: clean build
    @sls deploy --verbose

以上で準備は完了です。

Serverless Offline でローカル実行

早速次のコマンドを実行します。
 (※ 事前に Docker を起動しておいてください)

 make deploy-local

次のようなログが流れれば成功です。

f:id:ldi-contributor:20220301184101p:plain

ログにあるURL(http://localhost:3000/hello )をブラウザなどで入力して試してください。
次のようにレスポンスが取得できます。

f:id:ldi-contributor:20220302122202p:plain

あとがき

以上でAWS環境なしに、ローカルで Lambda + API Gateway を実行する環境ができたので、 後は必要なLambda関数を作成したり編集したりして手軽に動作確認することができます。