lulu

【AWS lambda】Terraformでnode_modulesを含むlambda関数を作る方法

やること

node_modulesを含んだlambda関数をTerraformから作成する

ファイル構成

$ tree .
.
├── index.js
└── main.tf
  • index.jsにlambda関数のメインの処理を
  • main.tfにterraformのコードを書いていきます

lambda関数を作成する

index.js

exports.handler = (event, context, callback) => {
  const request = require('request')
  
  function requestAgent(params) {
    return new Promise((resolve, reject) => {
      request(params, (err, res, body) => {
        err ? reject('error') : resolve(body)
      })
    })
  }
  
  (async function() {
    try {
      const getBody = await requestAgent({
        method: 'GET',
        url: 'https://magical-academia.com'
      })
      console.log(getBody)
    } catch(e) {
      console.log(e)
    }
  })();
}

index.jsを編集して、私のサイトをGETするスクリプトを書きました。
request moduleをrequireしているので、以下のコマンドでパッケージをinstallします。

npm i request

そうすると、node_modulesのディレクトリとpackage.lock.jsonが作成されて、以下のディレクトリ構成になります。

$ tree .
.
├── index.js
├── main.tf
├── node_modules
└── package.lock.json

これでlambda関数の作成は完了です。このファイル一式をawsにアップロードして、lambdaを実行すれば、このサイトのbodyが取得できます。

Terraform

次にTerraformを利用して、先程作成したjsのlambda関数をawsに反映します。

アップロード用のファイルを作成する

先程作ったindex.jsファイルとnode_modulesをterraformでアップロードできるように圧縮します。

$ zip -r ./lambda.zip .

このコマンドで必要なファイル一式がlambda.zipに格納されました。このファイルをアップロードすれば、lambda関数として、index.jsが実行されます。

main.tfを編集する

main.tfファイルを編集していきます。

provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_iam_role" "iam_for_lambda" {
  name = "iam_for_lambda_afasdasdf"

  assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
EOF
}

resource "aws_lambda_function" "test_lambda" {
  filename      = "lambda.zip"
  function_name = "lambda_function_name"
  role          = aws_iam_role.iam_for_lambda.arn
  handler       = "index.handler"
  source_code_hash = filebase64sha256("lambda.zip")
  runtime = "nodejs14.x"

  timeout = 30
}

以上がterraformの処理になります。lambda関数の作成とlambdaの実行ロールの作成をしているだけです。

反映

$ terraform init
$ terraform apply

最後に、terraformでawsに反映しましょう。
上記コマンドにて、lambda関数がawsに作成されるので、コンソール画面からテスト実行してみましょう。私のサイトのhtmlが確認できます。
※私のサイトに負荷がかからないように、テストは数回だけにしてください。

logについて

現状の実装では、lambdaの実行ログがcloudwatch logsに堆積されません。
cloudwatch logsにlambdaの実行ログを貯める方法を以下の記事で解説します。

こちら