100 lines
2.4 KiB
Markdown
100 lines
2.4 KiB
Markdown
# Terraform Lambda Deployment
|
|
|
|
## Terraform Lambda Deployment
|
|
|
|
```hcl
|
|
# main.tf
|
|
terraform {
|
|
required_providers {
|
|
aws = {
|
|
source = "hashicorp/aws"
|
|
version = "~> 5.0"
|
|
}
|
|
}
|
|
}
|
|
|
|
provider "aws" {
|
|
region = var.aws_region
|
|
}
|
|
|
|
# Lambda execution role
|
|
resource "aws_iam_role" "lambda_role" {
|
|
name = "lambda-execution-role"
|
|
|
|
assume_role_policy = jsonencode({
|
|
Version = "2012-10-17"
|
|
Statement = [{
|
|
Action = "sts:AssumeRole"
|
|
Effect = "Allow"
|
|
Principal = {
|
|
Service = "lambda.amazonaws.com"
|
|
}
|
|
}]
|
|
})
|
|
}
|
|
|
|
# CloudWatch Logs policy
|
|
resource "aws_iam_role_policy_attachment" "lambda_logs" {
|
|
role = aws_iam_role.lambda_role.name
|
|
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
|
|
}
|
|
|
|
# S3 Lambda Layer (dependencies)
|
|
resource "aws_lambda_layer_version" "dependencies" {
|
|
filename = "layer.zip"
|
|
layer_name = "nodejs-dependencies"
|
|
compatible_runtimes = ["nodejs18.x"]
|
|
}
|
|
|
|
# Lambda function
|
|
resource "aws_lambda_function" "api_handler" {
|
|
filename = "lambda.zip"
|
|
function_name = "api-handler"
|
|
role = aws_iam_role.lambda_role.arn
|
|
handler = "index.handler"
|
|
runtime = "nodejs18.x"
|
|
timeout = 30
|
|
memory_size = 256
|
|
|
|
layers = [aws_lambda_layer_version.dependencies.arn]
|
|
|
|
environment {
|
|
variables = {
|
|
STAGE = "production"
|
|
DB_HOST = var.database_host
|
|
}
|
|
}
|
|
|
|
depends_on = [aws_iam_role_policy_attachment.lambda_logs]
|
|
}
|
|
|
|
# API Gateway trigger
|
|
resource "aws_lambda_permission" "api_gateway" {
|
|
statement_id = "AllowAPIGatewayInvoke"
|
|
action = "lambda:InvokeFunction"
|
|
function_name = aws_lambda_function.api_handler.function_name
|
|
principal = "apigateway.amazonaws.com"
|
|
}
|
|
|
|
# S3 trigger
|
|
resource "aws_lambda_permission" "s3_trigger" {
|
|
statement_id = "AllowS3Invoke"
|
|
action = "lambda:InvokeFunction"
|
|
function_name = aws_lambda_function.api_handler.function_name
|
|
principal = "s3.amazonaws.com"
|
|
source_arn = aws_s3_bucket.upload_bucket.arn
|
|
}
|
|
|
|
resource "aws_s3_bucket_notification" "bucket_notification" {
|
|
bucket = aws_s3_bucket.upload_bucket.id
|
|
depends_on = [aws_lambda_permission.s3_trigger]
|
|
|
|
lambda_function {
|
|
lambda_function_arn = aws_lambda_function.api_handler.arn
|
|
events = ["s3:ObjectCreated:*"]
|
|
filter_prefix = "uploads/"
|
|
filter_suffix = ".jpg"
|
|
}
|
|
}
|
|
```
|