TerraformでAWS Lambda関数を作成する方法：シンプルな実装ガイド

## はじめに

AWSのサーバーレスコンピューティングサービスであるLambdaは、アプリケーション開発において非常に強力なツールです。本記事では、Terraformを使用してAWS Lambda関数を簡単に作成する方法を、aws-terraform-sandboxプロジェクトのs04_simple_lambdaサンプルを参考に解説します。

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">「Terraform構成可視化要件定義書」を使って<br>AWS Lambdaにデビュー！！<br>まだ始めてだからシンプルな構成だけどこれからアップデートしてきたい！！ <a href="https://t.co/t1vLENruw3">https://t.co/t1vLENruw3</a> <a href="https://t.co/xmxRcxvR3M">pic.twitter.com/xmxRcxvR3M</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1822625931741348193?ref_src=twsrc%5Etfw">August 11, 2024</a></blockquote> 

## プロジェクト構成

まず、プロジェクトの基本構成を確認しましょう。

```bash
s04_simple_lambda/
├── main.tf
├── variables.tf
├── terraform.tfvars
├── client.py
└── lambda/
    └── test/
        └── src/
            └── test_terraform.py
```

## Terraform設定ファイル

### 3.1 main.tf

`main.tf`は、Terraformプロジェクトの中心となるファイルです。ここでは、Lambda関数とそれに関連するAWSリソースを定義します。

```hcl
provider "aws" {
  region = var.aws_region
}

resource "aws_lambda_function" "test_terraform" {
  function_name    = "test_terraform"
  filename         = data.archive_file.test_terraform.output_path
  source_code_hash = data.archive_file.test_terraform.output_base64sha256
  runtime          = "python3.9"
  role             = aws_iam_role.lambda.arn
  handler          = "test_terraform.handler"

  environment {
    variables = {
      ENVIRONMENT = var.environment
    }
  }
}

# その他のリソース定義（VPC、サブネット、セキュリティグループなど）
```

### 3.2 variables.tf

`variables.tf`では、プロジェクトで使用する変数を定義します。

```hcl
variable "aws_region" {
  description = "The AWS region to deploy resources in"
  type        = string
}

variable "project_name" {
  description = "The name of the project"
  type        = string
}

# その他の変数定義
```

### 3.3 terraform.tfvars

`terraform.tfvars`で、`variables.tf`で定義した変数に具体的な値を設定します。

```hcl
aws_region           = "ap-northeast-1"
project_name         = "simple-lambda-demo"
vpc_cidr             = "10.0.0.0/16"
public_subnet_cidr   = "10.0.1.0/24"
private_subnet_cidr  = "10.0.2.0/24"
lambda_function_name = "simple-lambda-demo_test_lambda"
environment          = "dev"
```

## Lambda関数の実装

Lambda関数の実装は`lambda/test/src/test_terraform.py`で行います。

```python
import json

def handler(event, context):
    print('test')
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
```

## デプロイ手順

Lambda関数をデプロイするには、以下の手順を実行します：

1. Terraformの初期化：
```bash
terraform init
```

1. 実行プランの確認：
```bash
terraform plan
```

1. リソースのデプロイ：
```bash
terraform apply
```

## Lambda関数の呼び出し

デプロイしたLambda関数を呼び出すには、`client.py`スクリプトを使用します：

```python
import boto3
import json

def invoke_lambda():
    lambda_client = boto3.client('lambda', region_name='ap-northeast-1')
    response = lambda_client.invoke(
        FunctionName='test_terraform',
        InvocationType='RequestResponse',
        Payload=json.dumps({})
    )
    return json.loads(response['Payload'].read())

if __name__ == "__main__":
    result = invoke_lambda()
    print(result)
```

## リソースの削除

プロジェクトが不要になった場合は、以下のコマンドでリソースを削除できます：

```bash
terraform destroy
```

## まとめ

本記事では、Terraformを使用してAWS Lambda関数を簡単に作成する方法を解説しました。この方法を利用することで、インフラストラクチャをコードとして管理し、効率的にサーバーレスアプリケーションを開発することができます。

Terraformとの組み合わせにより、Lambda関数の作成、更新、削除が簡単になり、開発者の生産性が向上します。また、バージョン管理システムと組み合わせることで、インフラストラクチャの変更履歴も簡単に追跡できます。

このアプローチを活用して、より効率的なクラウドネイティブアプリケーションの開発に取り組んでみてください。

## リポジトリ

https://github.com/Sunwood-ai-labs/aws-terraform-sandbox/tree/main/sandbox/s04_simple_lambda


<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>