見出し画像

Nuxt.js を サーバーレス(AWS Lambda)で動かす

Nuxt.js を AWS Lambda で動かすための設定などについて説明します。 

事前準備

AWS SAM (AWS Serverless Application Model) を用いてサーバーレス環境を構築していきます。
事前に、AWS SAM CLI をインストールしておきます。

概要

すでに作成済みの Nuxt.js アプリをベースに、サーバーレス環境を構築していきます。

  • nuxt.config.ts の設定追加

  • template.yaml の追加

  • samconfig.toml の追加(任意)

早速、デプロイして動かしてみたいという方は、下記のリポジトリを用意してますので、git clone してみてください。

nuxt.config.ts の設定追加

下記のように nuxt.config.ts を記述します。
ポイントをざっと列挙すると以下のようになります。

  • nitro.preset に aws-lambda を指定

  • inlineDynamicImports: true にすることでパフォーマンスが改善できることがあるらしい(こちらを参照)(任意)

  • 画像など静的ファイルも一緒にデプロイしたい場合(任意)

// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
  nitro: {
    inlineDynamicImports: true,
    preset: 'aws-lambda',
    serveStatic: true,
    output: {
      publicDir: '.output/server',
    }
  }
})

template.yaml の追加

下記のように template.yaml を記述します。
ポイントをざっと列挙すると以下のようになります。

  • CodeUri に .output/server を指定

  • Handler に index.handler を指定

# template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  nuxtjs-lambda
  SAM Template for Nuxt.js on AWS

Parameters:
  StackFamily:
    Type: String
    Default: nuxtjs-lambda-app

Globals:
  Function:
    Timeout: 3
    Tracing: Active

Resources:
  NuxtFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: .output/server
      Handler: index.handler
      Runtime: nodejs20.x
      MemorySize: 512
      Timeout: 30
      Architectures:
        - x86_64
      FunctionUrlConfig:
        AuthType: NONE

Outputs:
  NuxtFunction:
    Value: !GetAtt NuxtFunction.Arn
    Export:
      Name: !Sub "${StackFamily}-nuxt-function-arn"

  NuxtFunctionUrl:
    Value: !GetAtt NuxtFunctionUrl.FunctionUrl
    Export:
      Name: !Sub "${StackFamily}-nuxt-function-url"

samconfig.toml の追加(任意)

samconfig.toml は SAM CLI コマンドのパラメータを記述できるファイルですが、初回デプロイ時に作成されるので、あらかじめ作成しなくてもOKです。

デプロイ

下記のように sam deploy --guided すると、デプロイできるはずです。

# bash
$ sam deploy --guided --profile=${AWS_PROFILE}

デプロイが完了すると、下記のように Lambda URL が出力されるのでアクセスしてみます。

CloudFormation outputs from deployed stack
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Outputs                                                                                                                                                                                                                                        
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Key                 NuxtFunctionUrl                                                                                                                                                                                                            
Description         -                                                                                                                                                                                                                          
Value               https://{LAMBDA_URL_ID}.lambda-url.{AWS_REGION}.on.aws/                                                                                                                                                 

Key                 NuxtFunction                                                                                                                                                                                                               
Description         -                                                                                                                                                                                                                          
Value               arn:aws:lambda:{AWS_REGION}:{AWS_ACCOUNT_ID}:function:nuxtjs-lambda-app-NuxtFunction-{FUNCTION_ID}                                                                                                                            
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Successfully created/updated stack - nuxtjs-lambda-app in {AWS_REGION}

下記のように、トップページが表示されればOKです。

Next.js との違い

Next.js については、こちらを参照してください。
Next.js と異なるポイントは以下のとおりです。

おわりに

Next.js と比べると、AWS SAM 側のサポートも弱い気がしますが、
何よりサーバーレスにしておくと、サーバーを常時起動するよりも低コストで運用できるのが魅力ですね。

何か質問などありましたら、@yields_llc にコメントいただければ幸いです。
ではでは。

参考リンク