はじめに
Terraformで今後インフラの構築を行うので、手始めとしてLambdaを作ってみました。
そもそも「Terraformの書き方がわからん...」って話をしてみる
Lambdaの構築を行う前にQiitaやZennなど、いくつかの記事を見てみました。
しかし、どの記事を見ても「なんでこのパラメータが必要ななんだ...?」と疑問に思ってしまい、Terraformってみんなどういう風に書いていってるかが全然わかりませんでした。
なので、自分のやり方としては、はじめにAWSコンソールで構築してみたり、公式ドキュメントを見ながら、これが「必須パラメータなんだな」とか参考にしていました。
なので、以下の記事に不適切な書き方?が載ってるかもしれないのでコメントで教えていただけると助かります!!!
本編
やること
- Lambda関数はzip形式にしてアップロード
- Lambdaを構築してから関数URLを作成する
- CURLコマンドで動作を確認
環境
$ terraform version
Terraform v1.5.1
on darwin_amd64
+ provider registry.terraform.io/hashicorp/archive v2.5.0
+ provider registry.terraform.io/hashicorp/aws v5.4.0
Your version of Terraform is out of date! The latest version
is 1.9.5. You can update by downloading from https://www.terraform.io/downloads.html
ファイル構成
main.tf
aws_lambda.tf
lamba_function.js
main.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.4.0"
}
}
required_version = "1.5.1"
}
provider "aws" {
region = "ap-northeast-1"
}
aws_lambda.tf
こちら参照しました
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function
data "aws_iam_policy_document" "assume_role" {
statement {
effect = "Allow"
principals {
type = "Service"
identifiers = ["lambda.amazonaws.com"]
}
actions = ["sts:AssumeRole"]
}
}
resource "aws_iam_role" "iam_for_lambda" {
name = "iam_for_lambda"
assume_role_policy = data.aws_iam_policy_document.assume_role.json
}
data "archive_file" "lambda" {
type = "zip"
source_file = "lambda_function.js"
output_path = "lambda.zip"
}
resource "aws_lambda_function" "hello_lambda" {
filename = "lambda.zip"
function_name = "hello-lambda"
role = aws_iam_role.iam_for_lambda.arn
handler = "lambda_function.handler"
source_code_hash = data.archive_file.lambda.output_base64sha256
runtime = "nodejs18.x"
}
lambda_function.js
exports.handler = async (event) => {
return "Hello from Lambda";
};
単純に"Hello from Lambda"を返すものにしました。
実行結果
$ terraform apply
(中略)
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
関数URLの作成
こちら参照しました
https://registry.terraform.io/providers/hashicorp/aws/5.4.0/docs/resources/lambda_function_url
aws_lambda.tfに以下追記する
resource "aws_lambda_function_url" "lambda_function_url" {
function_name = aws_lambda_function.hello_lambda.function_name
authorization_type = "NONE"
}
output "function_url" {
description = "Function URL."
value = aws_lambda_function_url.lambda_function_url.function_url
}
認証タイプはNONE。
terraform apply後に関数URLを知りたいのでoutputを追加しました。
実行結果
$ terraform apply
(中略)
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Outputs:
function_url = "https://pvhcr3rm5zap6ynkv33jrv6jhu0vwqvz.lambda-url.ap-northeast-1.on.aws/"
(base)
呼び出しみると...
$ curl https://pvhcr3rm5zap6ynkv33jrv6jhu0vwqvz.lambda-url.ap-northeast-1.on.aws/
Hello from Lambda
Lambdaからかえってきたああぁぁぁ!
構築できました!!
(記事投稿前にLambdaは削除しております)
感想
正直まだまだよくわかってないことが多い(ポリシーとか...)
とりあえず、TerraformでLambdaを構築できたのはよかった
今後はパラメータについて深く理解していきたい