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

# はじめに
Terraformで今後インフラの構築を行うので、手始めとしてLambdaを作ってみました。

### そもそも「Terraformの書き方がわからん...」って話をしてみる
Lambdaの構築を行う前にQiitaやZennなど、いくつかの記事を見てみました。
しかし、どの記事を見ても「なんでこのパラメータが必要ななんだ...?」と疑問に思ってしまい、Terraformってみんなどういう風に書いていってるかが全然わかりませんでした。
なので、自分のやり方としては、はじめにAWSコンソールで構築してみたり、公式ドキュメントを見ながら、これが「必須パラメータなんだな」とか参考にしていました。
なので、以下の記事に不適切な書き方?が載ってるかもしれないのでコメントで教えていただけると助かります！！！

# 本編
### やること
- Lambda関数はzip形式にしてアップロード
- Lambdaを構築してから関数URLを作成する
- CURLコマンドで動作を確認

## 環境
``` bash
$ 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
``` 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
``` tf
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
``` js
exports.handler = async (event) => {
  return "Hello from Lambda";
};
```
単純に"Hello from Lambda"を返すものにしました。


### 実行結果
``` bash
$ terraform apply
(中略)

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
```
![スクリーンショット 2024-08-24 16.59.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2058976/47a8b4f6-44d1-d115-359d-79effe2fd7ed.png)
うん、OK!!!

### 関数URLの作成
こちら参照しました
https://registry.terraform.io/providers/hashicorp/aws/5.4.0/docs/resources/lambda_function_url
#### aws_lambda.tfに以下追記する
``` 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を追加しました。

## 実行結果
``` bash
$ terraform apply
(中略)

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Outputs:

function_url = "https://pvhcr3rm5zap6ynkv33jrv6jhu0vwqvz.lambda-url.ap-northeast-1.on.aws/"
(base) 
```

## 呼び出しみると...

``` bash
$ curl https://pvhcr3rm5zap6ynkv33jrv6jhu0vwqvz.lambda-url.ap-northeast-1.on.aws/
Hello from Lambda
```
Lambdaからかえってきたああぁぁぁ！
構築できました！！
(記事投稿前にLambdaは削除しております)

## 感想
正直まだまだよくわかってないことが多い(ポリシーとか...)
とりあえず、TerraformでLambdaを構築できたのはよかった
今後はパラメータについて深く理解していきたい