10
2

More than 1 year has passed since last update.

Serverless FrameworkとDockerでLambda環境を構築する

Last updated at Posted at 2023-08-17

概要

Lambdaを今まであまり使ってこなかったので勉強ついでにローカル実行とデプロイまで一通りできる環境を構築したいと思います。

前提条件

  • Dockerがインストール済みであること
  • Awsアカウントを作成済みでアクセスキー、シークレットキーを発行済みであること

コンソールから関数を作ってみる

まずはどんなものかコンソールから関数を作ってみる。

1. 関数の作成

Lambda > 関数に遷移 > 関数の作成

スクリーンショット 2023-08-15 20.35.21.png

ランタイム: Node.js 18.x
アーキテクチャ: arm64

で作成しました。

2. コード作成

export const handler = async (event) => {
  // TODO implement
  const response = {
    statusCode: 200,
    body: JSON.stringify('hello world !!'),
  };
  return response;
};

とりあえず「hello world !!」だけ直してDeploy。

3. テスト

テストタブに移動してテストボタンを押下
スクリーンショット 2023-08-15 21.02.02.png
いけてるっぽい。簡単だね!

Node.jsのローカル実行環境を用意する

1. Node.jsのバージョンを確認

さっきのLambda関数にバージョン表示を仕込む

console.log(process.versions);

結果
スクリーンショット 2023-08-15 22.18.34.png
18.16.1とのこと

2. Docker設定

Dockerfileを作成

FROM node:18.16.1-alpine

# アプリケーションディレクトリを作成する
WORKDIR /usr/src

RUN apk update && apk add git

docker-compose.ymlを作成

version: "3.9"

services:
  app:
    tty: true
    build: ./
    volumes:
      - .:/usr/src
    ports:
      - 12345:3000

実行する

docker compose up -d

コンテナに入って確認

docker compose exec app ash
node -v 

結果
スクリーンショット 2023-08-15 22.24.43.png
OK!

serverlessを設定

Serverless Frameworkなるものがあるらしい。Lambda関数のデプロイやローカル実行などが可能とのことなので入れてみる。前提としてNode.jsが必要だが上記で構築済み

1. インストール

コンテナに入った状態でグローバルインストール

npm install -g serverless
serverless -v

スクリーンショット 2023-08-17 0.00.02.png
いけてそう

2. serverlessコマンドで各種設定

serverless

具体的には以下。
スクリーンショット 2023-08-15 22.43.48.png
この時にAwsのキーを設定する。以下のファイルが作成されて追加される。今回はコンテナ内で構築してるので破棄したら消えます。永続化しないとね...

~/.aws/credentials

serverlessコマンドで設定が終わると以下のファイルが作成される

├── {projectName}/
│   ├── .gitignore
│   ├── index.js
│   ├── serverless.yml
│   └── README.md 

3. serverless.ymlを修正

デフォルトからいくつか調整

service: houshima-devel-video-uploader
frameworkVersion: '3'

provider:
  name: aws
  region: ap-northeast-1
  runtime: nodejs18.x
  stage: beta

functions:
  handle:
    handler: index.handler

ローカルで実行

作成されたindex.jsはこんな感じ

module.exports.handler = async (event) => {
  return {
    statusCode: 200,
    body: JSON.stringify(
      {
        message: 'Go Serverless v3.0! Your function executed successfully!',
        input: event,
      },
      null,
      2
    ),
  };
};

ローカルで実行するコマンドは以下

sls invoke local --function handle

実行結果
スクリーンショット 2023-08-17 0.23.34.png
いけてるね!

デプロイ

以下がコマンド

sls deploy

実行結果
スクリーンショット 2023-08-17 0.40.34.png
コンソール
スクリーンショット 2023-08-17 0.29.03.png
できた!

※ちなみにプロジェクト名など含めて長すぎるとエラーになります。
スクリーンショット 2023-08-17 0.31.23.png

まとめ

今回の全体像としてはこんな感じ

├── {projectName}/
│   ├── .gitignore
│   ├── index.js
│   ├── serverless.yml
│   └── README.md 
├── docker-compose.yml
├── Dockerfile
└── README.md 

Lambdaのローカル開発環境とデプロイの仕組みを少ない工数で実装することができました。

最後に運動通信社について

運動通信社は「日本を世界が憧れるスポーツ大国にする」というビジョンを達成するべく、一緒に働く仲間を募集しています!
PMやアプリエンジニア、Webエンジニアなど色んな職種を募集しておりカジュアル面談大歓迎なので是非採用フォームよりご連絡ください!
ぜひ一緒に、自分たちも世の中もワクワクするサービスを作りましょう!

Greenも活用中です

10
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
2