【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の実行ログを貯める方法を以下の記事で解説します。