0
0

【Terraform初心者】Lambdaの関数URLを構築してみた

Last updated at Posted at 2024-08-24

はじめに

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.

スクリーンショット 2024-08-24 16.59.29.png
うん、OK!!!

関数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を構築できたのはよかった
今後はパラメータについて深く理解していきたい

0
0
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
0
0