Photoruction工事中!

Photoructionの開発ブログです!

AWS Lambdaを効率良く開発する!

株式会社フォトラクション WEBチーム所属 下川原です! Photoruction Advent Calendar 2021の6日目の記事です。

この記事ではAWS Lambda for Node.jsを効率良く開発するためのTipsを紹介します!

まずはじめに必要なもの


  • windowsの方はwslなどインストールしておくと吉(コマンドプロンプトプロフェッショナルは、読み替えてください)
  • IDEは自分が馴染むやつ
  • AWSのアカウント

目次


 

初期構築


インストールしておくべきもの

https://aws.amazon.com/jp/cli/

  • AWS SAM CLI (Lambdaをローカルで実行するのに必要)

https://aws.amazon.com/jp/serverless/sam/

  • aws-vault (MFAを使用しているAWSアカウントは、インストールしておくと幸せになる)

https://github.com/99designs/aws-vault#installing

  • makeコマンド(それぞれの環境に合ったインストール)下記はapt例
$ sudo apt install make
$ sudo apt install make-guile

ディレクトリ構成


lambdanodejs 
├── Makefile ※2
├── [Readme.md](<http://readme.md/>) お好きにどうぞ
├── debug-env.json ※3 
├── events
│   └── request-sample.json ※3
├── libs ※4
│   ├── Makefile
│   └── nodejs
│       ├── package-lock.json
│       └── package.json
├── samconfig.toml ※5
├── src ※4
│   └── lambdanodejsMaster
│       ├── lambdanodejsMaster.js
│       └── package.json
└── template.yml ※1

template.yml ※1


AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: AWS Lambda Nodejs

Resources:
   lambdanodejsMaster:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: lambdanodejsMaster
      Role: ${lambdaを実行するロールのARN}
      Handler: lambdanodejsMaster.lambdanodejsHandler
      CodeUri: ./src/lambdanodejsMaster
      Runtime: nodejs14.x
      Timeout: 300
      MemorySize: 128
      Layers:
        - !Ref LibsLayer
      Environment:
        Variables:
          ENV_SAMPLE: SAMPLEDONE
  LibsLayer:
    Type: AWS::Serverless::LayerVersion
    Metadata:
      BuildMethod: makefile
    Properties:
      LayerName: libs
      Description: Libraries
      ContentUri: ./libs
      CompatibleRuntimes:
        - nodejs14.x
      RetentionPolicy: Retain

参考

AWS Lambda テンプレート Cloud Formation

LambdaのMemorySizeによってCPUのスペックが決まる話

AWS Lambda のリソースモデルでは、お客様が関数に必要なメモリ量を指定すると、それに比例した CPU パワーとその他のリソースが割り当てられます。メモリサイズが増えると、関数で利用可能な CPU にも同等の増加が発生します。

makefile ※2


.PHONY: build clean test

LAYER_ARTIFACTS_DIR=.aws-sam/build/LibsLayer
LAYER_NODE_MODULES=$(LAYER_ARTIFACTS_DIR)/nodejs/node_modules

.aws-sam/build.toml: template.yml samconfig.toml src/*.js libs/nodejs/package-lock.json
   sam build

build: .aws-sam/build.toml

deploy:
   make clean
   make build
   sam deploy

clean:
   rm -rf .aws-sam

test:
   cd libs &&ARTIFACTS_DIR=../$(LAYER_ARTIFACTS_DIR)make build-LibsLayer-test
   cd src &&PATH=../$(LAYER_NODE_MODULES)/.bin:${PATH} NODE_PATH=../$(LAYER_NODE_MODULES)npm test

jsonファイル ※3


debug-env.json

ローカル実行時の環境変数ファイル

デプロイするときは必ずtemplate.yamlに記載する

{
  "lambdanodejsMaster": {
    "ENV_SAMPLE": "SAMPLEDONE"
}

request-sample.json

lambda関数に渡すリクエス

nodejs内関数Handlerの第一引数で受け取れる(変数名: event)

{
  "key": "sample value"
}

src ※4


nodejs本体のディレクトリ 詳しいことはnodejsを参考に

Node.js の AWS Lambda 関数ハンドラー

lambdanodejsMaster.js 最低限必要なもの

exports.lambdanodejsHandler = async (event, context, callback) => {
	console.log(event);
	callback(null,event);
}

samconfig.toml ※5


AWS SAM CLI の設定ファイル

例)

version = 1.0
[default]
[default.deploy]
[default.deploy.parameters]
stack_name = "stack"
s3_bucket = "${配置するS3のARN}"
s3_prefix = "${配置するS3のprefix}"
region = "ap-northeast-1"
confirm_changeset = true
capabilities = "CAPABILITY_IAM"

ローカル実行!


# nodejsをビルドする
$ sam build

# ローカル実行
# -n envファイルのパス
# -e 関数へ渡す引数のパス
$ sam local invoke lambdanodejsMaster-n ./debug-env.json -e ./events/request-sample.json

# AWS Lambdaへデプロイをする
$ sam deploy

これで、AWS Lambda関数をローカルで快適にガシガシ開発できます!

よいデベロッパーライフを!

 

株式会社フォトラクションでは一緒に働く仲間を募集しています